特别说明:该专栏文章均来源自微信公众号《大数据实战演练》,欢迎关注!

一、Sqoop概述

1. 产生背景

基于传统关系型数据库的稳定性,还是有很多企业将数据存储在关系型数据库中;早期由于工具的缺乏,Hadoop与传统数据库之间的数据传输非常困难。基于前两个方面的考虑,需要一个在传统关系型数据库和Hadoop之间进行数据传输的项目,Sqoop应运而生。

2. 简介

Sqoop是一个用于Hadoop和结构化数据存储(如关系型数据库)之间进行高效传输大批量数据的工具。它包括以下两个方面:

  • 可以使用Sqoop将数据从关系型数据库管理系统(如MySQL)导入到Hadoop系统(如HDFS、Hive、HBase)中
  • 将数据从Hadoop系统中抽取并导出到关系型数据库(如MySQL)

Sqoop的核心设计思想是利用MapReduce加快数据传输速度。也就是说Sqoop的导入和导出功能是通过基于Map Task(只有map)的MapReduce作业实现的。所以它是一种批处理方式进行数据传输,难以实现实时的数据进行导入和导出。

二、Sqoop架构

  • 用户向Sqoop发起一个命令之后,这个命令会转换为一个基于Map Task的MapReduce作业。
  • Map Task 会访问数据库的元数据信息,通过并行的Map Task将数据库的数据读取出来,然后导入Hadoop中。
  • 当然也可以将Hadoop中的数据,导入传统的关系型数据库中。
  • 它的核心思想就是通过基于Map Task(只有map)的MapReduce作业,实现数据的并发拷贝和传输,这样可以大大提高效率。

三、Sqoop shell操作

参数描述—connect 指定JDBC连接字符串—username指定连接mysql用户名—password指定连接mysql密码

1. 将Mysql数据导入到Hadoop中

1.1 数据导入到HDFS

参数描述table

将mysql数据库中的hive数据库中的roles表数据导入到HDFS中的/user/lyz/111目录下。执行代码如下:

sqoop import --connect jdbc:mysql://10.6.6.71:3309/hive --username root --password root123 --table roles --target-dir /user/lyz/111 --fields-terminated-by ',' -m 1 --direct

备注:-m参数可以指定map任务的个数,默认是4个。如果指定为1个map任务的话,最终生成的part-m-xxxxx文件个数就为1。在数据充足的情况下,生成的文件个数与指定map任务的个数是等值的。

1.2 数据导入到Hive中

参数描述—hive-import将表导入Hive中—hive-table

将mysql数据库中的hive数据库中的roles表数据导入到Hive数据库中,并生成roles_test表。执行代码如下:

sqoop import --connect jdbc:mysql://10.6.6.71:3309/hive --username root --password root123 --hive-import --table roles --hive-database default --hive-table roles_test --fields-terminated-by ',' -m 1 --direct

备注:-m参数可以指定map任务的个数,默认是4个。如果指定为1个map任务的话,最终生成在/apps/hive/warehouse/ roles_test目录下的part-m-xxxxx文件个数就为1。在数据充足的情况下,生成的文件个数与指定map任务的个数是等值的。

执行数据导入过程中,会触发MapReduce任务。任务执行成功以后,我们访问Hive验证一下数据是否导入成功。

hive> show tables;OKroles_testhive> select * from roles_test;OK1 1545355484 admin admin2 1545355484 public publicTime taken: 0.536 seconds, Fetched: 2 row(s)

数据导入成功。

1.3 数据导入到HBase中

参数描述—column-family 设置导入的目标列族—hbase-row-key 指定要用作行键的输入列;如果没有该参数,默认为mysql表的主键—hbase-create-table如果执行,则创建缺少的HBase表—hbase-bulkload启用批量加载

将mysql数据库中的hive数据库中的roles表数据导入到HBase中,并生成roles_test表。执行代码如下:

sqoop import --connect jdbc:mysql://10.6.6.71:3309/hive --username root --password root123 --table roles --hbase-table roles_test --column-family info --hbase-row-key ROLE_ID --hbase-create-table --hbase-bulkload

关于参数—hbase-bulkload的解释:

实现将数据批量的导入Hbase数据库中,BulkLoad特性能够利用MR计算框架将源数据直接生成内部的HFile格式,直接将数据快速的load到HBase中。

细心的你可能会发现,使用—hbase-bulkload参数会触发MapReduce的reduce任务。

执行数据导入过程中,会触发MapReduce任务。任务执行成功以后,我们访问HBase验证一下数据是否导入成功。

hbase(main):002:0> listTABLE roles_test 1 row(s) in 0.1030 seconds=> ["roles_test"]hbase(main):003:0> scan "roles_test"ROW COLUMN+CELL  1 column=info:CREATE_TIME, timestamp=1548319280991, value=1545355484  1 column=info:OWNER_NAME, timestamp=1548319280991, value=admin  1 column=info:ROLE_NAME, timestamp=1548319280991, value=admin  2 column=info:CREATE_TIME, timestamp=1548319282888, value=1545355484  2 column=info:OWNER_NAME, timestamp=1548319282888, value=public  2 column=info:ROLE_NAME, timestamp=1548319282888, value=public 2 row(s) in 0.0670 seconds

