Sqoop資料遷移實戰
sqoop安裝
安裝sqoop的前提是已經具備java和hadoop的環境
1、下載並解壓
最新版下載地址http://ftp.wayne.edu/apache/sqoop/1.4.6/
2、修改配置檔案
$ 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
3、加入mysql的jdbc驅動包
cp ~/app/hive/lib/mysql-connector-java-5.1.28.jar $SQOOP_HOME/lib/
4、驗證啟動
$ 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安裝工作完成。
Sqoop的資料匯入
“匯入工具”匯入單個表從RDBMS到HDFS。表中的每一行被視為HDFS的記錄。所有記錄都儲存為文字檔案的文字資料(或者Avro、sequence檔案等二進位制資料)
語法
下面的語法用於將資料匯入HDFS。
$ sqoop import (generic-args) (import-args) |
示例
表資料
在mysql中有一個庫userdb中三個表:emp, emp_add和emp_contact
表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 |
1205 |
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_conn:
id |
phno |
|
1201 |
2356742 |
|
1202 |
1661663 |
|
1203 |
8887776 |
|
1204 |
9988774 |
|
1205 |
1231231 |
匯入表表資料到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 |
匯入關係表到HIVE
bin/sqoop import --connect jdbc:mysql://hdp-node-01:3306/test --username root --password root --table emp --hive-import --m 1 |
匯入到HDFS指定目錄
在匯入表資料到HDFS使用Sqoop匯入工具,我們可以指定目標目錄。
以下是指定目標目錄選項的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 |
匯入表資料子集
我們可以匯入表的使用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 |
按需匯入
bin/sqoop import \ --connect jdbc:mysql://hdp-node-01:3306/test \ --username root \ --password root \ --target-dir /wherequery2 \ --query 'select id,name,deg from emp WHERE id>1207 and $CONDITIONS' \ --split-by id \ --fields-terminated-by '\t' \ --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 |
增量匯入
增量匯入是僅匯入新新增的表中的行的技術。
它需要新增‘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 1208 |
以下命令用於從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 |