1. 程式人生 > >Sqoop資料遷移實戰

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

email

1201

2356742

[email protected]

1202

1661663

[email protected]

1203

8887776

[email protected]

1204

9988774

[email protected]

1205

1231231

[email protected]

匯入表表資料到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