总结:roles_test表的row_key是源表的主键ROLE_ID值,其余列均放入了info这个列族中。

2. 将Hadoop数据导出到Mysql中

Sqoop export工具将一组文件从HDFS导出回Mysql。目标表必须已存在于数据库中。根据用户指定的分隔符读取输入文件并将其解析为一组记录。

默认操作是将这些转换为一组INSERT将记录注入数据库的语句。在“更新模式”中,Sqoop将生成UPDATE替换数据库中现有记录的语句,并且在“调用模式”下,Sqoop将为每条记录进行存储过程调用。

将HDFS、Hive、HBase的数据导出到Mysql表中,都会用到下表的参数:

参数描述—table

2.1 HDFS数据导出至Mysql

首先在test数据库中创建roles_hdfs数据表:

USE test;CREATE TABLE `roles_hdfs` (`ROLE_ID` bigint(20) NOT NULL ,`CREATE_TIME` int(11) NOT NULL ,`OWNER_NAME` varchar(128) DEFAULT NULL ,`ROLE_NAME` varchar(128) DEFAULT NULL ,PRIMARY KEY (`ROLE_ID`))

将HDFS上的数据导出到mysql的test数据库的roles_hdfs表中,执行代码如下:

sqoop export --connect jdbc:mysql://10.6.6.71:3309/test --username root --password root123 --table roles_hdfs --export-dir /user/lyz/111 --input-fields-terminated-by ',' -m 1

执行数据导入过程中,会触发MapReduce任务。任务成功之后,前往mysql数据库查看是否导入成功。

2.2 Hive数据导出至Mysql

首先在test数据库中创建roles_hive数据表:

CREATE TABLE `roles_hive` (`ROLE_ID` bigint(20) NOT NULL ,`CREATE_TIME` int(11) NOT NULL ,`OWNER_NAME` varchar(128) DEFAULT NULL ,`ROLE_NAME` varchar(128) DEFAULT NULL ,PRIMARY KEY (`ROLE_ID`))

由于Hive数据存储在HDFS上,所以从根本上还是将hdfs上的文件导出到mysql的test数据库的roles_hive表中,执行代码如下:

sqoop export --connect jdbc:mysql://10.6.6.71:3309/test --username root --password root123 --table roles_hive --export-dir /apps/hive/warehouse/roles_test --input-fields-terminated-by ',' -m 1

2.3 HBase数据导出至Mysql

目前Sqoop不支持从HBase直接导出到关系型数据库。可以使用Hive周转一下。

2.3.1 创建hive外部表

create external table hive_hbase(id int,CREATE_TIME string,OWNER_NAME string,ROLE_NAME string)stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'with serdeproperties ("hbase.columns.mapping" = ":key,info:CREATE_TIME,info:OWNER_NAME,info:ROLE_NAME")tblproperties("hbase.table.name" = "roles_test");

2.3.2 创建Hive内部表

创建适配于Hive外部表的内部表:

create table if not exists hive_export(id int, CREATE_TIME string, OWNER_NAME string, ROLE_NAME string)row format delimited fields terminated by ',' stored as textfile;

hive_hbase外部表的源是HBase表数据,当创建适配于hive_hbase外部表的Hive内部表时,指定行的格式为',’

2.3.3 将外部表的数据导入到内部表中

insert overwrite table hive_exportselect * from hive_hbase;

2.3.4 创建Mysql表

CREATE TABLE `roles_hbase` (`id` bigint(20) NOT NULL,` create_time` varchar(128) NOT NULL ,` owner_name` varchar(128) DEFAULT NULL ,` role_name` varchar(128) DEFAULT NULL ,PRIMARY KEY (`id`))

2.3.5 执行sqoop export

sqoop export --connect jdbc:mysql://10.6.6.71:3309/test --username root --password root123 --table roles_hbase --export-dir /apps/hive/warehouse/hive_export/ --input-fields-terminated-by ',' -m 1

查看mysql中的roles_hbase表,数据成功被导入。

备注:在创建表的时候,一定要注意表字段的类型,如果指定表类型不一致,有可能会报错。

3. 总结

使用sqoop import/export命令,可以实现将关系型数据库中的数据与Hadoop中的数据进行相互转化,其中一些转化的细节,可以指定参数实现。在执行过程中,sqoop shell操作,会转化为MapReduce任务来实现数据的抽取。

更多的sqoop操作,详情请参见:http://sqoop.apache.org/docs/1.4.6/SqoopUserGuide.html


--END--

码字不易,如果您觉得文章写得不错,请关注作者~ 您的关注是我写作的最大动力

友情提示:原文排版精美,可点击分享链接查看。

