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
4.2 Sqoop导出
4.2.1 导出语法
Sqoop导出:将数据从HDFS
导出到RDBMS数据库
注意:
- 默认操作是从将文件中的数据使用
INSERT
语句插入到表中 - 更新模式下,是生成
UPDATE
语句更新表数据
以下是export
命令语法:
$ sqoop export (generic-args) (export-args)
4.2.2 导出案例
数据是在HDFS
中“EMP/
”目录的emp_data
文件中,所述emp_data
如下:
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
step1:首先需要手动创建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));
step2:然后执行导出命令
bin/sqoop export \
--connect jdbc:mysql://hdp-node-01:3306/test \
--username root \
--password root \
--table emp2 \
--export-dir /user/hadoop/emp/
step3:验证表mysql命令行
mysql>select * from employee;
如果给定的数据存储成功,那么可以找到数据在如下的employee表。
+------+--------------+-------------+-------------------+--------+
| Id | Name | Designation | Salary | Dept |
+------+--------------+-------------+-------------------+--------+
| 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 |
+------+--------------+-------------+-------------------+--------+
05 Sqoop原理
Sqoop的原理:其实就是将导入导出命令转化为mapreduce
程序来执行,sqoop
在接收到命令后,都要生成mapreduce
程序。
5.1 Sqoop 代码定制
使用sqoop
的代码生成工具可以方便查看到sqoop
所生成的java
代码,并可在此基础之上进行深入定制开发。
5.1.2 代码定制语法
以下是Sqoop
代码生成命令的语法:
$ sqoop-codegen (generic-args) (codegen-args)
$ sqoop-codegen (generic-args) (codegen-args)
5.1.2 代码定制案例
示例:以USERDB
数据库中的表emp
来生成Java
代码为例,下面的命令用来生成导入:
$ sqoop-codegen \
--import
--connect jdbc:mysql://localhost/userdb \
--username root \
--table emp
如果命令成功执行,那么它就会产生如下的输出:
14/12/23 02:34:40 INFO sqoop.Sqoop: Running Sqoop version: 1.4.5
14/12/23 02:34:41 INFO tool.CodeGenTool: Beginning code generation
……………….
14/12/23 02:34:42 INFO orm.CompilationManager: HADOOP_MAPRED_HOME is /usr/local/hadoop
Note: /tmp/sqoop-hadoop/compile/9a300a1f94899df4a9b10f9935ed9f91/emp.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
14/12/23 02:34:47 INFO orm.CompilationManager: Writing jar file: /tmp/sqoop-hadoop/compile/9a300a1f94899df4a9b10f9935ed9f91/emp.jar
验证: 查看输出目录下的文件
$ cd /tmp/sqoop-hadoop/compile/9a300a1f94899df4a9b10f9935ed9f91/
$ ls
emp.class
emp.jar
emp.java
如果想做深入定制导出,则可修改上述代码文件!
06 Sqoop、DataX关系与对比
DataX
之前写过教程,可以参考《DataX教程》
6.1 Sqoop特点
Sqoop主要特点:
- 可以将关系型数据库中的数据导入
hdfs
、hive
或者hbase
等hadoop
组件中,也可将hadoop
组件中的数据导入到关系型数据库中;sqoop
在导入导出数据时,充分采用了map-reduce
计算框架,根据输入条件生成一个map-reduce
作业,在hadoop
集群中运行。采用map-reduce
框架同时在多个节点进行import
或者export
操作,速度比单节点运行多个并行导入导出效率高,同时提供了良好的并发性和容错性;- 支持
insert
、update
模式,可以选择参数,若内容存在就更新,若不存在就插入;- 对国外的主流关系型数据库支持性更好。
6.2 DataX特点
DataX主要特点:
- 异构数据库和文件系统之间的数据交换;
- 采用
Framework
+plugin
架构构建,Framework
处理了缓冲,流控,并发,上下文加载等高速数据交换的大部分技术问题,提供了简单的接口与插件交互,插件仅需实现对数据处理系统的访问;- 数据传输过程在单进程内完成,全内存操作,不读写磁盘,也没有
IPC
;- 开放式的框架,开发者可以在极短的时间开发一个新插件以快速支持新的数据库/文件系统。
6.3 Sqoop与DataX的区别
Sqoop与DataX的区别如下:
sqoop
采用map-reduce
计算框架进行导入导出,而datax
仅仅在运行datax
的单台机器上进行数据的抽取和加载,速度比sqoop
慢了许多;sqoop
只可以在关系型数据库和hadoop
组件之间进行数据迁移,而在hadoop
相关组件之间,比如hive
和hbase
之间就无法使用sqoop
互相导入导出数据,同时在关系型数据库之间,比如mysql
和oracle
之间也无法通过sqoop
导入导出数据。- 与之相反,
datax
能够分别实现关系型数据库hadoop
组件之间、关系型数据库之间、hadoop
组件之间的数据迁移;sqoop
是专门为hadoop
而生,对hadoop
支持度好,而datax
可能会出现不支持高版本hadoop
的现象;sqoop
只支持官方提供的指定几种关系型数据库和hadoop
组件之间的数据交换,而在datax
中,用户只需根据自身需求修改文件,生成相应rpm
包,自行安装之后就可以使用自己定制的插件;
07 文末
本文主要讲解了Sqoop
的概念、安装以及使用,谢谢大家的阅读,本文完!