1 Sqoop概述

传统的应用程序管理系统,即应用程序与使用RDBMS的关系数据库的交互,是产生大数据的来源之一。由RDBMS生成的这种大数据存储在关系数据库结构中的关系数据库服务器中。

当大数据存储和Hadoop生态系统的MapReduce,Hive,HBase,Cassandra,Pig等分析器出现时,他们需要一种工具来与关系数据库服务器进行交互,以导入和导出驻留在其中的大数据。在这里,Sqoop在Hadoop生态系统中占据一席之地,以便在关系数据库服务器和Hadoop的HDFS之间提供可行的交互。

Sqoop - “SQL到Hadoop和Hadoop到SQL”

Sqoop是一个用于在Hadoop和关系数据库服务器之间传输数据的工具。它用于从关系数据库(如MySQL,Oracle)导入数据到Hadoop HDFS,并从Hadoop文件系统导出到关系数据库。它由Apache软件基金会提供。

Sqoop如何工作?

下图描述了Sqoop的工作流程。

Sqoop导入

导入工具从RDBMS向HDFS导入单独的表。表中的每一行都被视为HDFS中的记录。所有记录都以文本文件的形式存储在文本文件中或作为Avro和Sequence文件中的二进制数据存储。

Sqoop导出

导出工具将一组文件从HDFS导出回RDBMS。给Sqoop输入的文件包含记录,这些记录在表中被称为行。这些被读取并解析成一组记录并用用户指定的分隔符分隔。

2 Sqoop安装

由于Sqoop是Hadoop的子项目,因此它只能在Linux操作系统上运行。按照以下步骤在您的系统上安装Sqoop。

1 安装java

2 安装Hadoop

3 下载Sqoop

我们可以从以下链接下载最新版本的Sqoop 对于本教程,我们使用1.4.5版本,即sqoop-1.4.5.bin__hadoop-2.0.4-alpha.tar.gz。

4 安装Sqoop

以下命令用于提取Sqoop tar球并将其移至“/ usr / lib / sqoop”目录。

$tar -xvf sqoop-1.4.4.bin__hadoop-2.0.4-alpha.tar.gz
$ su
password:
# mv sqoop-1.4.4.bin__hadoop-2.0.4-alpha /usr/lib/sqoop
#exit

5  配置bashrc

您必须通过在〜/ .bashrc文件中添加以下行来设置Sqoop环境-

  1.  
    #Sqoop
  2.  
    export SQOOP_HOME=/usr/lib/sqoop export PATH=$PATH:$SQOOP_HOME/bin

以下命令用于执行〜/ .bashrc文件。

$ source ~/.bashrc

6  配置Sqoop

为了用Hadoop配置Sqoop,你需要编辑sqoop-env.sh文件,该文件被放置在$ SQOOP_HOME / conf目录目录。首先,重定向到Sqoop config目录并使用以下命令复制模板文件 -

  1.  
    $ cd $SQOOP_HOME/conf
  2.  
    $ mv sqoop-env-template.sh sqoop-env.sh

打开sqoop-env.sh并编辑以下行 -

  1.  
    export HADOOP_COMMON_HOME=/usr/local/hadoop
  2.  
    export HADOOP_MAPRED_HOME=/usr/local/hadoop

7 下载并配置mysql-connector-java

我们可以从以下链接下载mysql-connector-java-5.1.30.tar.gz文件。

以下命令用于提取mysql-connector-java tarball并将mysql-connector-java-5.1.30-bin.jar移动到/ usr / lib / sqoop / lib目录。 

  1.  
    $ tar -zxf mysql-connector-java-5.1.30.tar.gz
  2.  
    $ su
  3.  
    password:
  4.  
     
  5.  
    # cd mysql-connector-java-5.1.30
  6.  
    # mv mysql-connector-java-5.1.30-bin.jar /usr/lib/sqoop/lib

8  验证Sqoop

以下命令用于验证Sqoop版本。

  1.  
    $ cd $SQOOP_HOME/bin
  2.  
    $ sqoop-version

输出 -

  1.  
    14/12/17 14:52:32 INFO sqoop.Sqoop: Running Sqoop version: 1.4.5
  2.  
    Sqoop 1.4.5 git commit id 5b34accaca7de251fc91161733f906af2eddbe83
  3.  
    Compiled by abe on Fri Aug 1 11:19:26 PDT 2014

Sqoop安装完成。

3 Sqoop Import

本章介绍如何将数据从MySQL数据库导入到Hadoop HDFS。“导入工具”从RDBMS将单个表导入HDFS。表中的每一行都被视为HDFS中的记录。所有记录均以文本数据的形式存储在文本文件中,或作为Avro和Sequence文件中的二进制数据存储。

