sqoop是apache旗下一款「Hadoop和關係數據庫服務器之間傳送數據」的工具。php
導入數據:MySQL,Oracle導入數據到Hadoop的HDFS、HIVE、HBASE等數據存儲系統;java
導出數據:從Hadoop的文件系統中導出數據到關係數據庫node
將導入或導出命令翻譯成mapreduce程序來實現mysql
在翻譯出的mapreduce中主要是對inputformat和outputformat進行定製git
安裝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
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安裝工做完成。
「導入工具」導入單個表從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 |
gopal@tp.com |
1202 |
1661663 |
manisha@tp.com |
1203 |
8887776 |
khalil@ac.com |
1204 |
9988774 |
prasanth@ac.com |
1205 |
1231231 |
kranthi@tp.com |
下面的命令用於從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 |
bin/sqoop import --connect jdbc:mysql://hdp-node-01:3306/test --username root --password root --table emp --hive-import --m 1 |
在導入表數據到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 |
將數據從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 | +------+--------------+-------------+-------------------+--------+ |
注:Sqoop做業——將事先定義好的數據導入導出任務按照指定流程運行
如下是建立Sqoop做業的語法。
$ sqoop job (generic-args) (job-args) [-- [subtool-name] (subtool-args)]
$ sqoop-job (generic-args) (job-args) [-- [subtool-name] (subtool-args)]
|
在這裏,咱們建立一個名爲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’ 參數是用來驗證保存的做業。下面的命令用來驗證保存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’ 選項用於執行保存的做業。下面的命令用於執行保存的做業稱爲myjob。
$ sqoop job --exec myjob 它會顯示下面的輸出。 10/08/19 13:08:45 INFO tool.CodeGenTool: Beginning code generation ... |
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
|
若是想作深刻定製導出,則可修改上述代碼文件