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
中三个表:
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的概念、安装以及使用,谢谢大家的阅读,本文完!