Sqoop是Apache旗下的一款“Hadoop和关系数据库服务器之间传送数据”的工具。
比如:导入数据——MySQL,Oracle导入数据到Hadoop的Hdfs,Hive,HBase等数据存储系统;导出数据——从Hadoop的文件系统中导出数据到关系数据库MySQL等。
Sqoop的本质还是一个命令行工具。
工作机制
将导入或导出命令翻译成MapReduce程序来实现,在翻译出MapReduce中主要是对InputFormat和OutputFormat进行定制。
Sqoop的使用
Sqoop的基本命令:
Sqoop help查看:
查看某个命令的用法(比如import):sqoop help import
Sqoop的数据导入
“导入工具”导入单个表从RDBMS到HDFS。表中的每一行被视为HDFS的记录。所有记录都存储为文本文件的文本数据(或者Avro,sequence文件等二进制数据)。
数据导入HDFS的语法:sqoop import (generic-args) (import-args)
- 导入MySQL数据到HDFS:
普通导入:
这种方式,没有指定导出的文件的存储路径,那么就会默认存储在HDFS上的/user/hadoop/help_keyword目录中,其中,第一个user固定的,第二个Hadoop表示链接的用户名,第三个表示表明。
其存储的文本文件,是MySQL表中每条记录对应一行,每一个字段之间默认用逗号分开的样式。
也可以用Hadoop命令的方式查看文本:hadoop fs -cat /user/hadoop/help_keyword/part-m-00000
结论,在导入时,没有指定路径,则会按默认规则生成路径,如果没有指定分隔符,默认按照逗号分隔
那么如何指定分隔符和导入路径呢?
就是在上面的命令中加上:
–target-dir HDFS上的路径(/user/hadoop/my_help_keyword)
–field-terminated-by ‘\t’
即:
导入where条件数据
再导入数据的同时,我们可以使用where做相应的SQL查询,并将结果存储在HDFS的目标目录。
where的语法:–where “条件”
即:
导入Query(查询)数据结果
导入MySQL到Hive
Sqoop导入关系型数据到Hive的过程是先导入到HDFS,然后再load进入Hive。
普通导入
导入数据到Hive中,默认表在default库下,表名一样,采用’\u0001’分隔。
注意,表会自动创建,但是库是不会的。所以再执行该语句之前,一定要确保Hive的数据库mudb_test是存在的,否则程序会报错。
增量导入
增量导入是仅导入表中新添加的行的技术。
它需要添加:
此处结果不包括help_keyword_id=500的数据,数据都是大于500的。
导入MySQL数据到HBase
数据导出
注意:导出前,目标表必须存在于目标数据库中。
默认操作是从将文件的数据使用INSERT语句插入到表中,更新模式下,是生成UPDATE语句更新表数据。
Export的语法:sqoop export (generic-args) (export-args)
导出HDFS数据到MySQL
首先要先在MySQL中新建对应的表,
再执行:
导出Hive数据到MySQL
跟导出HDFS中的数据到MySQL没什么两样。
导出HBase数据到MySQL
没有直接的命令将HBase的数据导出到MySQL
一般采取如下3种方法:
- 将HBase数据,扁平化成HDFS文件,然后再由Sqoop导入;
- 将HBase数据导入Hive表中,然后再导入MySQL;
- 直接使用HBase的Java API读取表数据,直接向MySQL导入,不需要使用Sqoop。
Sqoop导入导出的原理
Sqoop的导入原理
Sqoop工具是通过MapReduce进行导入作业的。总体来说,是把关系型数据库中的某张表的一行行记录都写入到HDFS中。
1- Sqoop会通过JDBC来获取所需要的数据库元数据,例如,导入表的列名,数据类型等。
2- 这些数据库的数据类型会被映射成Java的数据类型,根据这些信息,Sqoop会生成一个与表明同名的类用来完成序列化工作,保存表中的每一行记录。
3- Sqoop启动MapReduce作业。
4- 启动的作业在input的过程中,会通过JDBC读取数据表中的内容,这时,会使用Sqoop生成的类进行反序列化操作。
5- 最后将这些记录写到HDFS中,在写入到HDFS的过程中,同样会使用Sqoop生成的类进行反序列化。
Sqoop的导出原理
1- Sqoop依然会通过JDBC访问关系型数据库,得到需要导出数据的元数据信息。
2- 根据获取到的元数据的信息,Sqoop生成一个Java类,用来进行数据的传输载体。该类必须实现序列化和反序列化。
3- 启动MapReduce作业。
4- Sqoop利用生成的这个Java类,并行的从HDFS中读取数据。
5- 每个Map作业都会根据读取到的导出表的元数据信息和读取到的数据,生成一批insert语句,然后多个Map作业会并行的向数据库MySQL中插入数据。
所以,数据是从HDFS中并行的进行读取,也是并行的进入写入,那并行的读取是依赖HDFS的性能,而并行的写入到MySQL中,那就要依赖于MySQL的写入性能。