Sqoop匯入


本章介紹了如何從MySQL資料庫中的資料匯入到Hadoop的HDFS。 “匯入工具”匯入單個表從RDBMS到HDFS。表中的每一行被視為HDFS的記錄。所有記錄都儲存為文字檔案的文字資料或者在阿夫羅(Avro )和序列檔案的二進位制資料。 

語法

下面的語法用於將資料匯入HDFS。

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

範例

讓我們以命名為emp, emp_add和emp_contact,這是一個在MySQL資料庫伺服器名為userdb 資料庫的一個例子。

三個表及其資料如下。

表emp:

id name deg salary dept
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:

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
id phno email
1201 2356742 [email protected]
1202 1661663 [email protected]
1203 8887776 [email protected]
1204 9988774 [email protected]
1205 1231231 [email protected]

匯入表

Sqoop工具'import'是用來從表中匯入表資料到Hadoop的檔案系統作為文字檔案或二進位制檔案。

下面的命令用於從MySQL資料庫伺服器中的emp表匯入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

匯入到目標目錄

在匯入表資料到HDFS使用Sqoop匯入工具,我們可以指定目標目錄。

以下是指定目標目錄選項的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和地址,居住城市為:Secunderabad

$ 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_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