執行轉換時如何讓Kettle記錄錯誤並繼續執行?——記一種解決方案

遠在遠方的風比遠方更遠發表於2017-05-13

  如題,近幾天在利用Kettle進行資料遷移的工作(也就是把資料全量匯入到新資料庫中,其中有些欄位有些許調整),在寫好指令碼並執行後發現一個很嚴重的問題——每次指令碼在執行到某個位置的時候就會意外停止,如下兩圖所示

這裡寫圖片描述
這裡寫圖片描述

而自帶的日誌中提示類似如下:

2017/05/12 14:43:07 - 表輸出.0 - ORA-12592: TNS: 包錯誤

2017/05/12 11:37:46 - 表輸出。0 Caused by : java.sql.BatchUpdateException: ORA-01438:值大於為此列指定的允許精度

  百度谷歌了一下這種錯誤,是屬於Oracle的錯誤,在關於kettle的提問當中也有人遇到類似錯誤,但是在樓下回復的內容中並沒有找到太多有用的資訊。
  
  所以猜想其中可能有部分資料是“髒資料”,導致插入到新資料庫中時報錯,至於圖中在表輸出時數量都是整百是因為在指令碼的“表輸出”環節中設定了預設為1000條提交一次,也就是1000條commit一次,而當這一千條中有資料插不進去的時候,當然會報錯了,那麼我們現在大概知道了錯誤的原因,我們要想怎麼解決它……

  下面有兩個疑問:

  • 我怎麼能越過錯誤資料並記錄下來直接進行下面資料的提交
  • 我怎麼能找出來這些錯誤資料?具體到每條?

      後來專程因為這個去我的兩個kettle群裡問了一下,結果有一個人回答了我說讓我用日誌,後來私聊他問具體情況的時候他過半小時沒回我於是我用出了殺手鐗——給紅包,把我QQ錢包裡僅有的四塊錢塞在了裡面,這樣他處於好奇心一定會點開,那麼在中國,拿了錢你還能不辦事嗎(滑稽),雖然最後他也沒有給出特別有建設性的建議,但是我修改了一下指令碼,至少解決了出了錯就越過的需求

    這裡寫圖片描述
    這裡我們看到了表輸入的地方輸入時有28W,是因為我中間進行強制暫停了,實際上源資料大概有128W
    我在後面加了這個 表輸入的地方填的是500 現在空操作裡有31000條資料 就是大概有至少62個錯誤 ,也就是說現在的這個指令碼可以實現的功能就是—— 遇到錯誤可以略過,但是連同錯誤資料一起提交的其他資料也上傳不了
      這當然也不是我們想要的
    因為在使用kettle的轉換過程中 我們發現在連線每兩個步驟的時候如果慢一點鬆開滑鼠我們是可以看到有輸出步驟和錯誤輸出步驟的選項,而後者就是為了我們這種需求而存在的,在這個步驟中一旦遇到了錯誤 ,我們可以讓它去執行下面的語句。
      總結一下可以理解成:之前版本的沒有錯誤處理的相當於只有一個if語句,那麼如果一旦不滿足 就跳出來報錯,而我們第二種解決方案也就是上圖 ,加了一個else功能,如果不滿足,那麼還有備選,或者這裡理解成一個try塊也是一樣的。
      那麼我們是不是可以繼續增加功能呢 比如把下面的空操作換成別的 比如。。。日誌?
      但是在接下來的實踐中,kettle轉換中的“寫日誌”步驟貌似是要連結資料庫的,那麼問題就來了,我只是想知道這些錯誤資料是哪些,然後找出來,改正它,再匯入到新的資料庫而已,我為了找出這幾個錯誤資料還要建表??,想想公司配的電腦,想想連結Oracle時那緩慢的速度於是瞬間打消了念頭,。。
      那麼。。。

我們為啥不在它後面加上別的輸出呢,比如txt?excel???

於是我先使用了txt 並把日誌型別設定成詳細日誌(其它的還有 沒有日誌 最小日誌基本日誌除錯行級日誌等),執行了一會後發現實在是太多太多了, ——瞬間清屏了,,一個可拉的滾動條只能看見兩秒鐘內的資料傳輸,而且包括輸出成功的資料(真是夠詳細的=。=),而且txt在看資料的時候特別不方便,於是下面又用了錯誤日誌 + excel輸出
考慮到每次提交都會把連帶一起commit的資料也扔掉,所以在“表輸入”的時候選項改成了1,為了找出錯誤就是如此喪心病狂,已經無所謂效率了

這裡寫圖片描述

這裡寫圖片描述

最後如下

這裡寫圖片描述

也就是這128W的資料中有62個髒資料來阻止我們正常進行資料遷移,好可恨啊!

這裡寫圖片描述
  
那麼我們下面只要好好分析一下這些髒資料到底是哪裡出了問題,然後改正它們,最後再把所有的資料重新匯入,問題就應該全部解決了。。


但是這裡還有個最後的問題,這種解決方案是最優的嗎?我們為了保證正確資料的不缺失而讓每次提交的資料量為1 ,這樣大大降低了效率,但是目前我還沒有更好的解決方案,也不知道該問誰,但是最後看問題解決了就很好,如果有哪位大牛在看到這裡,如果有更好的解決方案請與本人聯絡,本人一定虛心學習。

相關文章