sqoop

xuexiaogang發表於2015-08-10

版權宣告:本文為yunshuxueyuan原創文章。
如需轉載請標明出處: http://www.cnblogs.com/sxt-zkys/
QQ技術交流群:299142667

sqoop

Apache Sqoop是用來實現結構型資料(如關聯式資料庫)和Hadoop之間進行資料遷移的工具。它充分利用了MapReduce的並行特點以批處理的方式加快資料的傳輸,同時也藉助MapReduce實現了容錯。

sqoop支援的資料庫:

Database

version

--direct support?

connect string matches

HSQLDB

1.8.0+

No

jdbc:hsqldb:*//

MySQL

5.0+

Yes

jdbc:mysql://

Oracle

10.2.0+

No

jdbc:oracle:*//

PostgreSQL

8.3+

Yes (import only)

jdbc:postgresql:/

通過sqoop help命令檢視sqoop幫助

import(將關聯式資料庫遷移到HDFS上)

[例1]  將mysql中的sds表匯入HDFS中

sqoop import

--connectjdbc:mysql://node01/test

--username root -password passwd

--table sds

[例2]  將mysql中的sds,指定的列表匯入HDFS中

sqoop import

--connect jdbc:mysql://node01/test

--username root -password 123

--table sds

--columns "SD_ID,CD_ID,LOCATION"

 [例3] 將整個資料庫中的表全部匯入到hdfs上

import-all-tables命令

sqoop import-all-tables

--connect jdbc:mysql://node01/test

--username root -password 123

  

[例4] 指定匯出檔案為SequenceFiles,檔案命名為com.ctrip.sds

sqoop import

--connect jdbc:mysql://node01/test

--username root -password 123

--table psn

--class-name com.ctrip.psn --as-sequencefile

  

[例5] 匯入文字時可以指定分隔符

sqoop import

--connect jdbc:mysql://node01/test

--username root -password 123

--table psn

--fields-terminated-by '\t'

--lines-terminated-by '\n'

--optionally-enclosed-by '\"'

  

 [例6] 可以指定過濾條件

sqoop import

--connect jdbc:mysql://node01/test

--username root -password passwd

--table sds

--where "sd_id > 100"

  

--m設定並行資料,即map的資料,決定檔案的個數。

--target-dir設定hdfs上的目標目錄。

export(將hdfs上的資料匯入到關聯式資料庫中)

[例一]  將HDFS中資料匯入到mysql中的sds表

sqoop export

--connect jdbc:mysql://node01/test

--username root -password 123 

--table psn 

--export-dir /user/root/psn

mysql資料庫的sds表需要先把表結構建立出來,否則export操作會直接失敗。

[例二]  將關聯式資料庫表匯入到hive表中

create-hive-table 

sqoop create-hive-table

--connect jdbc:mysql://node01/test

--username root --password 123

--table psn

--hive-table sds_bak

  

預設sds_bak是在default資料庫的。

這一步需要依賴HCatalog,需要先安裝HCatalog,否則報錯。

list-databases列出一臺server上可用的資料庫

sqoop list-databases

--connect jdbc:mysql://node01/

--username root -password 123

  

list-tables列出一個資料庫中的表

sqoop list-tables

--connect jdbc:mysql://node01/test

--username root -password 123

  

codegen:

將關聯式資料庫表對映為一個java檔案、java class類相關的jar包

sqoop codegen

--connect jdbc:mysql://node01/test

--username root -password 123

--table psn

  

eval使用者可以很快的使用sql語句對資料庫進行操作。

sqoop eval

--connect jdbc:mysql://node01/test 

--username root -password 123 

--query "SELECT * FROM psn LIMIT 10"

  

job用來生成sqoop任務。

sqoop job

--create myjob

-- import

--connect jdbc:mysql://node01/test

 --username root -password 123 

--table psn -m 1

  

sqoop job -exec myjob

  

metastore 配置sqoop job的共享後設資料資訊,這樣多個使用者定義和執行sqoop job在這一metastore中。

啟動:sqoop metastore

關閉:sqoop metastore –shutdown

儲存位置: conf/sqoop-site.xml/sqoop.metastore.server.location

 

[補充]

由於sqoop是通過map完成資料的匯入,各個map過程是獨立的,沒有事物的概念,可能會有部分map資料匯入失敗的情況。為了解決這一問題,sqoop中有一個折中的辦法,即是指定中間staging表,成功後再由中間表匯入到結果表。

--staging-table <staging-table-name>staging表結構也是需要提前建立出來

sqoop export

--connect jdbc:mysql://192.168.81.176/sqoop

--username root -password passwd

--table sds

--export-dir /user/guojian/sds

--staging-table sds_tmp

  

[注]在使用 –direct,--update-key或者--call儲存過程的選項時,staging中間表是不可用的。

驗證結果:

(1)資料會首先寫到sds_tmp表,匯入操作成功後,再由sds_tmp表匯入到sds結果表中,同時會清除sds_tmp表。

(2)如果有map失敗,則成功的map會將資料寫入tmp表,export任務失敗,同時tmp表的資料會被保留。

(3)如果tmp中已有資料,則此export操作會直接失敗,

--clear-staging-table 指定在執行前清除中間表。

版權宣告:本文為yunshuxueyuan原創文章。
如需轉載請標明出處: http://www.cnblogs.com/sxt-zkys/
QQ技術交流群:299142667