本文檔主要對SQOOP的使用進行了說明,參考內容主要來自於Cloudera SQOOP的官方文檔。爲了用中文更清楚明白地描述各參數的使用含義,本文檔幾乎全部參數使用說明都通過了個人實際驗證而獲得。java
將關係數據庫表映射爲一個java文件、java class類、以及相關的jar包,做用主要是兩方面:mysql
一、 將數據庫表映射爲一個Java文件,在該Java文件中對應有表的各個字段。算法
二、 生成的Jar和class文件在metastore功能使用時會用到。sql
基礎語句:數據庫
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文件中的各屬性與該表的各字段一一對應。 |
生成與關係數據庫表的表結構對應的HIVE表數據結構
基礎語句:app
sqoop create-hive-table –connect jdbc:mysql://localhost:3306/hive -username root -password 123456 –table TBLS –hive-table h_tbls2ide
參數 | 說明 |
–hive-home <dir> | Hive的安裝目錄,能夠經過該參數覆蓋掉默認的hive目錄 |
–hive-overwrite | 覆蓋掉在hive表中已經存在的數據 |
–create-hive-table | 默認是false,若是目標表已經存在了,那麼建立任務會失敗 |
–hive-table | 後面接要建立的hive表 |
–table | 指定關係數據庫表名 |
能夠快速地使用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語句,皆可運行無誤,如上。
從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 | 該模式用於執行基本語句(暫時還不太清楚含義) |
將數據庫表的數據導入到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值。
將數據庫裏的全部表導入到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參數 |
用來生成一個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 | 打印命令運行時的詳細信息 |
打印出關係數據庫全部的數據庫名
sqoop list-databases –connect jdbc:mysql://localhost:3306/ -username root -password 123456
打印出關係數據庫某一數據庫的全部表名
sqoop list-tables –connect jdbc:mysql://localhost:3306/zihou -username root -password 123456
將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裏的存放目錄 |
記錄sqoop job的元數據信息,若是不啓動metastore實例,則默認的元數據存儲目錄爲:~/.sqoop,若是要更改存儲目錄,能夠在配置文件sqoop-site.xml中進行更改。
metastore實例啓動:sqoop metastore
參數 | 說明 |
–shutdown | 關閉一個運行的metastore實例 |
顯示sqoop版本信息
語句:sqoop version
打印sqoop幫助信息
語句:sqoop help
參數 | 說明 |
–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」,」dd@dd.com」 |
–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,dd@dd.com,1,2013-08-07 16:00:48.0,」hehe」,測試
上面的各字段是以逗號分隔的,那麼在解析時,必需要以逗號來解析出各字段值,如:
–input-fields-terminated-by ‘,’
參數 | 說明 |
–input-enclosed-by <char> | 對字段值先後有指定的字符,好比雙引號的值進行解析:–input-enclosed-by ‘\」‘,數據例子:」3″,」jimsss」,」dd@dd.com」 |
–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的描述 |