2017-07-04 68 views
0

我用Pentaho創建了一個ETL過程,用於從數據庫中的表中選擇數據並將其加載到另一個數據庫中。如何使用pentaho將15.000.000個寄存器加載到表中?

我必須做的前面的主要問題是,對於1.500.000行需要6個小時。全表是15.000.000,我必須加載5個表。

任何人都可以解釋應該怎麼加載pentaho大數據量?

謝謝。

+0

這是一個數據庫問題,而不是PDI問題。限制因素幾乎總是要麼是源數據庫可以傳遞數據的速度,要麼是目標數據庫的寫入性能。除非你說出你正在使用哪個數據庫,否則很難提出建議。 – fhossfel

+0

從數據庫中獲取數據時,似乎網絡中存在瓶頸? afaik你的數據不應該花6小時加載,但方式較少。預計在30分鐘內完成。你可以問你的dbadmin團隊來檢查這個嗎? – Rishu

回答

1

我從來沒有與Pentaho PDI的音量問題。按順序檢查以下內容。

您能否檢查問題是否真的來自Pentaho:如果將查詢放在SQL-Developer或Toad或SQL-IDE-Fancy-JDBC-Compilant中,會發生什麼情況。

原則上,PDI是爲了導入數據與SELECT * FROM ... WHERE ...,並在轉換中做所有的事情。我在這裏有一組轉換,因爲它們執行復雜的查詢,所以需要幾個小時才能執行。問題不是由於PDI而是由於查詢的複雜性。解決方案是將GROUP BY和SELECT FROM(SELECT ...)導出爲PDI步驟,這些步驟可以在查詢結果完成之前啓動。結果就像4小時到56秒。不是開玩笑。

你的內存大小是多少?它在spoon.bat/spoon.sh中定義。

接近尾聲,你有一條看起來像PENTAHO_DI_JAVA_OPTIONS="-Xms1024m" "-Xmx4096m" "-XX:MaxPermSize=256m"的線。重要的參數是-Xmx...。如果是-Xmx256K,那麼您的jvm只有256KB內存可供使用。

將其更改爲1/2或3/4的可用內存,以便爲其他進程留出空間。

輸出是瓶頸嗎?通過禁用它並在運行期間監視你的時鐘進行檢查。

如果它很長,增加提交大小並允許批量插入。

禁用所有索引和約束,並在加載時恢復它們。你有很好的SQL腳本執行器來自動執行這個步驟,但是首先手動檢查,然後在一個工作中檢查,否則復位索引可能在加載開始之前觸發。

您還必須檢查您是否鎖定自己:因爲PDI一起啓動所有步驟,您可能會截斷正在等待另一個截斷以解鎖的步驟。如果你不是在一個永無止境的塊中,db可能需要相當長的時間才能級聯所有的東西。

1

沒有涵蓋所有可能的性能問題的固定答案。您需要確定瓶頸並在您的環境中解決它們。

如果您在Spoon中運行作業時查看Metrics選項卡,則可以經常看到行/秒速率下降的步驟。它將是具有完整輸入緩衝區和空輸出緩衝區的一個。

要了解作業的最佳性能,可以分別測試每個組件。

  • 僅將表格輸入連接到虛擬步驟,並查看它到達的行數。
  • 定義一個生成行步驟,其中包含所有到達目的地的字段和一些代表性數據,並將其連接到表輸出步驟。再次檢查行數以查看目標數據庫的吞吐量。
  • 開始連接更多步驟/轉換到您的表輸入並查看性能下降的位置。

一旦你知道了瓶頸,你需要找出解決方案。批量加載步驟通常有助於產出率。如果網絡延遲阻礙了您的發展,您可能需要首先將數據轉儲到壓縮文件並將其複製到本地。如果您的表格輸入具有連接或where子句,請確保源數據庫具有要使用的正確索引或更改查詢。

+0

@Maik您可以通過添加以下參數來提高在context.xml中將數據加載到表中的性能。 useServerPrepStmts = false rewriteBatchedStatements = true useCompression = true –

相關問題