Kettle中ETL的效率優化


ETL效率優化

開啟數據庫日志記錄及性能監控

如果我們想要優化一個ETL(KTR或者KJB)的性能,我們首先需要知道的就是它的瓶頸在哪里。而這些信息一般只能在ETL運行的步驟度量中看到,並且是不會持久化的。如果你希望把一些數據記錄下來,幫助以后進行查閱,那么可以開啟數據庫日志和性能監控。

作業

Edit -> Settings -> Log

具體設置過程就不細講了,很簡單。

轉化

Edit -> Settings -> Logging

這時開啟了日志記錄,還需要設置性能監控

Edit -> Settings -> Monitoring

勾選 Enable step performance monitoring(開啟性能監控),下面的兩個選項分別是:

Step performance measurement interval(ms) (對每一步進行性能監測的度量間隔):這一個選項的大小會影響你在數據庫記錄的詳細程度,一般以運行總時長的十分之一左右的數值即可,這樣對於每一步可以記錄10組左右的數據,足夠做一些基本的分析,注意單位是毫秒。 Maximum number of snapshots in memory(在內存中保存的最大的快照數量):這一個選項在我們系統的內存不是很足夠時可以使用,但是太小可能會導致無法分析出來,和上面的選項搭配使用。 

轉化的錯誤日志輸出

我們在運行過程中會輸出大量日志,這樣我們在定位問題的時候需要去日志里找出錯的位置在哪里。Kettle中可以對KTR單獨配置日志,如果我們把KTR的錯誤日志直接輸出出來,那么在定位問題的時候就會非常方便,設置的方法如下:

在Job中,選擇需要輸出錯誤日志的步驟(經常出錯或者可能出錯的步驟),編輯,選擇Logging,勾選Specfify Logfile(指定日志文件),選擇路徑、后綴,日志級別選擇錯誤日志(調試時可以選詳細或者行級)。
后面的選項:
Append logfile(追加到日志文件):該選項是指日志輸出到已有文件中。
Create parent folder(創建父文件夾):該選項是指如果給定的路徑中有不存在的文件夾會自動創建。 Include date in logfile:日志中包含日期。 Include time in logfile:日志中包含時間。 

數據庫優化

因為ETL就是對異構數據庫中數據的處理,因此絕大部分性能問題都是和數據庫相關,本節內容從數據庫配置、ETL優化、SQL優化等方面進行講解

數據庫配置

連接池配置

數據庫連接池在業務數據量比較多,而且短連接很多的時候適合配置。在這個時候,每次數據庫連接建立和斷開所花費的時間遠長於進行數據庫操作的時間,配置連接池可以更好的利用網絡資源,將連接建立和斷開的開銷降低到最小。因此在大多數情況下,配置Kettle數據庫連接池均可提高ETL的性能,如果沒有配置連接池,那么在數據量大時候很容易出現Error Connecting Database Error。

該設置主要是在創建及管理連接的部分:

數據庫連接 -> 連接池 -> 使用連接池
設置連接池的大小及相應參數,這些參數需要根據數據庫實際情況及使用情況進行配置,可以咨詢DBA。
數據庫參數設置

在數據庫連接的面板中,選擇“選項”,(上面兩個是普通和高級),在參數列表中,根據情況添加以下參數:

defaultRowPrefetch = 200; (default = 10) 

這個參數是修改每次從數據庫取回的記錄的行數,默認為10,修改為200后可以減少從數據庫取值的次數。

(Oracle Only) readTimeout = 60;  

這個參數是修改從數據庫讀數據時的超時時間,單位是秒,將這個值改大一點可以防止大量數據讀取時的超時問題

(Mysql Only) useServerPrepStmts=false;
rewriteBatchedStatements=true ; useCompression=true ;

前兩個參數會讓數據庫重排Insert語句,合並多條插入語句成為一條,提交插入效率。第三個參數表示在傳輸時開啟數據壓縮 ,提高傳輸效率。這些在使用table output的時候很有效,在配置充足且網絡正常的情況下應該可以達到20k~80k的寫入速度。

ETL優化

提高數據庫操作中的Commit Size

在寫入數據庫的時候,有一個Commit size的選項,這個值在默認的情況下是1,我們可以根據服務器的性能,將這個值改大一些,通常會改為100以上的值。這個值在寫入量比較大的時候可以顯著提升數據庫的性能,但是並不是越大越好,通常范圍在100〜10000,需要根據實際情況進行配置,具體數值可以根據性能監控的記錄來確定。

