sqoop

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

sqoop

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

sqoop支持的數據庫:mysql

Databasesql

version數據庫

--direct support?oracle

connect string matchesapp

HSQLDB工具

1.8.0+oop

Nopost

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 指定在執行前清除中間表。

相關文章
相關標籤/搜索