NO IMAGE

文章轉載自:http://www.zihou.me/html/2014/01/28/9114.html

Sqoop中文手冊

子猴:Sqoop在我們的實際工作中有一些應用,為了對Sqoop的使用有個更全面的瞭解,於是我花了一些時間將Sqoop的使用整理成了一份中文手冊,我自認還是非常全面的,覆蓋到了Sqoop所有的方面。雖然對每一個用法,我都是儘可能地先經過測試然後再得出結論,但可能難免會有謬誤,不過總的來說希望能對使用Sqoop的朋友有點幫助吧。

1.     概述

本文件主要對SQOOP的使用進行了說明,參考內容主要來自於Cloudera SQOOP的官方文件。為了用中文更清楚明白地描述各引數的使用含義,本文件幾乎所有引數使用說明都經過了我的實際驗證而得到。

2.     codegen

將關聯式資料庫表對映為一個java檔案、java class類、以及相關的jar包,作用主要是兩方面:

1、  將資料庫表對映為一個Java檔案,在該Java檔案中對應有表的各個欄位。

2、  生成的Jar和class檔案在metastore功能使用時會用到。

基礎語句:

sqoop codegen –connect jdbc:mysql://localhost:3306/hive –username root –password 123456 –table TBLS2

 

引數 說明
–bindir <dir> 指定生成的java檔案、編譯成的class檔案及將生成檔案打包為JAR的JAR包檔案輸出路徑
–class-name <name> 設定生成的Java檔案指定的名稱
–outdir <dir> 生成的java檔案存放路徑
–package-name<name> 包名,如cn.cnnic,則會生成cn和cnnic兩級目錄,生成的檔案(如java檔案)就存放在cnnic目錄裡
–input-null-non-string<null-str> 在生成的java檔案中,可以將null字串設為想要設定的值(比如空字串’’)
–input-null-string<null-str> 同上,設定時,最好與上面的屬性一起設定,且設定同樣的值(比如空字串等等)。
–map-column-java<arg> 資料庫欄位在生成的java檔案中會對映為各種屬性,且預設的資料型別與資料庫型別保持對應,比如資料庫中某欄位的型別為bigint,則在Java檔案中的資料型別為long型,通過這個屬性,可以改變資料庫欄位在java中對映的資料型別,格式如:–map-column-java DB_ID=String,id=Integer
–null-non-string<null-str> 在生成的java檔案中,比如TBL_ID==null?”null”:””,通過這個屬性設定可以將null字串設定為其它值如ddd,TBL_ID==null?”ddd”:””
–null-string<null-str> 同上,使用的時候最好和上面的屬性一起用,且設定為相同的值
–table <table-name> 對應關聯式資料庫的表名,生成的java檔案中的各屬性與該表的各欄位一一對應。

 

3.     create-hive-table

生成與關聯式資料庫表的表結構對應的HIVE表

基礎語句:

sqoop create-hive-table –connect jdbc:mysql://localhost:3306/hive -username root -password 123456 –table TBLS –hive-table h_tbls2

引數 說明
–hive-home <dir> Hive的安裝目錄,可以通過該引數覆蓋掉預設的hive目錄
–hive-overwrite 覆蓋掉在hive表中已經存在的資料
–create-hive-table 預設是false,如果目標表已經存在了,那麼建立任務會失敗
–hive-table 後面接要建立的hive表
–table 指定關聯式資料庫表名

 

4.     eval

可以快速地使用SQL語句對關聯式資料庫進行操作,這可以使得在使用import這種工具進行資料匯入的時候,可以預先了解相關的SQL語句是否正確,並能將結果顯示在控制檯。

查詢示例:

sqoop eval –connect jdbc:mysql://localhost:3306/hive -username root -password 123456 -query “SELECT * FROM tbls LIMIT 10″

資料插入示例:

sqoop eval –connect jdbc:mysql://localhost:3306/hive -username root -password 123456 -e “INSERT INTO TBLS2

VALUES(100,1375170308,1,0,’hadoop’,0,1,’guest’,’MANAGED_TABLE’,’abc’,’ddd’)”

-e、-query這兩個引數經過測試,比如後面分別接查詢和插入SQL語句,皆可執行無誤,如上。

5.     export

從hdfs中導資料到關聯式資料庫中

sqoop export –connect jdbc:mysql://localhost:3306/hive –username root –password

123456  –table TBLS2 –export-dir sqoop/test

