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
1201
2356742
1202
1661663
1203
8887776
1204
9988774
1205
1231231
導入表
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
下面的命令用來導入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
讓我們假設新添加的數據轉換成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