文章目录

  • 01 引言
  • 02 Sqoop概述
    • 2.1 Sqoop定义
    • 2.2 Sqoop功能
    • 2.3 Sqoop工作机制
  • 03 Sqoop安装
    • 3.1 Sqoop下载
    • 3.2 Sqoop配置
    • 3.3 Sqoop验证启动
  • 04 Sqoop导入导出
    • 4.1 Sqoop导入
      • 4.1.1 导入语法
      • 4.1.2 导入案例
        • 4.1.2.1 导入表数据到HDFS
        • 4.1.2.2 导入关系表到HIVE
        • 4.1.2.3 导入到HDFS指定目录
        • 4.1.2.4 导入表数据子集
        • 4.1.2.5 增量导入
    • 4.2 Sqoop导出
      • 4.2.1 导出语法
      • 4.2.2 导出案例
  • 05 Sqoop原理
    • 5.1 Sqoop 代码定制
      • 5.1.2 代码定制语法
      • 5.1.2 代码定制案例
  • 06 Sqoop、DataX关系与对比
    • 6.1 Sqoop特点
    • 6.2 DataX特点
    • 6.3 Sqoop与DataX的区别
  • 07 文末

01 引言

在前面的《DataX教程》,我们知道了DataX是阿里研发的一个数据迁移工具,同理,本文主要讲解的是Hadoop生态系统下的一个迁移工具,也就是Sqoop

02 Sqoop概述

2.1 Sqoop定义

Sqoop:是apache旗下一款“Hadoop和关系数据库服务器之间传送数据”的工具。

2.2 Sqoop功能

Sqoop的主要功能如下:

  • 导入数据MySQLOracle导入数据到HadoopHDFSHIVEHBASE等数据存储系统;
  • 导出数据:从Hadoop的文件系统中导出数据到关系数据库;

2.3 Sqoop工作机制

工作机制:将导入或导出命令翻译成mapreduce程序来实现

在翻译出的mapreduce中主要是对inputformatoutputformat进行定制。

03 Sqoop安装

安装sqoop的前提是已经具备javahadoop的环境 !

3.1 Sqoop下载

step1:下载并解压

  • 下载地址:http://ftp.wayne.edu/apache/sqoop/1.4.6/

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导入:导入单个表从RDBMSHDFS,表中的每一行被视为HDFS的记录,所有记录都存储为文本文件的文本数据(或者Avrosequence文件等二进制数据) 。

下面的语法用于将数据导入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主要特点

  • 可以将关系型数据库中的数据导入hdfshive或者hbasehadoop组件中,也可将hadoop组件中的数据导入到关系型数据库中;
  • sqoop在导入导出数据时,充分采用了map-reduce计算框架,根据输入条件生成一个map-reduce作业,在hadoop集群中运行。采用map-reduce框架同时在多个节点进行import或者export操作,速度比单节点运行多个并行导入导出效率高,同时提供了良好的并发性和容错性;
  • 支持insertupdate模式,可以选择参数,若内容存在就更新,若不存在就插入;
  • 对国外的主流关系型数据库支持性更好。

6.2 DataX特点

DataX主要特点:

  • 异构数据库和文件系统之间的数据交换;
  • 采用Framework + plugin架构构建,Framework处理了缓冲,流控,并发,上下文加载等高速数据交换的大部分技术问题,提供了简单的接口与插件交互,插件仅需实现对数据处理系统的访问;
  • 数据传输过程在单进程内完成,全内存操作,不读写磁盘,也没有IPC
  • 开放式的框架,开发者可以在极短的时间开发一个新插件以快速支持新的数据库/文件系统。

6.3 Sqoop与DataX的区别

Sqoop与DataX的区别如下

  • sqoop采用map-reduce计算框架进行导入导出,而datax仅仅在运行datax的单台机器上进行数据的抽取和加载,速度比sqoop慢了许多;
  • sqoop只可以在关系型数据库和hadoop组件之间进行数据迁移,而在hadoop相关组件之间,比如hivehbase之间就无法使用sqoop互相导入导出数据,同时在关系型数据库之间,比如mysqloracle之间也无法通过sqoop导入导出数据。
  • 与之相反,datax能够分别实现关系型数据库hadoop组件之间、关系型数据库之间、hadoop组件之间的数据迁移;
  • sqoop是专门为hadoop而生,对hadoop支持度好,而datax可能会出现不支持高版本hadoop的现象;
  • sqoop只支持官方提供的指定几种关系型数据库和hadoop组件之间的数据交换,而在datax中,用户只需根据自身需求修改文件,生成相应rpm包,自行安装之后就可以使用自己定制的插件;

07 文末

本文主要讲解了Sqoop的概念、安装以及使用,谢谢大家的阅读,本文完!

更多推荐

Sqoop入门(一篇就够了)