引數 說明
–direct 快速模式,利用了資料庫的匯入工具,如mysql的mysqlimport,可以比jdbc連線的方式更為高效的將資料匯入到關聯式資料庫中。
–export-dir <dir> 存放資料的HDFS的源目錄
-m,–num-mappers <n> 啟動N個map來並行匯入資料,預設是4個,最好不要將數字設定為高於叢集的最大Map數
–table <table-name> 要匯入到的關聯式資料庫表
–update-key <col-name> 後面接條件列名,通過該引數,可以將關聯式資料庫中已經存在的資料進行更新操作,類似於關聯式資料庫中的update操作
–update-mode <mode> 更新模式,有兩個值updateonly和預設的allowinsert,該引數只能是在關係資料表裡不存在要匯入的記錄時才能使用,比如要匯入的hdfs中有一條id=1的記錄,如果在表裡已經有一條記錄id=2,那麼更新會失敗。
–input-null-string <null-string> 可選引數,如果沒有指定,則字串null將被使用
–input-null-non-string <null-string> 可選引數,如果沒有指定,則字串null將被使用
–staging-table <staging-table-name> 該引數是用來保證在資料匯入關聯式資料庫表的過程中事務安全性的,因為在匯入的過程中可能會有多個事務,那麼一個事務失敗會影響到其它事務,比如匯入的資料會出現錯誤或出現重複的記錄等等情況,那麼通過該引數可以避免這種情況。建立一個與匯入目標表同樣的資料結構,保留該表為空在執行資料匯入前,所有事務會將結果先存放在該表中,然後最後由該表通過一次事務將結果寫入到目標表中。
–clear-staging-table 如果該staging-table非空,則通過該引數可以在執行匯入前清除staging-table裡的資料。
–batch 該模式用於執行基本語句(暫時還不太清楚含義)

 

6.     import

將資料庫表的資料匯入到hive中,如果在hive中沒有對應的表,則自動生成與資料庫表名相同的表。

sqoop import –connect jdbc:mysql://localhost:3306/hive –username root –password

123456 –table user –split-by id –hive-import

–split-by指定資料庫表中的主鍵欄位名,在這裡為id。

引數 說明
–append 將資料追加到hdfs中已經存在的dataset中。使用該引數,sqoop將把資料先匯入到一個臨時目錄中,然後重新給檔案命名到一個正式的目錄中,以避免和該目錄中已存在的檔案重名。
–as-avrodatafile 將資料匯入到一個Avro資料檔案中
–as-sequencefile 將資料匯入到一個sequence檔案中
–as-textfile 將資料匯入到一個普通文字檔案中,生成該文字檔案後,可以在hive中通過sql語句查詢出結果。
–boundary-query <statement> 邊界查詢,也就是在匯入前先通過SQL查詢得到一個結果集,然後匯入的資料就是該結果集內的資料,格式如:–boundary-query ‘select id,creationdate from person where id = 3’,表示匯入的資料為id=3的記錄,或者select min(<split-by>), max(<split-by>) from <table name>,注意查詢的欄位中不能有資料型別為字串的欄位,否則會報錯:java.sql.SQLException: Invalid value
for

getLong()

目前問題原因還未知

 

–columns<col,col,col…> 指定要匯入的欄位值,格式如:–columns id,username
–direct 直接匯入模式,使用的是關聯式資料庫自帶的匯入匯出工具。官網上是說這樣匯入會更快
–direct-split-size 在使用上面direct直接匯入的基礎上,對匯入的流按位元組數分塊,特別是使用直連模式從PostgreSQL匯入資料的時候,可以將一個到達設定大小的檔案分為幾個獨立的檔案。
–inline-lob-limit 設定大物件資料型別的最大值
-m,–num-mappers 啟動N個map來並行匯入資料,預設是4個,最好不要將數字設定為高於叢集的節點數
–query,-e<statement> 從查詢結果中匯入資料,該引數使用時必須指定–target-dir、–hive-table,在查詢語句中一定要有where條件且在where條件中需要包含$CONDITIONS,示例:–query ‘select * from person where $CONDITIONS ‘ –target-dir

/user/hive/warehouse/person –hive-table person

–split-by<column-name> 表的列名,用來切分工作單元,一般後面跟主鍵ID
–table <table-name> 關聯式資料庫表名,資料從該表中獲取
–target-dir <dir> 指定hdfs路徑
–warehouse-dir <dir> 與–target-dir不能同時使用,指定資料匯入的存放目錄,適用於hdfs匯入,不適合匯入hive目錄
–where 從關聯式資料庫匯入資料時的查詢條件,示例:–where ‘id = 2′
-z,–compress 壓縮引數,預設情況下資料是沒被壓縮的,通過該引數可以使用gzip壓縮演算法對資料進行壓縮,適用於SequenceFile, text文字檔案, 和Avro檔案
–compression-codec Hadoop壓縮編碼,預設是gzip
–null-string <null-string> 可選引數,如果沒有指定,則字串null將被使用
–null-non-string<null-string> 可選引數,如果沒有指定,則字串null將被使用

