Sqoop数据迁移工具主要作用就是实现将数据在RDBMS(MySQL、SQL Server、Oracle)和Hadoop平台(HDFS、Hive、HBase)之间进行来回的迁移。
Sqoop中,将RDBMS的数据迁移到Hadoop平台我们称为数据导入import,将Hadoop平台的数据迁移到RDBMS中称之为数据导出export。
Sqoop在进行数据的导入和导出时,会使用sqoop提供的命令来进行操作,但是sqoop底层会把命令转换称为MapRecude程序在YARN上运行(sqoop的运行需要Hadoop平台环境,Sqoop也是基于Hadoop平台的软件)
【注意】和sqoop技术一样的还有一个技术叫做DataX,DataX是阿里云提供的一个数据迁移工具,除了可以实现和sqoop一样的功能,同时还提供了一些sqoop无法完成一些数据迁移操作。Datax底层不是基于MapReduce
sqoop command params
command:help 、eval、import、export、list-databases、list-tables、version
查看RDBMS中有哪些数据库的 sqoop list-databases 参数
参数 | 说明 |
---|---|
–driver | JDBC的驱动类 |
–connect | JDBCUrl |
–username | 数据库的用户名 |
–password | 数据库的密码 |
查询某一个RDBMS数据库下有哪些数据表的 sqoop list-tables 参数
参数 | 说明 |
---|---|
–driver | JDBC的驱动类 |
–connect | JDBCUrl |
–username | 数据库的用户名 |
–password | 数据库的密码 |
通过sqoop连接RDBMS执行SQL语句 sqoop eval 参数
参数 | 说明 |
---|---|
–driver | JDBC的驱动类 |
–connect | JDBCUrl |
–username | 数据库的用户名 |
–password | 数据库的密码 |
–query |-e | sql语句即可 |
实现数据导入的,将RDBMS的数据导入到HDFS、Hive、HBase中
导入数据到HDFS
参数 | 说明 |
---|---|
–driver | JDBC的驱动类 |
–connect | JDBCUrl |
–username | 数据库的用户名 |
–password | 数据库的密码 |
–table | 指定导入RDBMS中哪个数据表的数据 |
–columns | 可以不写,RDBMS数据表的列名的列表,将数据表的指定列导入,如果不写,代表导入table指定的数据表的所有列的数据 |
–where ‘条件’ | 可以不写,根据筛选条件导入RDBMS的–table指定数据表的指定数据,如果不加,那么默认代表导入–table指定的数据表的所有数据 |
–query ‘dql语句’ | 根据查询语句的结果导入指定的数据,–query不能和–table、–columns、–where一起使用,如果–query的DQL语句中出现了where子语句,必须在where子语句中添加一个 and $CONDITIONS |
–target-dir | 导入到HDFS上的目录路径 |
–delete-target-dir | 导入数据到HDFS上时,路径如果提前存在会报错,命令代表删除存在的–target-dir目录 |
–as-textfile|–as-sequencefile… | 导入数据在HDFS上存储的文件格式 |
–num-mappers | -m | 导入程序在底层转换称为多个map task任务执行 |
–fields-terminated-by | 指定将数据导入到HDFS的文件中时,列和列的分隔符,默认一种特殊字符 |
–lines-terminated-by | 指定将数据导入到HDFS的文件中时,行和行的分隔符,默认就是换行符 |
–null-string | 如果导入的MySQL数据表的某一个字符串类型的列的值为null,那么我们在HDFS的文件中使用什么字符替换null值 |
–null-non-string | 如果导入的MySQL数据表的某一个非字符串类型的列的值为null,那么我们在HDFS的文件中使用什么字符替换null值 |
导入数据到Hive
先把数据导入到HDFS
再把导入到HDFS上的数据装载到Hive数据表中
参数列表
参数 | 说明 |
---|---|
–driver | JDBC的驱动类 |
–connect | JDBCUrl |
–username | 数据库的用户名 |
–password | 数据库的密码 |
–table | 指定导入RDBMS中哪个数据表的数据 |
–columns | 可以不写,RDBMS数据表的列名的列表,将数据表的指定列导入,如果不写,代表导入 --table指定的数据表的所有列的数据 |
–where ‘条件’ | 可以不写,根据筛选条件导入RDBMS的–table指定数据表的指定数据,如果不加,那么默认代表导入–table指定的数据表的所有数据 |
–query ‘dql语句’ | 根据查询语句的结果导入指定的数据,–query不能和–table、–columns、–where一起使用,如果–query的DQL语句中出现了where子语句,必须在where子语句中添加一个 and $CONDITIONS |
–hive-import | 执行Hive的导入操作 |
–hive-database | 指定导入到Hive的哪个数据库 |
–hive-table | 指定导入到Hive的哪个数据表,数据表可以不用提前存在 |
–create-hive-table | 如果指定的hive数据表不存在,通过该选项自动创建表,但是如果Hive数据表存在的,那么该参数不需要添加 |
–num-mappers | -m | 导入程序在底层转换称为多个map task任务执行 |
–fields-terminated-by | 指定将数据导入到HDFS的文件中时,列和列的分隔符,默认一种特殊字符,同时自动创建Hive数据表时,表的列的分隔符 |
–lines-terminated-by | 指定将数据导入到HDFS的文件中时,行和行的分隔符,默认就是换行符 一般是不使用这个参数的,就算我们设置了也不生效,除非我们加上一些特殊参数 |
–null-string | 如果导入的MySQL数据表的某一个字符串类型的列的值为null,那么我们在HDFS的文件中使用什么字符替换null值 |
–null-non-string | 如果导入的MySQL数据表的某一个非字符串类型的列的值为null,那么我们在HDFS的文件中使用什么字符替换null值 |
注意事项
--create-hive-table
创建数据表,创建的数据表的列的分隔符和–fields-terminated-by设置的HDFS上文件的列的分隔符保持一致的全量导入和增量导入
把RDBMS的数据导入到HDFS或者Hive都是有两种方式:全量导入、增量导入 全量导入指的是将RDBMS表的所有数据导入到HDFS或者Hive 增量导入指的是只将新增的RDBMS表的所有数据导入到HDFS或者Hive中默认情况下,HDFS导入数据时会覆盖原有的数据,hive导入数据时,会把数据重复性的在表中添加一份。
必须考虑全量导入和增量导入问题。只学习Hive的
Hive的全量导入
--hive-overwrite
参数,将RDBMS表中的所有数据(–table 如果加了–query --columns,就不是全量的问题)添加到Hive对应的数据表,而且覆盖添加。
一般使用在第一次将RDBMS的数据导入到Hive中,如果第一次导入不需要–hive-overwrite选项 如果不是第一次导入,还想全量导入,那么必须加–hive-overwrite选项
Hive的增量导入
sqoop的增量导入有两种方式:append lastmodified
,其中Hive的增量导入只支持append方式,HDFS增量导入支持lastmodified方式
append增量导入需要指定RDBMS中一个可以自增或者是数字依次变大的一个列,同时还需要指定上一次导入的时候值的大小
--check-column RDBMS对应的列
--incremental append
--last-value num
【导入数据时间字段的问题】
数据导入之后,RDBMS中的时间和Hive中时间不一致,主要由于时区的问题导致的,RDBMS使用的时区和导入数据时指定的时区参数不是同一个时区导致的问题。
只需要保证RDBMS的时区和导入参数设置的时区serverTimezone保持一致即可。
RDBMS的时区:select @@global.time_zone
默认情况下,只要我们在中国,没有改过数据库和系统的时区,数据库和系统时区默认是+0800,因此serverTimezone=Asia/Shanghai
将Hadoop平台的数据导出到RDBMS中,导出比导入简单。导出数据时,因为Hive、HBase存储的数据都在HDFS上,因此导出只需要学习如何将HDFS上的数据导出到RDBMS即可。
【导出的注意事项】:RDBMS中的数据表必须提前存在,如果不存在,会报错
导出参数
类型 | 参数 | 说明 |
---|---|---|
导出时和RDBMS相关的参数 | –driver | JDBC的驱动类 |
–connect | JDBCUrl | |
–username | 数据库的用户名 | |
–password | 数据库的密码 | |
–table | 指定导入RDBMS中哪个数据表的数据 | |
–columns |
代表的rdbms的列名,列名必须和文件中列的顺序保持一致,防止数据串列 | |
导出HDFS的参数 | –export-dir | 导出的HDFS哪个目录下的文件数据 |
–num-mappers | -m | 将导出命令翻译称为n个map task任务 | |
–input-fields-terminated-by | 很重要,指定HDFS上文件中列和列的分隔符的 | |
–input-lines-terminated-by | 指定HDFS上文件行和行的分割符 行的分隔符\n | |
–update-mode | 取值allowinsert和updateonly,导出数据的两种模式 allowinsert 更新已经导出的数据,同时追加新的数据 对mysql数据库目前不支持的 updateonly 只更新以前导出的数据,新的数据不会导出 | |
–update-key | –update-mode如果想实现它的功能,必须和–update-key结合使用,而且–update-day最好指定一个RDBMS的主键字段,否则update-mode的效果会出现混乱 |
【注意】如果没有指定update-mode 那么默认是追加的形式导出(会出数据重复)
如果我们想要导出数据到MySQL,而且还不想让数据重复,可以先使用sqoop eval 操作执行清空目标表数据的命令,清空成功以后再导出数据。
导入一般是我们需要对RDBMS的数据进行大数据处理分析时,我们把RDBMS的数据通过import导入到HDFS或者Hive,导出之后我们处理完成,得到结果数据表,然后把结果数据表通过export导出到RDBMS中,用于后期的数据可视化展示。
数据采集一般指的是将数据采集到大数据环境下进行持久化、海量化的保存,目的主要是为了我们后期的大数据处理(数据统计分析、数据挖掘等等)沉底数据基础。
不同的来源的数据我们一般有不同的数据采集方式
sqoop技术:采集RDBMS的数据到大数据环境中
Flume技术:采集系统/网站产生的日志文件数据、端口数据等等到大数据环境中
爬虫技术:采集第三方的数据,爬虫一般是把采集的数据放到一个文件或者RDBMS数据库当中
爬虫技术就是通过读取网页/网站的界面结构,获取网页中嵌套的数据
Flume也是Apache开源的顶尖项目,专门用来采集海量的日志数据到指定的目的地。
Flume采集数据采用一种流式架构思想,只要数据源有数据,就可以源源不断的采集数据源的数据到目的地
Flume之所以可以实现采集不同数据源(不仅仅只包含日志文件数据)到指定的目的地,源于Flume的设计机构。
脚本文件xxx.conf:需要用户自己编写的,Flume采集数据时,数据源和目的地有很多种,因此如果我们采集数据时,我们必须自定义一个脚本文件,在脚本文件中需要定义采集的数据源的类型、channel管道的类型、sink的目的地的类型、以及source channel sink三者之间的关系。脚本文件定义成功之后,我们才能去根据脚本文件启动Flume采集进程Agent
【注意】一个source只能连接一个数据源,一个sink只能连接一个目的地
首先我们先编写xx.conf脚本文件定义我们的采集的数据源、目的地、管道的类型,定义成功之后我们根据脚本启动Flume采集进程Agent。一旦当Flume采集进程启动成功,source就会去监听数据源的数据,一旦当数据源有数据产生,那么source组件会把数据源的数据封装为一个个的event,然后source把event数据单位传输到channel管道中缓存,然后sink组件会从channel中拉取指定个数的event,将event中数据发送给sink连接的目的地。