2013-09-26 35 views
0

我使用Spring Batch將大量的在線數據提取 - 轉換 - 加載到數據倉庫中進行推薦分析。兩者都是RDBMS。使用Spring批處理的ETL的最佳實踐?

我的問題是離線Spring批處理ETL的最佳做法是什麼?滿負荷或增量負荷?我更喜歡滿負荷,因爲它更簡單。目前我正在使用這些步驟進行數據加載作業:

step1:在數據倉庫中截斷表A;
第二步:將數據加載到表A中;
步驟3:截取數據倉庫中的表B;
第4步:將數據加載到表B中;
step5:截取數據倉庫中的表C;
第6步:將數據加載到表C中;
...

這些表ABC,...在數據倉庫的實時推薦系統處理中。

但是由於我從在線數據庫加載的數據量很大,整個作業處理將非常耗時。因此,如果我截斷一個表並且還沒有加載數據,那麼依賴於這個表的實時推薦處理將會有一個大問題。我怎樣才能防止這種數據不完整的情況發生?使用Staging Table或者類似的策略?

任何答覆將不勝感激。

+1

這不是一個真正的彈簧批量問題;這只是一個直接的ETL設計問題。 – Ickster

+0

感謝您的提醒。我修改了標籤。 – Wuaner

回答

0

你有兩個選擇:

  • 使用的源表的審計日誌,以確定哪些記錄需要在目標進行更新。這是批量ETL的最佳選擇,但它需要在源系統中啓用審計日誌記錄。如果您有能力開啓審計工作,而且這不會成爲性能問題,那就是要走的路。

  • 如果源表中沒有刪除(僅插入和更新),則可以使用大塊記錄簡單地執行從目標到源的完整讀取/寫入操作。

    根據目標數據庫引擎,您將有不同的更新選項。有些可能要求您嘗試執行寫入嘗試(插入或更新);如果失敗,則必須捕捉異常並執行其他寫操作。 (例如,嘗試插入,如果您捕獲了DuplicateKeyException,則必須改爲更新,具體取決於插入與更新的比率,您可以反轉插入/更新的順序以更新/插入)。

    其他引擎允許MERGE,允許一步更新/插入/刪除。

    該方法仍然會移動大量數據,但對目標的影響最小。當然,這假定您能夠以不會引用完整性問題的方式來訂購表更新。在閱讀時寫入目標。

+0

感謝您的回答。我會記住這些。:) 目前我正在使用完整加載+暫存表執行此操作: – Wuaner

+0

將過高的耗時數據加載到暫存表中;在最後一步中遷移登臺表的數據以截斷目標表。 再次感謝您的回覆。 – Wuaner