增量匯入

引數 說明
–check-column (col) 用來作為判斷的列名,如id
–incremental (mode) append:追加,比如對大於last-value指定的值之後的記錄進行追加匯入。lastmodified:最後的修改時間,追加last-value指定的日期之後的記錄
–last-value (value) 指定自從上次匯入後列的最大值(大於該指定的值),也可以自己設定某一值

對incremental引數,如果是以日期作為追加匯入的依據,則使用lastmodified,否則就使用append值。

7.     import-all-tables

將資料庫裡的所有表匯入到HDFS中,每個表在hdfs中都對應一個獨立的目錄。

sqoop import-all-tables –connect jdbc:mysql://localhost:3306/test

sqoop import-all-tables –connect jdbc:mysql://localhost:3306/test –hive-import

 

引數 說明
–as-avrodatafile 同import引數
–as-sequencefile 同import引數
–as-textfile 同import引數
–direct 同import引數
–direct-split-size <n> 同import引數
–inline-lob-limit <n> 同import引數
-m,–num-mappers <n> 同import引數
–warehouse-dir <dir> 同import引數
-z,–compress 同import引數
–compression-codec 同import引數

 

8.     job

用來生成一個sqoop的任務,生成後,該任務並不執行,除非使用命令執行該任務。

sqoop job

引數 說明
–create <job-id> 生成一個job,示例如:sqoop job –create myjob  — import –connectjdbc:mysql://localhost:3306/test –table

person

 

–delete <job-id> 刪除一個jobsqoop job –delete myjob
–exec <job-id> 執行一個jobsqoop job –exec myjob
–help 顯示幫助說明
–list 顯示所有的jobsqoop job –list
–meta-connect <jdbc-uri> 用來連線metastore服務,示例如:–meta-connect jdbc:hsqldb:hsql://localhost:16000/sqoop
–show <job-id> 顯示一個job的各種引數sqoop job –show myjob
–verbose 列印命令執行時的詳細資訊

 

9.     list-databases

列印出關聯式資料庫所有的資料庫名

sqoop list-databases –connect jdbc:mysql://localhost:3306/ -username root -password 123456

10.             list-tables

列印出關聯式資料庫某一資料庫的所有表名

sqoop list-tables –connect jdbc:mysql://localhost:3306/zihou -username root -password 123456

11.             merge

將HDFS中不同目錄下面的資料合在一起,並存放在指定的目錄中,示例如:

sqoop merge –new-data /test/p1/person –onto /test/p2/person –target-dir /test/merged –jar-file /opt/data/sqoop/person/Person.jar –class-name Person –merge-key id

其中,–class-name所指定的class名是對應於Person.jar中的Person類,而Person.jar是通過Codegen生成的

引數 說明
–new-data <path> Hdfs中存放資料的一個目錄,該目錄中的資料是希望在合併後能優先保留的,原則上一般是存放越新資料的目錄就對應這個引數。
–onto <path> Hdfs中存放資料的一個目錄,該目錄中的資料是希望在合併後能被更新資料替換掉的,原則上一般是存放越舊資料的目錄就對應這個引數。
–merge-key <col> 合併鍵,一般是主鍵ID
–jar-file <file> 合併時引入的jar包,該jar包是通過Codegen工具生成的jar包
–class-name <class> 對應的表名或物件名,該class類是包含在jar包中的。
–target-dir <path> 合併後的資料在HDFS裡的存放目錄

 

12.             metastore

記錄sqoop job的後設資料資訊,如果不啟動metastore例項,則預設的後設資料儲存目錄為:~/.sqoop,如果要更改儲存目錄,可以在配置檔案sqoop-site.xml中進行更改。

metastore例項啟動:sqoop metastore

 

引數 說明
–shutdown 關閉一個執行的metastore例項

13.             version

顯示sqoop版本資訊

語句:sqoop version

14.             help

列印sqoop幫助資訊

語句:sqoop help

15.             公共引數

Hive引數