這個值從1調整到合適值性能大約可以翻倍,一般情況下也有20%左右的效率提升。

Insert/Update增加錯誤處理步驟分離Insert和Update

Kettle的原作者在他的博客中提到過,盡量不要使用Insert/Update組件,因為這個組件慢的他都受不了,正常情況下在幾百條每秒(對比TableInsert幾萬的速度)。如果必須使用這個組件的時候,那么可以在Insert/Update中勾選Don't perform any updates(不做任何更新操作),然后把錯誤的數據指向一具數據庫更新的操作,這要就把添加和更新分離了開來。根據官網描述,在少量更新大量插入的時候性能可以提高到原來的3倍左右,實測時達不到,可能和數據集有關。

數據庫分組和排序優於ETL分組和排序

在ETL中減少排序和分組的操作,盡量使用數據庫完成排序和分組。在KTR中,數據是使用流的方式在不同的步驟間傳遞數據,使用排序和分組的操作會在這一步阻塞KTR的執行,直到接收到前面所有步驟傳過來的數據為止,導致ETL的運行時間增長,占用的內存增大。

使用Blocking Step也會將流阻塞到這一步,和以上情況類似。

調整步驟之間的緩存

KTR是一個流式的處理過程,步驟與步驟之間的數據傳遞是通過緩存來完成的,調整緩存的大小可以對KTR的運行產生明顯的影響。

Edit  —> Settings —> Miscellaneous —> Nr of rows in rowset (緩存的記錄行數) 

這個值的大小需要根據機器的配置來選擇,如果可用內存足夠,一般的設置是10000,也就是緩存10000行數據,如果內存比較緊張,可以將該值調小一些,保證不會占用過量內存。

在性能監測時,這也是一個用來找到瓶頸的核心參數。如果某一步的輸入和配置的緩存大小接近,但是輸出很小,那么這一步就是性能的瓶頸。如果緩存大小配置了10000,但是幾乎所有步驟的輸入輸出都只有很低的一個值,比如50,那么,性能的瓶頸就是輸入。

延遲轉化

很多字段在讀入到最后輸出,實際上都沒有被操作過,開啟延遲轉化可以讓kettle在必要的時候再進行轉化。這里的轉化是指從二進制到字符串之間的轉化,在輸入和輸出都是文本的時候更為明顯。事實上,Select Values在轉化的效率上也高於讀取時直接轉化。

使用復制並行處理某個步驟

現在的機器都是多核的,使用多CPU並行處理對CPU使用密集的步驟可以提升ETL的執行效率。

在需要並行處理的步驟上,選擇Change Number of Copies to Start, 修改這個值為小於機器核心總數的一個值,一般2〜4就可以滿足要求。

KTR中,盡量減少步驟的數量

步驟的數量會在影響KTR的執行效率,包含並行處理時復制的數量。KTR中步驟的數量為機器核心總數的3〜4倍最佳,如果超過這個范圍,可以考慮通過減少步驟數量的方式以提高KTR的執行效率。

不要在Select Values的步驟刪除某個字段

如果在Select Values的步驟刪除某個字段,kettle會需要調整現有的存儲結構,在可以不刪除的時候盡量不要刪除字段。

SQL優化

這部分和所有使用到數據庫的地方一樣,優化查詢語句,優化表結構設計,添加合適的索引等。

其它優化

  • 使用Carte管理KJB和KTR減小內存消耗
  • 使用定時器定時處理
  • 使用集群並行運行
  • 使用數據倉庫及緩慢更新進行同步增量更新

總結

總體來說,這部分的內容主要就是數據庫配置的優化及ETL本身的優化,當然在提高效率的時候也要兼顧資源的使用情況,有的方法可以提高效率,但是會消耗更多資源。因此我們需要綜合考慮,通過一些合理的方式既能充分的利用資源,又不會因壓力過大影響業務的正常進行。

ETL可以看作是一個可視化的、數據處理領域的編程工具,因此,ETL編寫過程不僅需要了解業務,還需要一些數據庫方面的知識進行支持,如果寫出來的ETL效率低下,運行時間長,吃資源多,那么,是時候需要考慮優化一下ETL了。.


免責聲明!

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



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