2017-08-31 49 views
0

我正在使用Pentaho創建ETL,我非常關注性能。我開發了一個從Sql server 2088複製163.000.000行到PostgreSQL的ETL過程,需要17小時。Pentaho的預期性能如何?

我不知道這種表現有多好或不好。你知道如何衡量,如果需要一些過程的時間是好的?至少作爲參考知道我是否需要繼續在性能方面進行大量工作。

此外,我想知道在ETL過程的前2分鐘內加載2M行是否正常。我計算加載所有行需要多長時間。預期的結果是6小時,但隨後性能下降,需要17小時。

我一直在調查goole,我沒有找到任何時間參考任何解釋性能。

回答

2

17H太多了。太多了。對於2億行,6小時甚至更多。

提示優化:

  1. 檢查內存大小:編輯spoon.bat,查找包含-Xmx行並將其更改爲一半的機內存大小。細節因java版本而異。 Example for PDI V7.1
  2. 檢查來自源數據庫的查詢是否不太長(因爲太複雜或服務器內存大小或?)。
  3. 檢查目標提交大小(對PostgresSQL嘗試25000),Use batch update for inserts處於打開狀態,並且還禁用了索引和約束。
  4. Table inputEnable lazy conversion。警告,由於數據轉換,您可能難以識別和調試錯誤。
  5. 在轉換屬性中,您可以調整Nr of rows in rowset(單擊任意位置,選擇「屬性」,然後選擇「Miscelaneous」選項卡)。在同一個選項卡上檢查轉換是不是transactional
+0

謝謝@AlainD 我已經檢查過所有這些點,除了最後一個。 我已經將內存設置爲6GB,並且在運行pentaho的過程中,永遠不會佔用6 GB。 查詢是一個簡單的select *,需要一段時間,但我認爲這不是瓶頸。 Commitsize設置爲100.000行。我一直在測試10.000,5.000和100.000乃至500.000,而更好的性能是100.000。 最後一點可以是關鍵? – Maik

+0

你一定會破解spoon.bat(spoon.sh)來增加JVM的內存大小嗎?你也有 – AlainD

+0

是的。我已經看到,spoon.sh已被修改,並確保我甚至添加了一個environtment變量,其中的內存變量名稱爲spoon.sh,設置爲6GB。 – Maik

1

分而治之,並着手消除。

首先,爲您的查詢添加一個LIMIT,因此需要10分鐘而不是17個小時,這將使嘗試不同的事情變得容易很多。

進程是否在不同的機器上運行?如果是這樣,測量網絡帶寬利用率,以確保它不是瓶頸。傳輸一個巨大的文件,確保帶寬真的在那裏。

進程是否在同一臺機器上運行?也許一個人正在餓着另一個IO。源和目標是相同的硬盤驅動器?不同的硬盤?固態硬盤?您需要解釋...

檢查兩個進程的IO和CPU使用情況。一個CPU核心處理最大嗎?

是否有一個進程最大限度地使用其中一個磁盤?檢查iowait,iops,IO帶寬等。

多少列?兩個INT,500 FLOAT,或者每行有12兆字節PDF的巨大BLOB?這些情況下的性能會有所不同...

現在,我將假設問題出現在POSTGRES一側。

創建一個虛擬表,等同於你的目標表,其中有:

  • 完全相同的列(CREATE TABLE啞如表)
  • 沒有索引,沒有任何限制(我認爲這是默認的,再次檢查創建的表)
  • BEFORE INSERT觸發器,它返回NULL並刪除行。

行將被處理,只是沒有插入。

現在快嗎?好的,所以問題在於插入。

再次執行此操作,但是這次使用UNLOGGED TABLE(或TEMPORARY TABLE)。它們沒有任何防撞功能,因爲它們不使用日誌,但是對於導入數據來說它沒問題....如果它在插入過程中崩潰,那麼無論如何你都要擦除它並重新啓動。

還沒有索引,沒有限制。它快嗎?

如果緩慢=> IO寫入帶寬問題,可能是由其他東西撞擊磁盤造成的 如果fast => IO正常,則還未發現問題!

隨着表加載數據,逐個添加索引和約束,找出是否有,比如說,使用慢SQL函數的CHECK,或者FK到沒有索引的表中,那種東東。只需檢查創建約束需要多長時間。

注意:對於像這樣的導入,您通常會在導入後添加索引和約束。

我的直覺是,由於配置中檢查點設置太低,PG由於數據量龐大而像瘋了似的檢查點。或者像這樣的問題,可能隨機IO寫入相關。你把WAL放在一個快速的SSD上吧?

+0

我也在印象主要的嫌疑人是postgres雜誌。你達到它的方式是非常系統的。給予好評。 – AlainD