Sqoop增量導入導出總結

  • 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
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章