Hadoop2.x辅助框架(一)数据转换工具sqoop
一、sqoop的作用:实现数据在HDFS 和RDBMS之间进行导入导出
1、要想将存储在Oracle、MySQL等关系型数据库上的数据上传到HDFS时 ,可以使用sqoop将表中数据抽取到HDFS。
2、一般情况下,使用Flume搜集的实时数据是被存储到HDFS上的。可以将其导出到RDBMS.
二、sqoop的底层:sqoop本质上运行的还是mapreduce程序,它利用并行批处理的方式来加快数据的传输速度。并且具有容错性。
1、sqoop通过mapreduce进行导入时会从表中一行行的读取记录并将其存入HDFS中。其读取过程如下:
(1)第一步,Sqoop会通过JDBC来获取所需要的数据库元数据,例如,导入表的列名,数据类型等。
(2)第二步,这些数据库的数据类型(varchar, number等)会被映射成Java的数据类型(String, int等),根据这些信息,Sqoop会生成一个与表名同名的类用来完成反序列化工作,保存表中的每一行记录。
(3)第三步,Sqoop启动MapReducer作业
(4)第四步,启动的作业在input的过程中,会通过JDBC读取数据表中的内容,这时,会使用Sqoop生成的类进行反序列化操作
(5)第五步,最后将这些记录写到HDFS中,在写入到HDFS的过程中,同样会使用Sqoop生成的类进行序列化
由于整个数据的导入过程是由多个Map任务并行导入的,那就必须对表进行水平切分,切分列的数据分布会很大程度上会影响性能,如果在均匀分布的情况下,性能最好。在最坏的情况下,数据严重倾斜,所有数据都集中在某一个切分区中,那么此时的性能与串行导入性能没有差别,所以在导入之前,有必要对切分列的数据进行抽样检测,了解数据的分布。(参考文献:https://blog.****.net/sunnyyoona/article/details/53151019)。
2、容错性见https://blog.****.net/yfkiss/article/details/17614721
三、sqoop的使用
1、直接使用,如下图,在sqoop的bin文件夹下启动sqoop通过指定参数就可以直接进行导入和导出(导出需要在RDBMS中先建立表格)。
a sqoop使用三要素
--connect jdbc:mysql://master:3306 \ 连接的url
--username root \ 数据库的用户名
--password 123456 数据库的密码
b 使用范例 注意斜杠之前一定要有空格否则会报错 如果要将表格在直接导入到hive中的话需要先建表
---从mysql导入数据到hdfs
bin/sqoop import \
--connect jdbc:mysql://master:3306/test \
--username root \
--password 123456 \
--table my_user \
--num-mappers 1 \
--target-dir /sqoop/input \
--fields-terminated-by "\t" \
--check-column id \
--incremental append \
--last-value 4 --从id为5的数据开始进行导入
---从mysql导入数据到hive表中(需要现在数据库test中建立表格h_user)
bin/sqoop import \
--connect jdbc:mysql://master:3306/test \
--username root \
--password 123456 \
--table my_user \
--num-mappers 1 \
--fields-terminated-by "\t" \
--delete-target-dir \
--hive-database test \
--hive-import \
--hive-table h_user
2、可以将sqoop命令选项写在文件,通过【--options-file】指定文件从而运行程序。
a vi job1.opt
b 在文件job1.opt中写入
export
--connect
jdbc:mysql://master:3306/test
--username
root
--password
123456
--table
user_export
--num-mappers
1
--input-fields-terminated-by
"\t"
--export-dir
/user/hive/warehouse/test.db/h_user
c 执行 bin/sqoop --options-file ./job1.opt
注:使用sqoop 导入导出数据必须启动所有的守护进程