sqoop面試題


1.1 Sqoop 在工作中的定位是會用就行
1.1.1 Sqoop導入數據到hdfs中的參數

  1. /opt/module/sqoop/bin/sqoop import \
  2. --connect \ # 特殊的jdbc連接的字符串
  3. --username \
  4. --password \
  5. --target-dir \ # hdfs目標的目錄
  6. --delete-target-dir \ # 導入的目標目錄如果存在則刪除那個目錄
  7. --num-mappers \ #相當於 -m ,並行導入時map task的個數
  8. --fields-terminated-by \
  9. --query "$2" ' and $CONDITIONS;' # 指定滿足sql和條件的數據導入


1.1.2 Sqoop導入hive時的參數
一步將表結構和數據都導入到hive中

  1. bin/sqoop import \
  2. --connect jdbc的url字符串 \
  3. --table mysql中的表名\
  4. --username 賬號 \
  5. --password 密碼\
  6. --hive-import \
  7. --m mapTask的個數\
  8. --hive-database hive中的數據庫名;


1.1.3 Rdbms中的增量數據如何導入?

  1. --check-column 字段名 \ #指定判斷檢查的依據字段
  2. --incremental 導入模式\ # 用來指定增量導入的模式(Mode),append和lastmodified
  3. --last-value 上一次導入結束的時間\
  4. --m mapTask的個數 \
  5. --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方式也不能用。

  1. sqoop export \
  2. --connect url \
  3. --username root \
  4. --password 123456 \
  5. --table app_cource_study_report \
  6. --columns watch_video_cnt,complete_video_cnt,dt \
  7. --fields-terminated-by "\t" \
  8. --export-dir "/user/hive/warehouse/tmp.db/app_cource_study_analysi_${day}" \
  9. --staging-table app_cource_study_report_tmp \
  10. --clear-staging-table \
  11. --input-null-string '\\N' \
  12. --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個小時的都有。取決於數據量。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM