sqoop數據遷移

3.1 概述

sqoop是apache旗下一款Hadoop和關係數據庫服務器之間傳送數據」的工具。php

導入數據:MySQL,Oracle導入數據到Hadoop的HDFS、HIVE、HBASE等數據存儲系統;java

導出數據:從Hadoop的文件系統中導出數據到關係數據庫node

 

 

 

3.2 工做機制

將導入或導出命令翻譯成mapreduce程序來實現mysql

在翻譯出的mapreduce中主要是對inputformat和outputformat進行定製git

 

 

 

3.3 sqoop實戰及原理

3.3.1 sqoop安裝

安裝sqoop的前提是已經具有java和hadoop的環境sql

一、下載並解壓

最新版下載地址http://ftp.wayne.edu/apache/sqoop/1.4.6/數據庫

 

 

二、修改配置文件

$ cd $SQOOP_HOME/confapache

$ mv sqoop-env-template.sh sqoop-env.sh服務器

打開sqoop-env.sh並編輯下面幾行:app

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

 

 

三、加入mysql的jdbc驅動包

cp  ~/app/hive/lib/mysql-connector-java-5.1.28.jar   $SQOOP_HOME/lib/

四、驗證啓動

$ 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安裝工做完成。

 

 

 

 

3.4 Sqoop的數據導入

「導入工具」導入單個表從RDBMS到HDFS。表中的每一行被視爲HDFS的記錄。全部記錄都存儲爲文本文件的文本數據(或者Avro、sequence文件等二進制數據) 

3.4.1 語法

下面的語法用於將數據導入HDFS。

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

 

3.4.2 示例

表數據

在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

gopal@tp.com

1202

1661663

manisha@tp.com

1203

8887776

khalil@ac.com

1204

9988774

prasanth@ac.com

1205

1231231

kranthi@tp.com

導入表表數據到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

 

 

 

 

下面的命令用來驗證數據從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 1205

 

 

如下命令用於從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

 

 

 

3.5 Sqoop的數據導出

將數據從HDFS導出到RDBMS數據庫

導出前,目標表必須存在於目標數據庫中。

u  默認操做是從將文件中的數據使用INSERT語句插入到表中

u  更新模式下,是生成UPDATE語句更新表數據

語法

如下是export命令語法。

$ sqoop export (generic-args) (export-args)

 

 

示例

數據是在HDFS 中「EMP/」目錄的emp_data文件中。所述emp_data以下:

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

 

一、首先須要手動建立mysql中的目標表

$ mysql

mysql> USE db;

mysql> CREATE TABLE employee (

   id INT NOT NULL PRIMARY KEY,

   name VARCHAR(20),

   deg VARCHAR(20),

   salary INT,

   dept VARCHAR(10));

 

二、而後執行導出命令

bin/sqoop export \

--connect jdbc:mysql://hdp-node-01:3306/test \

--username root \

--password root \

--table emp2 \

--export-dir /user/hadoop/emp/

 

三、驗證表mysql命令行。

mysql>select * from employee;

若是給定的數據存儲成功,那麼能夠找到數據在以下的employee表。

+------+--------------+-------------+-------------------+--------+

| Id   | Name         | Designation | Salary            | Dept   |

+------+--------------+-------------+-------------------+--------+

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

+------+--------------+-------------+-------------------+--------+

 

 

 

 

3.6 Sqoop做業

注:Sqoop做業——將事先定義好的數據導入導出任務按照指定流程運行

語法

如下是建立Sqoop做業的語法。

$ sqoop job (generic-args) (job-args)

   [-- [subtool-name] (subtool-args)]

 

$ sqoop-job (generic-args) (job-args)

   [-- [subtool-name] (subtool-args)]

 

 

 

 

建立做業(--create)

在這裏,咱們建立一個名爲myjob,這能夠從RDBMS表的數據導入到HDFS做業。

 

bin/sqoop job --create myimportjob -- import --connect jdbc:mysql://hdp-node-01:3306/test --username root --password root --table emp --m 1

該命令建立了一個從db庫的employee表導入到HDFS文件的做業。

 

 

驗證做業 (--list)

‘--list’ 參數是用來驗證保存的做業。下面的命令用來驗證保存Sqoop做業的列表。

$ sqoop job --list

它顯示了保存做業列表。

Available jobs:

   myjob

檢查做業(--show)

‘--show’ 參數用於檢查或驗證特定的工做,及其詳細信息。如下命令和樣本輸出用來驗證一個名爲myjob的做業。

$ sqoop job --show myjob

它顯示了工具和它們的選擇,這是使用在myjob中做業狀況。

Job: myjob

 Tool: import Options:

 ----------------------------

 direct.import = true

 codegen.input.delimiters.record = 0

 hdfs.append.dir = false

 db.table = employee

 ...

 incremental.last.value = 1206

 ...

 

 

 

 

執行做業 (--exec)

‘--exec’ 選項用於執行保存的做業。下面的命令用於執行保存的做業稱爲myjob。

$ sqoop job --exec myjob

它會顯示下面的輸出。

10/08/19 13:08:45 INFO tool.CodeGenTool: Beginning code generation

...

 

 

 

3.7 Sqoop的原理

概述

Sqoop的原理其實就是將導入導出命令轉化爲mapreduce程序來執行,sqoop在接收到命令後,都要生成mapreduce程序

 

使用sqoop的代碼生成工具能夠方便查看到sqoop所生成的java代碼,並可在此基礎之上進行深刻定製開發

 

 

 

代碼定製

如下是Sqoop代碼生成命令的語法:

$ sqoop-codegen (generic-args) (codegen-args)

$ sqoop-codegen (generic-args) (codegen-args)

 

 

示例:以USERDB數據庫中的表emp來生成Java代碼爲例。

下面的命令用來生成導入

$ sqoop-codegen \

--import

--connect jdbc:mysql://localhost/userdb \

--username root \

--table emp

 

 

若是命令成功執行,那麼它就會產生以下的輸出。

14/12/23 02:34:40 INFO sqoop.Sqoop: Running Sqoop version: 1.4.5

14/12/23 02:34:41 INFO tool.CodeGenTool: Beginning code generation

……………….

14/12/23 02:34:42 INFO orm.CompilationManager: HADOOP_MAPRED_HOME is /usr/local/hadoop

Note: /tmp/sqoop-hadoop/compile/9a300a1f94899df4a9b10f9935ed9f91/emp.java uses or overrides a deprecated API.

Note: Recompile with -Xlint:deprecation for details.

14/12/23 02:34:47 INFO orm.CompilationManager: Writing jar file: /tmp/sqoop-hadoop/compile/9a300a1f94899df4a9b10f9935ed9f91/emp.jar

 

 

 

驗證: 查看輸出目錄下的文件

$ cd /tmp/sqoop-hadoop/compile/9a300a1f94899df4a9b10f9935ed9f91/

$ ls

emp.class

emp.jar

emp.java

 

若是想作深刻定製導出,則可修改上述代碼文件

相關文章
相關標籤/搜索