sqoop
sqoop 是 apache 旗下一款“Hadoop 和关系数据库服务器之间传送数据”的工具。
核心的功能有两个:
导入、迁入
导出、迁出
导入数据:MySQL,Oracle 导入数据到 Hadoop 的 HDFS、HIVE、HBASE 等数据存储系统
导出数据:从 Hadoop 的文件系统中导出数据到关系数据库 mysql 等 Sqoop 的本质还是一个命令行工具,和 HDFS,Hive 相比,并没有什么高深的理论。
sqoop:
工具:本质就是迁移数据, 迁移的方式:就是把sqoop的迁移命令转换成MR程序
hive
工具,本质就是执行计算,依赖于HDFS存储数据,把SQL转换成MR程序
工作机制
将导入或导出命令翻译成 MapReduce 程序来实现 在翻译出的 MapReduce 中主要是对 InputFormat 和 OutputFormat 进行定制
Sqoop Import
将数据从MySQL数据库导入到Hadoop HDFS
导入表数据到HDFS
bin/sqoop import
–connect jdbc:mysql://hdp-node-01:3306/test
–username root
–password root
–table emp
–m 1
如果成功执行,那么会得到下面的输出:
INFO sqoop.Sqoop: Running Sqoop version: 1.4.5
INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset.
INFO orm.CompilationManager: Writing jar file: /tmp/sqoop-hadoop/compile/cebe706d23ebb1fd99c1f063ad51ebd7/emp.jar
O mapreduce.Job: map 0% reduce 0%
INFO mapreduce.Job: map 100% reduce 0%
INFO mapreduce.Job: Job job_1419242001831_0001 completed successfully
INFO mapreduce.ImportJobBase: Transferred 145 bytes in 177.5849 seconds (0.8165 bytes/sec)
INFO mapreduce.ImportJobBase: Retrieved 5 records.
为了验证在HDFS导入的数据,请使用以下命令查看导入的数据:
$ $HADOOP_HOME/bin/hadoop fs -cat /user/hadoop/emp/part-m-00000
emp表的数据和字段之间用逗号(,)表示
导入到HDFS指定目录
bin/sqoop import
–connect jdbc:mysql://hdp-node-01:3306/test
–username root
–password root
–target-dir /queryresult \指定目录
–fields-terminated-by ‘\001’ \指定分隔符
–table emp
–split-by id
–m 1
如果设置了 --m 1,则意味着只会启动一个maptask执行数据导入;
如果不设置 --m 1,则默认为启动4个map task执行数据导入,则需要指定一个列来作为划分map task任务的依据。
使用如下命令查看
$HADOOP_HOME/bin/hadoop fs -cat /queryresult/part-m-*
按需导入:
bin/sqoop import
–connect jdbc:mysql://hdp-node-01:3306/test
–username root
–password root
–target-dir /wherequery2
–query ‘select id,name,deg from emp WHERE id>1207 and $CONDITIONS’
–split-by id
–fields-terminated-by ‘\t’
–m 2
Sqoop的数据导出
数据是在HDFS 中,将HDFS中的文件导入到hive中的mysql中
首先需要手动创建mysql中的目标表
$ mysql
mysql> USE db;
mysql> CREATE TABLE employee (
id INT NOT NULL PRIMARY KEY,
name VARCHAR(20),
deg VARCHAR(20),
salary INT,
dept VARCHAR(10));
然后执行导出命令
bin/sqoop export
–connect jdbc:mysql://hdp-node-01:3306/test
–username root
–password root
–table employee
–export-dir /user/hadoop/emp/
验证表mysql命令行。
mysql>select * from employee;
sqoop常见问题处理
事务
会一次statement插入100条数据,然后每100 个statement提交一次,所以一次就会提交10000条数据。
如果tasks失败了(由于网络问题或者其它的问题), 这些tasks会尝试从它们开始导入数据的地方重新开始,会插入重复的记录。
这次写数据的时候,Sqoop不 提防这种潜在的问题。
Sqoop提供的一个解决办法就是使用中间表,参数为: --staging-table --clear-staging-table
字段 名称问题
sqoop 从 mysql 导入 hive 的字段名称问题 hive 中有些关键字限制,
因此有些字段名称在 mysql 中可用,但是到了 hive 就不 行。
部分不能在 hive 中使用的字段名称 order;sort;reduce;cast;directory
表
涉及的源表和目标表不一致,包括字段名称不一致,字段的数目不一致,数据的分隔符未指定等。查看mr任务的报错再判断是否是字段的问题