Sqoop:容錯

權聲明:本文爲博主原創文章,未經博主容許不得轉載。數據庫

Sqoop自己的容錯依賴於Hadoop,這裏咱們focus在Sqoop傳輸任務失敗的處理,確切的說,focus在Sqoop如何解決傳輸任務失敗引起的數據一致性問題緩存

對於一個傳輸任務,將數據從A傳輸到B,若是這個傳輸任務失敗,A和B的狀態,都應該和傳輸開始以前是一致的。工具

Sqoop將一個傳輸做業生成一個mapreduce job,一個job有多個並行執行傳輸做業的mapreduce task在和外部數據庫作數據傳輸,而後,有不少緣由能夠致使個別task fail,eg:
1. 違反數據庫約束
2. 數據庫鏈接丟失
3. 因爲分隔符等緣由,傳輸的列數和表的列數不一致
4. Hadoop機器硬件問題oop

任何一個task因爲上述問題fail,會致使整個傳輸job fail,而這可能會致使數據出現一致性問題!spa

一個傳輸任務,由多個task並行執行,每一個task自己是一個transaction,當這個task fail,這個transaction會roll back,但其餘的transaction不會roll back,這就會致使很是嚴重的髒數據問題,數據部分導入,部分缺失,怎麼辦???

對於Sqoop Import任務,因爲Hadoop CleanUp Task的存在,這個問題不存在
.net

Sqoop Export任務則提供了一個「中間表」的解決辦法
先將數據寫入到中間表,寫入中間表成功,在一個transaction中將中間表的數據寫入目標表
--staging-table <staging-table-name> 中間表
--clear-staging-table 任務開始前,清空中間表get

eg:
./sqoop export --connect jdbc:MySQL://127.0.0.1/test --table employee --staging-table employee_tmp  --clear-staging-table -username root -password 123456 --export-dir  hdfs://localhost:9000/user/hive/warehouse/employee
傳輸過程當中數據暫存在employee_tmp中,最終employee_tmp的數據將被move到employee

中間表的思路不錯,但帶來一個問題,若是要導入一份數據到數據庫,須要建一個「伴身表」
若是傳輸工具須要通用化,這個建「伴身表」的操做就須要集成到整個傳輸工具中,而「建表」工做外放,DBA會是一個很大的阻力

總結:
對於一個傳輸工具/平臺,傳輸任務失敗不可怕,可怕的地方在於「髒數據」如何處理,3種思路:
1. 臨時表:使用臨時表緩存數據,而後在一個transaction中將臨時表的數據move到目的表
2. 自定義回滾:經過用戶自定義的語句/方法,在任務失敗後,執行清數據操做
3. 傳輸任務的冪等性:若是一個任務失敗了,產生了髒數據,解決問題後,再跑一次任務,可以最終正確,例如hive寫入使用INSERT OVERWRITEio

相關文章
相關標籤/搜索