hive sqoop 分区导入_Sqoop概述及shell操作相关推荐

  1. hive sqoop 分区导入_使用sqoop将hive分区表的数据导入到mysql的解决方案:shell脚本循环...

    方案1:使用shell脚本进行do while循环,挨个分区输出.从开始的分区一直循环到结束分区即可.本例子为月,若需日,改为%Y-%m-%d即可,-1month改为-1day即可 partition ...

  2. hive sqoop 分区导入_利用oozie,执行sqoop action将DB2中的数据导入到hive分区表中

    测试:利用oozie,执行sqoop action将DB2中的数据导入到hive分区表中. 需要注意的地方: 1,要添加hive.metastore.uris这个参数.否则无法将数据加载到hive表中 ...

  3. sqoop动态分区导入mysql,sqoop 导入数据到hive分区表(外表,内表) 指定分区 指定数据库 指定表...

    sqoop 导入数据到hive 1.1.导入数据到hive分区表(内表),指定分区 创建hive分区表 –hive-database 指定数据库 –table 指定表 –hive-overwrite ...

  4. sqoop动态分区导入mysql,使用sqoop import从mysql往hive含分区表中导入数据的一些注意事项...

    先看下面这条语句,它实现的功能是将特定日期的数据从mysql表中直接导入hive $ sqoop import \ --connect jdbc:mysql://192.168.xx.xx:3306/ ...

  5. 大数据基础(二)hadoop, mave, hbase, hive, sqoop在ubuntu 14.04.04下的安装和sqoop与hdfs,hive,mysql导入导出

    hadoop, mave, hbase, hive, sqoop在ubuntu 14.04.04下的安装 2016.05.15 本文测试环境: hadoop2.6.2 ubuntu 14.04.04 ...

  6. Hadoop离线 day18 sqoop数据迁移和java执行shell命令

    sqoop数据迁移和java执行shell命令 3. sqoop数据迁移 3.1.概述 3.2.sqoop1与sqoop2架构对比 3.3.工作机制 3.4 .sqoop实战及原理 3.4.1 sqo ...

  7. 关于sqoop增量导入oracle的数据到HDFS的出现的错误总结

    今天在将公司的oracle的数据抽取到hive当中,根据时间字段做增量插入,然后合并采用按照id唯一主键的方式进行合并操作. 下面的代码是增量导入的操作shell脚本 #!/bin/bash date ...

  8. sqoop建表_Sqoop基础教程

    1,什么是Sqoop? 官网定义如下: Apache Sqoop 大白话理解:一个用来将数据Hdoop上的数据和结构化存储(数据库数据)实现互相传输的工具 另外注意的是,上面文字最后一行,Sqoop1 ...

  9. sqoop job入门 与sqoop增量导入

    sqoop job命令选项 sqoop job可以封装一些简单的代码,方便调用 可以创建,删除,执行,列出job,以及查看job. Job management arguments:--create ...

最新文章

  1. rand(),srand()产生随机数
  2. java并发策略_Java并发(六):并发策略
  3. JUnit测试方法订购
  4. python 装饰器 三 (带有参数的装饰器)
  5. Java写一个快速排序_快速排序java实现
  6. 简单人物画像_天天谈【用户画像】95%的人根本不知道自己在说什么
  7. 如何编制试算平衡表_试算平衡表的编制
  8. python3 写九九乘法表(python 小白进阶之旅)
  9. 如何在 Keras 中开发具有注意力的编码器-解码器模型
  10. ES6学习笔记一(var let const三者区别)
  11. 2017年计算机期刊目录,【2017年整理】核心期刊目录一览表.doc
  12. linux tomcat war解压吗,Tomcat 何时解压war包
  13. ftp 创建工具下载,三款ftp 创建工具下载-免安装版(亲测)
  14. 经验分享 针式打印机经典案例分析
  15. 计算机音乐苹果铃声,苹果铃声设置歌曲 苹果铃声怎么设置自己的歌
  16. Java程序设计 北京大学 2019冬期末测验
  17. FBReader导入eclipse 和Androidstudio相关问题
  18. (白光LED显色性)计算白光LED的显色指数(CRI)数据异常,色质指数CQS来替代
  19. 计算机模拟技术在高分子领域的应用,模拟技术的原理、方法及在高分子材料研究中的应用...
  20. 向所有苦苦拼搏的而立之年的男人们推荐这个电影《老男孩》

热门文章

  1. pyg2plot_画图
  2. 最全Pycharm教程(43)——Pycharm扩展功能之UML类图使用 代码结构
  3. pytorch之Tensor与Variable的区别
  4. Lock、ReentrantLock、ReentrantReadWriteLock原理及应用深入解析
  5. 华为公有云架构解决方案
  6. Linux内存技术分析(上)
  7. 操作系统常用词典(三)
  8. HTTP/HTTPS抓包工具-Fiddler
  9. linux 6.4 图形界面,为CentOS 6.4安装图形界面并用VNC远程连接
  10. f是一个python内部变量类型,Python基础变量类型——List浅析