天天看點

20、大資料之Sqoop與Sqoop的安裝部署

Sqoop的安裝與部署

1.下載下傳Sqoop安裝包

從官網http://sqoop.apache.org下載下傳最新版的Sqoop

2.解壓并安裝Sqoop

tar  -zxvf sqoop-1.4.6.bin_hadoiop-2.0.4-alpha.tar.gz

3.配置Sqoop

(1)配置MySQL連接配接器

Sqoop經常與MySQL結合,幫助從其他資料源向MySQL資料庫導入資料,或者到處資料,是以需要配置MySQl連接配接器。

首先進入mysql-connector-java-5.1.27/目錄,然後将其中的mysql-connector-java-5.1.27-bin.jar檔案,複制到Sqoop的安裝目錄。

cp  mysql-connector-java-5.1.27-bin.jar  sqoop-1.4.6.bin_hadoiop-2.0.4-alpha/lib

(2)配置Sqoop環境變量

進入Sqoop的主安裝目錄的conf子目錄,然後執行改名操作,接着打開sqoop-env.sh進行編輯

cd   sqoop-1.4.6.bin_hadoiop-2.0.4-alpha/conf

mv  sqoop-env-template.sh   sqoop-env.sh

vi    sqoop-env.sh

将檔案内容改為:

20、大資料之Sqoop與Sqoop的安裝部署

根據自己的安裝情況,修改為自己的 安裝目錄

編輯完畢,儲存退出

(3)配置Linux環境變量

vi  /home/hadoop/.bash_profile

export SQOOP_HOME=/home/hadoop/ sqoop-1.4.6.bin_hadoiop-2.0.4-alpha

export PATH=$PATH:$SQOOP_HOME/bin

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

1.概述

sqoop是apache旗下一款“Hadoop和關系資料庫伺服器之間傳送資料”的工具。

導入資料:MySQL,Oracle導入資料到Hadoop的HDFS、HIVE、HBASE等資料存儲系統;

導出資料:從Hadoop的檔案系統中導出資料到關系資料庫

20、大資料之Sqoop與Sqoop的安裝部署

2. 工作機制

将導入或導出指令翻譯成mapreduce程式來實作

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

3. Sqoop的資料導入

“導入工具”導入單個表從RDBMS到HDFS。表中的每一行被視為HDFS的記錄。所有記錄都存儲為文本檔案的文本資料(或者Avro、sequence檔案等二進制資料) 

3.1 文法

下面的文法用于将資料導入HDFS。
$ sqoop import (generic-args) (import-args)

3.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 [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

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

(1)、首先需要手動建立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));

(2)、然後執行導出指令

bin/sqoop export \

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

--username root \

--password root \

--table employee \

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

(3)、驗證表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     |

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

5.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:

   myimportjob

檢查作業(--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

...

繼續閱讀