语法

以下语法用于将数据导入HDFS。

  1.  
    $ sqoop import (generic-args) (import-args)
  2.  
    $ sqoop-import (generic-args) (import-args)

让我们举一个名为emp,emp_add和emp_contact的三个表的示例,这些表位于MySQL数据库服务器中名为userdb的数据库中。

这三张表格及其数据如下。

 

EMP:

idnamedegsalarydept
1201 gopal manager 50,000 TP
1202 manisha Proof reader 50,000 TP
1203 khalil php dev 30,000 AC
1204 prasanth php dev 30,000 AC
1204 kranthi admin 20,000 TP

emp_add:

idhnostreetcity
1201 288A vgiri jublee
1202 108I aoc sec-bad
1203 144Z pgutta hyd
1204 78B old city sec-bad
1205 720X hitec sec-bad

emp_contact:

idphnoemail
1201 2356742 gopal@tp.com
1202 1661663 manisha@tp.com
1203 8887776 khalil@ac.com
1204 9988774 prasanth@ac.com
1205 1231231 kranthi@tp.com

导入表格

Sqoop工具“导入”用于将表格数据从表格导入到Hadoop文件系统,作为文本文件或二进制文件。

以下命令用于将emp表从MySQL数据库服务器导入到HDFS。

$ sqoop import \
--connect jdbc:mysql://localhost/userdb \
--username 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.
14/12/22 15:24:56 INFO tool.CodeGenTool: Beginning code generation
14/12/22 15:24:58 INFO manager.SqlManager: Executing SQL statement: 
   SELECT t.* FROM `emp` AS t LIMIT 1
14/12/22 15:24:58 INFO manager.SqlManager: Executing SQL statement: 
   SELECT t.* FROM `emp` AS t LIMIT 1
14/12/22 15:24:58 INFO orm.CompilationManager: HADOOP_MAPRED_HOME is /usr/local/hadoop
14/12/22 15:25:11 INFO orm.CompilationManager: Writing jar file: 
   /tmp/sqoop-hadoop/compile/cebe706d23ebb1fd99c1f063ad51ebd7/emp.jar
-----------------------------------------------------
-----------------------------------------------------
14/12/22 15:25:40 INFO mapreduce.Job: The url to track the job: 
   http://localhost:8088/proxy/application_1419242001831_0001/
14/12/22 15:26:45 INFO mapreduce.Job: Job job_1419242001831_0001 running in uber mode : 
   false
14/12/22 15:26:45 INFO 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 /emp/part-m-*

它向您显示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

导入目标目录

我们可以在使用Sqoop导入工具将表格数据导入HDFS时指定目标目录。

以下是将目标目录指定为Sqoop导入命令的选项的语法。

--target-dir <new or exist directory in HDFS>

以下命令用于将emp_add表数据导入到'/ queryresult'目录中。

$ sqoop import \
--connect jdbc:mysql://localhost/userdb \
--username root \
--table emp_add \
--m 1 \
--target-dir /queryresult

以下命令用于在/ 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

表中的数据导入子集

我们可以使用Sqoop导入工具中的'where'子句导入表的一个子集。它在相应的数据库服务器中执行相应的SQL查询,并将结果存储在HDFS中的目标目录中。

where子句的语法如下。

--where <condition>

以下命令用于导入emp_add表数据的子集。子集查询将检索居住在塞康德拉巴德市的员工ID和地址。

$ sqoop import \
--connect jdbc:mysql://localhost/userdb \
--username root \
--table emp_add \
--m 1 \
--where city =’sec-bad’” \
--target-dir /wherequery

以下命令用于从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

增量导入

增量导入是一种仅导入表中新添加的行的技术。需要添加'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表中执行增量导入。

$ sqoop import \
--connect jdbc:mysql://localhost/userdb \
--username root \
--table emp \
--m 1 \
--incremental append \
--check-column id \
-last value 1205

以下命令用于验证从emp表导入的数据到HDFS emp /目录。

$ $HADOOP_HOME/bin/hadoop fs -cat /emp/part-m-*

它以逗号(,)分隔字段向您显示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
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 导入所有表格

 

本章介绍如何将所有表从RDBMS数据库服务器导入到HDFS。每个表格数据存储在一个单独的目录中,并且目录名称与表格名称相同。

语法

以下语法用于导入所有表。

$ sqoop import-all-tables (generic-args) (import-args) 
$ sqoop-import-all-tables (generic-args) (import-args)

让我们举一个从userdb数据库导入所有表的例子。数据库userdb包含的表的列表如下所示。

 +--------------------+
 |      Tables        |
 +--------------------+
 |      emp           |
 |      emp_add       |
 |      emp_contact   |
 +--------------------+

