01 引言
在前面的《DataX教程》,我们知道了DataX
是阿里研发的一个数据迁移工具,同理,本文主要讲解的是Hadoop
生态系统下的一个迁移工具,也就是Sqoop
。
02 Sqoop概述
2.1 Sqoop定义
Sqoop:是apache
旗下一款“Hadoop和关系数据库服务器之间传送数据”的工具。
2.2 Sqoop功能
Sqoop
的主要功能如下:
- 导入数据:
MySQL
,Oracle
导入数据到Hadoop
的HDFS
、HIVE
、HBASE
等数据存储系统; - 导出数据:从
Hadoop
的文件系统中导出数据到关系数据库;
2.3 Sqoop工作机制
工作机制:将导入或导出命令翻译成mapreduce程序来实现
在翻译出的
mapreduce
中主要是对inputformat
和outputformat
进行定制。
03 Sqoop安装
安装sqoop
的前提是已经具备java
和hadoop
的环境 !
3.1 Sqoop下载
step1:下载并解压
3.2 Sqoop配置
step2:修改配置文件
$ cd $SQOOP_HOME/conf $ mv sqoop-env-template.sh sqoop-env.sh
打开sqoop-env.sh
并编辑下面几行:
export HADOOP_COMMON_HOME=/home/hadoop/apps/hadoop-2.6.1/ export HADOOP_MAPRED_HOME=/home/hadoop/apps/hadoop-2.6.1/ export HIVE_HOME=/home/hadoop/apps/hive-1.2.1
step3:加入mysql的jdbc驱动包
cp ~/app/hive/lib/mysql-connector-java-5.1.28.jar $SQOOP_HOME/lib/
3.3 Sqoop验证启动
step4:验证启动
$ cd $SQOOP_HOME/bin $ sqoop-version
预期的输出:
15/12/17 14:52:32 INFO sqoop.Sqoop: Running Sqoop version: 1.4.6 Sqoop 1.4.6 git commit id 5b34accaca7de251fc91161733f906af2eddbe83 Compiled by abe on Fri Aug 1 11:19:26 PDT 2015
到这里,整个Sqoop
安装工作完成。
04 Sqoop导入导出
4.1 Sqoop导入
4.1.1 导入语法
Sqoop导入:导入单个表从RDBMS
到HDFS
,表中的每一行被视为HDFS
的记录,所有记录都存储为文本文件的文本数据(或者Avro
、sequence
文件等二进制数据) 。
下面的语法用于将数据导入HDFS
:
$ sqoop import (generic-args) (import-args)
4.1.2 导入案例
在mysql
中有一个库userdb
中三个表:
表名 | 内容 |
emp | |
emp_add | |
emp_contact |
4.1.2.1 导入表数据到HDFS
下面的命令用于从MySQL
数据库服务器中的emp
表导入HDFS
:
$bin/sqoop import \ --connect jdbc:mysql://hdp-node-01:3306/test \ --username root \ --password root \ --table emp --m 1
如果成功执行,那么会得到下面的输出:
14/12/22 15:24:54 INFO sqoop.Sqoop: Running Sqoop version: 1.4.5 14/12/22 15:24:56 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% 14/12/22 15:28:08 INFO mapreduce.Job: map 100% reduce 0% 14/12/22 15:28:16 INFO mapreduce.Job: Job job_1419242001831_0001 completed successfully ----------------------------------------------------- ----------------------------------------------------- 14/12/22 15:28:17 INFO mapreduce.ImportJobBase: Transferred 145 bytes in 177.5849 seconds (0.8165 bytes/sec) 14/12/22 15:28:17 INFO mapreduce.ImportJobBase: Retrieved 5 records.
为了验证在HDFS
导入的数据,请使用以下命令查看导入的数据:
$ $HADOOP_HOME/bin/hadoop fs -cat /user/hadoop/emp/part-m-00000
emp
表的数据和字段之间用逗号(,)
表示:
1201, gopal, manager, 50000, TP 1202, manisha, preader, 50000, TP 1203, kalil, php dev, 30000, AC 1204, prasanth, php dev, 30000, AC 1205, kranthi, admin, 20000, TP
4.1.2.2 导入关系表到HIVE
bin/sqoop import \ --connect jdbc:mysql://hdp-node-01:3306/test \ --username root \ --password root \ --table emp \ --hive-import --m 1
4.1.2.3 导入到HDFS指定目录
指定目标目录选项的Sqoop
导入命令的语法:
--target-dir <new or exist directory in HDFS>
下面的命令是用来导入emp_add
表数据到’/queryresult
'目录。
bin/sqoop import \ --connect jdbc:mysql://hdp-node-01:3306/test \ --username root \ --password root \ --target-dir /queryresult \ --table emp --m 1
下面的命令是用来验证 /queryresult
目录中 emp_add
表导入的数据形式 :
$HADOOP_HOME/bin/hadoop fs -cat /queryresult/part-m-*
它会用逗号(,
)分隔emp_add
表的数据和字段:
1201, 288A, vgiri, jublee 1202, 108I, aoc, sec-bad 1203, 144Z, pgutta, hyd 1204, 78B, oldcity, sec-bad 1205, 720C, hitech, sec-bad
4.1.2.4 导入表数据子集
我们可以导入表的使用Sqoop
导入工具,"where
"子句的一个子集。它执行在各自的数据库服务器相应的SQL
查询,并将结果存储在HDFS
的目标目录。
where
子句的语法如下:
--where <condition>
下面的命令用来导入emp_add
表数据的子集。子集查询检索员工ID
和地址,居住城市为:Secunderabad
bin/sqoop import \ --connect jdbc:mysql://hdp-node-01:3306/test \ --username root \ --password root \ --where "city ='sec-bad'" \ --target-dir /wherequery \ --table emp_add --m 1
下面的命令用来验证数据从emp_add
表导入/wherequery
目录:
$HADOOP_HOME/bin/hadoop fs -cat /wherequery/part-m-*
它用逗号(,
)分隔 emp_add
表数据和字段:
1202, 108I, aoc, sec-bad 1204, 78B, oldcity, sec-bad 1205, 720C, hitech, sec-bad
4.1.2.5 增量导入
增量导入是仅导入新添加的表中的行的技术。它需要添加‘incremental
’, ‘check-column
’, 和 ‘last-value
’选项来执行增量导入。
下面的语法用于Sqoop
导入命令增量选项:
--incremental <mode> --check-column <column name> --last value <last check column value>
假设新添加的数据转换成emp
表如下:
1206, satish p, grp des, 20000, GR
下面的命令用于在EMP
表执行增量导入:
bin/sqoop import \ --connect jdbc:mysql://hdp-node-01:3306/test \ --username root \ --password root \ --table emp --m 1 \ --incremental append \ --check-column id \ --last-value 1205
以下命令用于从emp
表导入HDFS emp/
目录的数据验证:
$ $HADOOP_HOME/bin/hadoop fs -cat /user/hadoop/emp/part-m-*
它用逗号(,
)分隔emp_add
表数据和字段:
1201, gopal, manager, 50000, TP 1202, manisha, preader, 50000, TP 1203, kalil, php dev, 30000, AC 1204, prasanth, php dev, 30000, AC 1205, kranthi, admin, 20000, TP 1206, satish p, grp des, 20000, GR
下面的命令是从表emp
用来查看修改或新添加的行:
$ $HADOOP_HOME/bin/hadoop fs -cat /emp/part-m-*1 这表示新添加的行用逗号(,)分隔emp表的字段。 1206, satish p, grp des, 20000, GR