- Sqoop做爲關係型數據庫RDBMS和大數據平臺(HDFS,Hive,Hbase等)導入導出工具,如果不熟悉其參數作用,使用起來各種問題,本文作爲博主對Sqoop的實踐作出一定的總結,如有錯誤,僅供參考。
Sqoop Job
-
Sqoop job 的是給使用者提供一個封裝sqoop job的功能,其作用是可以自動更新job 的meta信息,讓增量導入時指定的last-value自動被更新記錄,不用額外的使用其他手段記錄信息。
-
Sqoop job操作:
創建job sqoop job --create <job-id> -- [import|export] #注意,創建導入導出job ,最後一個'--'後面要加一個空格 查看job sqoop job --show <job-id> #查看job的詳細信息 查看job列表 sqoop job --list 刪除job sqoop job --delete <job-id> 執行job sqoop job --exec <job-id>
-
Sqoop ‘- -password /- -password-file’ 參數
sqoop支持倆種密碼的輸入,一種直接傳遞(--password),一種使用文件(--password-file),直接在shell 上填寫密碼,sqoop會提示不要在命令行直接使用密碼。 創建sqoop job時,如果直接在命令行使用密碼(--password),是無效的,當你執行job時,依然會讓你重新輸入密碼。
-
不輸入密碼的倆種方式:
1.修改sqoop-site.xml <property> <name>sqoop.metastore.client.record.password</name> <value>true</value> <description>If true, allow saved passwords in the metastore. </description> </property> 此種方式在第一次輸入密碼後,以後再執行就不需要輸入密碼 2.使用--password-file 指定密碼文件,文件可以是本地文件系統,也可以是HDFS文件 echo -n 'password' > filename.password -n 參數表示不換行輸出,當你的密碼文件格式不正確時,執行job時會報錯 java.sql.SQLException: Access denied for user 'xxx'@'xxxx' (using password: YES)
增量導入
-
限於篇幅,sqoop全量導入導出,這裏就不再介紹
-
sqoop使用–incremental參數實現增量導入,有倆種模式:append和lastmodified
-
Append模式
必須參數: --check-column <column-name> #檢查列,sqoop根據指定列來查詢出大於last-value值的數據,實現增量導入,可以爲自增的列,如id,也可以是自增的時間類型 --incremental append #指定append模式 --last-value <init-value> 此種模式,大於last-value的值會被追加到目標數據中,如果指定的是時間類型,那麼之前數據被修改後,時間變動導致的增量會被追加,因此會有數據重複,一般指定自增的id。 eg: sqoop job --create job-id \ -- import \ --connect jdbc-url \ --username username \ --password-file password-file-path \ --table table-name \ --num-mappers 2 \ --split-by id \ --hive-import \ --hive-database db \ --hive-table table-name \ --check-column id \ --incremental append \ --last-value 0 \
APPEND 模式支持導入到HDFS和Hive
-
Lastmodified模式
-
lastmodified需要指定一個更新的時間列,會將大於指定時間列的值增量導入到目標數據源,被更新的數據行也會被導入,導入方式又分爲append和merge-key倆種模式,需要注意的是,此種增量導入方式不支持直接導入到Hive
必須參數: --target-dir hdfs-path # HDFS路徑 --check-column <column-name> #檢查列,sqoop根據指定列來查詢出大於last-value值的數據,實現增量導入,一般爲日期時間類型 --incremental lastmodified #指定lastmodified模式 --last-value <init-value> --append 或--merge-key <column> eg: sqoop job --create job-id \ -- import \ --connect jdbc-url \ --username username \ --password-file password-file \ --table table \ --columns columns \ --num-mappers 1 \ --target-dir target-dir \ --fields-terminated-by '\t' \ --check-column check-column \ --incremental lastmodified \ --last-value "1970-01-01 08:00:00" \ --merge-key id
指定append時,更新和新增的數據會被追加到目標數據,指定merge-key時,更新的數據會和之前數據按照指定的key合併生成最新的數據,新增的數據會被追加,指定的key一般爲主鍵,需要注意的是,如果target-dir 目錄存在,那麼該sqoop job會重新啓動一個MapReduce作業按照merge-key更新之前的數據生成新的數據集,新生成的文件數量不受num-mappers參數影響
增量導出
-
Sqoop 增量導出基於hdfs數據,使用–export-dir指定,實現增量導出的關鍵是–export-dir 指定路徑的數據是否是增量的,可以使用以下方式:
INSERT OVERWRITE TABLE/DIRECTORY 'table_name/directory_anme' SELECT...
-
增量導出也有倆種模式,allowinsert和updateonly,使用–update-mode 參數進行指定,allowinsert模式是對已存在的數據進行更新,新增的數據進行追加,前提是目標表存在主鍵,updateonly模式(默認)僅允許對存在的數據進行更新,更新指定的key,用–update-key參數指定
必要參數: --update-key <key> --update-mode <allowinsert/updateonly> eg: sqoop export --connect jdbc-url \ --username username \ --password password \ --table <targetTable> \ --fields-terminated-by ‘,’ \ --update-key key \ --update-mode allowinsert \ --export-dir export-dir