以下命令用于从userdb数据库中导入所有表。

$ sqoop import-all-tables \
--connect jdbc:mysql://localhost/userdb \
--username root

注 - 如果使用的是全部导入表,则该数据库中的每个表都必须具有主键字段。

以下命令用于验证HDFS中的所有表数据到userdb数据库。

$ $HADOOP_HOME/bin/hadoop fs -ls

它将向您显示userdb数据库中的表名称列表作为目录。

输出

drwxr-xr-x - hadoop supergroup 0 2014-12-22 22:50 _sqoop
drwxr-xr-x - hadoop supergroup 0 2014-12-23 01:46 emp
drwxr-xr-x - hadoop supergroup 0 2014-12-23 01:50 emp_add
drwxr-xr-x - hadoop supergroup 0 2014-12-23 01:52 emp_contact

5 导出

 

本章介绍如何将数据从HDFS导出回RDBMS数据库。目标表必须存在于目标数据库中。输入给Sqoop的文件包含记录,这些记录在表中称为行。这些被读取并解析成一组记录并用用户指定的分隔符分隔。

缺省操作是使用INSERT语句将输入文件中的所有记录插入到数据库表中。在更新模式下,Sqoop生成将现有记录替换到数据库中的UPDATE语句。

语法

以下是导出命令的语法。

$ sqoop export (generic-args) (export-args) 
$ sqoop-export (generic-args) (export-args)

让我们以HDFS中的文件中的员工数据为例。雇员数据在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

必须手动创建要导出的表,并将其导出到数据库中。

以下查询用于在mysql命令行中创建表'employee'。

$ 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));

以下命令用于将表数据(位于HDFS上的emp_data文件中)导出到Mysql数据库服务器的db数据库中的employee表中。

$ sqoop export \
--connect jdbc:mysql://localhost/db \
--username root \
--table employee \ 
--export-dir /emp/emp_data

以下命令用于验证mysql命令行中的表。

mysql>select * from 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     |
+------+--------------+-------------+-------------------+--------+

6 Job

本章介绍如何创建和维护Sqoop作业。Sqoop作业创建并保存导入和导出命令。它指定参数来识别和调用保存的作业。这种重新调用或重新执行用于增量导入,它可以将更新的行从RDBMS表导入HDFS。

语法

以下是创建Sqoop作业的语法。

$ sqoop job (generic-args) (job-args)
   [-- [subtool-name] (subtool-args)]

$ sqoop-job (generic-args) (job-args)
   [-- [subtool-name] (subtool-args)]

创建作业(--create)

我们在这里创建一个名为myjob的作业,它可以将表数据从RDBMS表导入HDFS。以下命令用于创建将数据从db数据库中的employee表导入到HDFS文件的作业。

$ sqoop job --create myjob \
-- import \
--connect jdbc:mysql://localhost/db \
--username root \
--table employee --m 1

验证作业(--list)

'--list'参数用于验证保存的作业。以下命令用于验证保存的Sqoop作业列表。

$ sqoop job --list

它显示保存的作业列表。

Available jobs: 
   myjob

检查作业( - 显示)

'--show'参数用于检查或验证特定作业及其细节。以下命令和示例输出用于验证名为myjob的作业。

$ sqoop job --show myjob

它显示了myjob中使用的工具及其选项。

Job: myjob 
 Tool: import Options:
 ---------------------------- 
 direct.import = true
 codegen.input.delimiters.record = 0
 hdfs.append.dir = false 
 db.table = employee
 ...
 incremental.last.value = 1206
 ...

执行作业(--exec)

'--exec'选项用于执行保存的作业。以下命令用于执行名为myjob的保存作业。

$ sqoop job --exec myjob

它向您显示以下输出。

10/08/19 13:08:45 INFO tool.CodeGenTool: Beginning code generation 
...

 

7 Codegen

本章介绍'codegen'工具的重要性。从面向对象的应用程序的角度来看,每个数据库表都有一个DAO类,它包含用于初始化对象的'getter'和'setter'方法。该工具(-codegen)自动生成DAO类。

它根据表模式结构在Java中生成DAO类。Java定义被实例化为导入过程的一部分。这个工具的主要用途是检查Java是否丢失了Java代码。如果是这样,它将使用字段之间的默认分隔符创建Java的新版本。

语法

以下是Sqoop codegen命令的语法。

$ sqoop codegen (generic-args) (codegen-args) 
$ sqoop-codegen (generic-args) (codegen-args)

让我们举一个例子来为userdb数据库中的emp表生成Java代码。

以下命令用于执行给定示例。

