1.1 Sqoop 在工作中的定位是會用就行
1.1.1 Sqoop導入數據到hdfs中的參數
- /opt/module/sqoop/bin/sqoop import \
- --connect \ # 特殊的jdbc連接的字符串
- --username \
- --password \
- --target-dir \ # hdfs目標的目錄
- --delete-target-dir \ # 導入的目標目錄如果存在則刪除那個目錄
- --num-mappers \ #相當於 -m ,並行導入時map task的個數
- --fields-terminated-by \
- --query "$2" ' and $CONDITIONS;' # 指定滿足sql和條件的數據導入
1.1.2 Sqoop導入hive時的參數
一步將表結構和數據都導入到hive中
- bin/sqoop import \
- --connect jdbc的url字符串 \
- --table mysql中的表名\
- --username 賬號 \
- --password 密碼\
- --hive-import \
- --m mapTask的個數\
- --hive-database hive中的數據庫名;
1.1.3 Rdbms中的增量數據如何導入?
- --check-column 字段名 \ #指定判斷檢查的依據字段
- --incremental 導入模式\ # 用來指定增量導入的模式(Mode),append和lastmodified
- --last-value 上一次導入結束的時間\
- --m mapTask的個數 \
- --merge-key 主鍵
補充:
·如果使用merge-key合並模式 如果是新增的數據則增加,因為incremental是lastmodified模式,那么當有數據更新了,而主鍵沒有變,則會進行合並。
·--check-column字段當數據更新和修改這個字段的時間也要隨之變化,mysql中建表時該字段修飾符,字段名timestamp default current_timestamp on update current_timestamp
1.1.4 Sqoop導入導出Null存儲一致性問題
Hive中的Null在底層是以“\N”來存儲,而MySQL中的Null在底層就是Null,為了保證數據兩端的一致性,轉化的過程中遇到null-string,null-non-string數據都轉化成指定的類型,通常指定成"\N"。在導出數據時采用–input-null-string “\N” --input-null-non-string “\N” 兩個參數。導入數據時采用–null-string “\N” --null-non-string “\N”。
Import導入和export導出的關系如下圖所示。
1.1.5 Sqoop數據導出一致性問題
1)場景1:如Sqoop在導出到Mysql時,使用4個Map任務,過程中有2個任務失敗,那此時MySQL中存儲了另外兩個Map任務導入的數據,此時老板正好看到了這個報表數據。而開發工程師發現任務失敗后,會調試問題並最終將全部數據正確的導入MySQL,那后面老板再次看報表數據,發現本次看到的數據與之前的不一致,這在生產環境是不允許的。
Sqoop官網中的用戶指南
使用—staging-table選項,將hdfs中的數據先導入到輔助表中,當hdfs中的數據導出成功后,輔助表中的數據在一個事務中導出到目標表中(也就是說這個過程要不完全成功,要不完全失敗)。
為了能夠使用staging這個選項,staging表在運行任務前或者是空的,要不就使用—clear-staging-table配置,如果staging表中有數據,並且使用了—clear-staging-table選項,sqoop執行導出任務前會刪除staging表中所有的數據。
注意:–direct導入時staging方式是不可用的,使用了—update-key選項時staging方式也不能用。
- sqoop export \
- --connect url \
- --username root \
- --password 123456 \
- --table app_cource_study_report \
- --columns watch_video_cnt,complete_video_cnt,dt \
- --fields-terminated-by "\t" \
- --export-dir "/user/hive/warehouse/tmp.db/app_cource_study_analysi_${day}" \
- --staging-table app_cource_study_report_tmp \
- --clear-staging-table \
- --input-null-string '\\N' \
- --null-non-string "\\N"
2)場景2:設置map數量為1個(不推薦,面試官想要的答案不只這個)
多個Map任務時,采用–staging-table方式,仍然可以解決數據一致性問題。
1.1.6 Sqoop底層運行的任務是什么
只有Map階段,沒有Reduce階段的任務。
1.1.7 Map task並行度設置大於1的問題
並行度導入數據的 時候 需要指定根據哪個字段進行切分 該字段通常是主鍵或者是自增長不重復的數值類型字段,否則會報下面的錯誤。
Import failed: No primary key could be found for table. Please specify one with --split-by or perform a sequential import with ‘-m 1’.
那么就是說當map task並行度大於1時,下面兩個參數要同時使用
–split-by id 指定根據id字段進行切分
–m n 指定map並行度n個
1.1.8 Sqoop數據導出的時候一次執行多長時間
Sqoop任務5分鍾-2個小時的都有。取決於數據量。