Sqoop 导入


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

语法


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

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

例子

让我们以三个名为的表为例 emp , emp_add , and emp_contact ,它们位于 MySQL 数据库服务器中名为 userdb 的数据库中。

这三个表及其数据如下。

emp:

id name deg salary dept
1201 gopal manager 50,000 TP
1202 manisha 校对器 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:

id hno street city
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:

id phno email
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 工具 ‘import’ 用于将表中的表数据以文本文件或二进制文件的形式导入 Hadoop 文件系统。

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

$ sqoop import \
--connect jdbc:mysql:// 本地主机/用户数据库 \
--username root \
--table emp --m 1

如果它执行成功,那么你会得到以下输出。

14/12/22 15导入目标目录54 INFO sqoop.Sqoop: Running Sqoop version: 1.4.5
14/12/22 15导入目标目录56 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset.
14/12/22 15导入目标目录56 INFO tool.CodeGenTool: Beginning code generation
14/12/22 15导入目标目录58 INFO manager.SqlManager: Executing SQL statement: 
    SELECT t.* FROM `emp` AS t LIMIT 1
14/12/22 15导入目标目录58 INFO manager.SqlManager: Executing SQL statement: 
    SELECT t.* FROM `emp` AS t LIMIT 1
14/12/22 15导入目标目录58 INFO orm.CompilationManager: HADOOP_MAPRED_HOME is /usr/local/hadoop
14/12/22 15我们可以在使用 Sqoop 导入工具将表数据导入 HDFS 时指定目标目录。11 INFO orm.CompilationManager: Writing jar file: 
    /tmp/sqoop-hadoop/compile/cebe706d23ebb1fd99c1f063ad51ebd7/emp.jar
-----------------------------------------------------
-----------------------------------------------------
14/12/22 15我们可以在使用 Sqoop 导入工具将表数据导入 HDFS 时指定目标目录。40 INFO mapreduce.Job: The url to track the job: 
    http:// localhost:8088/proxy/application_1419242001831_0001/
14/12/22 15以下是指定目标目录作为 Sqoop 导入命令选项的语法。45 INFO mapreduce.Job: Job job_1419242001831_0001 running in uber mode : 
    false
14/12/22 15以下是指定目标目录作为 Sqoop 导入命令选项的语法。45 INFO mapreduce.Job: map 0% reduce 0%
14/12/22 15将表数据放入“/queryresult”目录。08 INFO mapreduce.Job: map 100% reduce 0%
14/12/22 15将表数据放入“/queryresult”目录。16 INFO mapreduce.Job: Job job_1419242001831_0001 completed successfully
-----------------------------------------------------
-----------------------------------------------------
14/12/22 15将表数据放入“/queryresult”目录。17 INFO mapreduce.ImportJobBase: Transferred 145 bytes in 177.5849 seconds 
    (0.8165 bytes/sec)
14/12/22 15将表数据放入“/queryresult”目录。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:// 本地主机/用户数据库 \
--username root \
--table emp_add \
--m 1 \
--target-dir /queryresult

以下命令用于验证 /queryresult 目录形式的导入数据 emp_add table.

$ $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:// 本地主机/用户数据库 \
--username root \
--table emp_add \
--m 1 \
--where “city =’sec-bad’” \
--target-dir /wherequery

以下命令用于验证 /wherequery 目录中的导入数据来自 emp_add table.

$ $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 table.

$ sqoop import \
--connect jdbc:mysql:// 本地主机/用户数据库 \
--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 table.

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

它向你显示新添加的行到 emp 用逗号 (,) 分隔字段的表。

1206, satish p, grp des, 20000, GR