$ sqoop codegen \
--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

验证

让我们看看输出。该粗体路径是emp表生成和存储的Java代码的位置。让我们使用以下命令来验证该位置中的文件。

$ cd /tmp/sqoop-hadoop/compile/9a300a1f94899df4a9b10f9935ed9f91/
$ ls
emp.class
emp.jar
emp.java

如果要深入验证,请比较userdb数据库中的emp表和/tmp/sqoop-hadoop/compile/9a300a1f94899df4a9b10f9935ed9f91/.目录中的emp.java。

 

8 Eval

本章介绍如何使用Sqoop'eval'工具。它允许用户针对各自的数据库服务器执行用户定义的查询,并在控制台中预览结果。所以,用户可以期望导入结果表数据。使用eval,我们可以评估任何类型的可以是DDL或DML语句的SQL查询。

语法

以下语法用于Sqoop eval命令。

$ sqoop eval (generic-args) (eval-args) 
$ sqoop-eval (generic-args) (eval-args)

选择查询评估

使用eval工具,我们可以评估任何类型的SQL查询。让我们举一个在db数据库的employee表中选择有限行的例子。以下命令用于评估使用SQL查询的给定示例。

$ sqoop eval \
--connect jdbc:mysql://localhost/db \
--username root \ 
--query “SELECT * FROM employee LIMIT 3”

如果该命令执行成功,则它将在终端上产生以下输出。

+------+--------------+-------------+-------------------+--------+
| Id   | Name         | Designation | Salary            | Dept   |
+------+--------------+-------------+-------------------+--------+
| 1201 | gopal        | manager     | 50000             | TP     |
| 1202 | manisha      | preader     | 50000             | TP     |
| 1203 | khalil       | php dev     | 30000             | AC     |
+------+--------------+-------------+-------------------+--------+

插入查询评估

Sqoop评估工具可适用于建模和定义SQL语句。这意味着,我们也可以使用eval来插入语句。以下命令用于在db数据库的employee表中插入新行。

$ sqoop eval \
--connect jdbc:mysql://localhost/db \
--username root \ 
-e “INSERT INTO employee VALUES(1207,‘Raju’,‘UI dev’,15000,‘TP’)”

如果该命令成功执行,则会在控制台上显示更新行的状态。

否则,您可以在MySQL控制台上验证雇员表。以下命令用于使用select'query来验证db数据库的employee表的行。

mysql>
mysql> use db;
mysql> SELECT * FROM employee;
+------+--------------+-------------+-------------------+--------+
| Id   | Name         | Designation | Salary            | Dept   |
+------+--------------+-------------+-------------------+--------+
| 1201 | gopal        | manager     | 50000             | TP     |
| 1202 | manisha      | preader     | 50000             | TP     |
| 1203 | khalil       | php dev     | 30000             | AC     |
| 1204 | prasanth     | php dev     | 30000             | AC     |
| 1205 | kranthi      | admin       | 20000             | TP     |
| 1206 | satish p     | grp des     | 20000             | GR     |
| 1207 | Raju         | UI dev      | 15000             | TP     |
+------+--------------+-------------+-------------------+--------+

9 列出数据库和表

 

本章介绍如何使用Sqoop列出数据库。Sqoop list-databases工具解析并执行针对数据库服务器的'SHOW DATABASES'查询。此后,它列出了服务器上的当前数据库。

语法

以下语法用于Sqoop list-databases命令。

$ sqoop list-databases (generic-args) (list-databases-args) 
$ sqoop-list-databases (generic-args) (list-databases-args)

示例查询

以下命令用于列出MySQL数据库服务器中的所有数据库。

$ sqoop list-databases \
--connect jdbc:mysql://localhost/ \
--username root

如果该命令执行成功,则它将按如下方式显示MySQL数据库服务器中的数据库列表。

...
13/05/31 16:45:58 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset.

mysql
test
userdb
db

本章介绍如何使用Sqoop列出MySQL数据库服务器中特定数据库的表。Sqoop列表表工具解析并执行针对特定数据库的“SHOW TABLES”查询。此后,它列出了数据库中的当前表格。

语法

以下语法用于Sqoop list-tables命令。

$ sqoop list-tables (generic-args) (list-tables-args) 
$ sqoop-list-tables (generic-args) (list-tables-args)

示例查询

以下命令用于列出MySQL数据库服务器的userdb数据库中的所有表。

$ sqoop list-tables \
--connect jdbc:mysql://localhost/userdb \
--username root

如果该命令执行成功,则它将按如下方式显示userdb数据库中的表的列表。

...
13/05/31 16:45:58 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset.

emp
emp_add
emp_contact