引數 說明
–hive-delims-replacement <arg> 用自定義的字串替換掉資料中的\n, \r, and \01等字元
–hive-drop-import-delims 在匯入資料到hive中時,去掉資料中\n,\r和\01這樣的字元
–map-column-hive <arg> 生成hive表時,可以更改生成欄位的資料型別,格式如:–map-column-hiveTBL_ID=String,LAST_ACCESS_TIME=string
–hive-partition-key 建立分割槽,後面直接跟分割槽名即可,建立完畢後,通過describe 表名可以看到分割槽名,預設為string型
–hive-partition-value<v> 該值是在匯入資料到hive中時,與–hive-partition-key設定的key對應的value值。
–hive-home <dir> Hive的安裝目錄,可以通過該引數覆蓋掉預設的hive目錄
–hive-import 將資料從關聯式資料庫中匯入到hive表中
–hive-overwrite 覆蓋掉在hive表中已經存在的資料
–create-hive-table 預設是false,如果目標表已經存在了,那麼建立任務會失敗
–hive-table 後面接要建立的hive表
–table 指定關聯式資料庫表名

資料庫連線引數

引數 說明
–connect <jdbc-uri> Jdcb連線url,示例如:–connect jdbc:mysql://localhost:3306/hive
–connection-manager <class-name> 指定要使用的連線管理類
–driver <class-name> 資料庫驅動類
–hadoop-home <dir> Hadoop根目錄
–help 列印幫助資訊
-P 從控制端讀取密碼
–password <password> Jdbc url中的資料庫連線密碼
–username <username> Jdbc url中的資料庫連線使用者名稱
–verbose 在控制檯列印出詳細資訊
–connection-param-file <filename> 一個記錄著資料庫連線引數的檔案

檔案輸出引數

用於import場景。

示例如:

sqoop import –connect jdbc:mysql://localhost:3306/test –username root –P –table person –split-by id –check-column id –incremental append  –last-value 1 –enclosed-by ‘\”‘

–escaped-by \# –fields-terminated-by .

 

引數 說明
–enclosed-by <char> 給欄位值前後加上指定的字元,比如雙引號,示例:–enclosed-by ‘\”‘,顯示例子:”3″,”jimsss”,”[email protected]
–escaped-by <char> 給雙引號作轉義處理,如欄位值為”測試”,經過–escaped-by \\處理後,在hdfs中的顯示值為:\”測試\”,對單引號無效
–fields-terminated-by <char> 設定每個欄位是以什麼符號作為結束的,預設是逗號,也可以改為其它符號,如句號.,示例如:–fields-terminated-by.
–lines-terminated-by <char> 設定每條記錄行之間的分隔符,預設是換行,但也可以設定自己所需要的字串,示例如:–lines-terminated-by ‘#’ 以#號分隔
–mysql-delimiters Mysql預設的分隔符設定,欄位之間以,隔開,行之間以換行\n隔開,預設轉義符號是\,欄位值以單引號’包含起來。
–optionally-enclosed-by <char> enclosed-by是強制給每個欄位值前後都加上指定的符號,而–optionally-enclosed-by只是給帶有雙引號或單引號的欄位值加上指定的符號,故叫可選的。示例如:–optionally-enclosed-by ‘$’

顯示結果:

$”hehe”,測試$

檔案輸入引數

對資料格式的解析,用於export場景,與檔案輸出引數相對應。

示例如:

sqoop export –connect jdbc:mysql://localhost:3306/test –username root –password

123456  –table person2 –export-dir /user/hadoop/person –staging-table person3

–clear-staging-table –input-fields-terminated-by ‘,’

在hdfs中存在某一格式的資料,在將這樣的資料匯入到關聯式資料庫中時,必須要按照該格式來解析出相應的欄位值,比如在hdfs中有這樣格式的資料:

3,jimsss,[email protected],1,2013-08-07 16:00:48.0,”hehe”,測試

上面的各欄位是以逗號分隔的,那麼在解析時,必須要以逗號來解析出各欄位值,如:

–input-fields-terminated-by ‘,’

引數 說明
–input-enclosed-by <char> 對欄位值前後有指定的字元,比如雙引號的值進行解析:–input-enclosed-by ‘\”‘,資料例子:”3″,”jimsss”,”[email protected]
–input-escaped-by <char> 對含有轉義雙引號的欄位值作轉義處理,如欄位值為\”測試\”,經過–input-escaped-by \\處理後,解析得到的值為:”測試”,對單引號無效。
–input-fields-terminated-by <char> 以欄位間的分隔符來解析得到各欄位值,示例如:– input-fields-terminated-by,
–input-lines-terminated-by <char> 以每條記錄行之間的分隔符來解析得到欄位值,示例如:–input-lines-terminated-by ‘#’ 以#號分隔
–input-optionally-enclosed-by <char> 與–input-enclosed-by功能相似,與–input-enclosed-by的區別參見輸出引數中對–optionally-enclosed-by的描述

 

16.             參考資料

http://archive.cloudera.com/cdh/3/sqoop/SqoopUserGuide.html