2017-09-15 269 views
2

我目前有一個應用程序應該連接到不同類型的數據庫,使用Spark的JDBC選項在該數據庫上運行特定查詢,然後將生成的DataFrame寫入HDFS。對於Oracle來說,性能非常糟糕(沒有檢查所有這些)。原來,這是因爲Oracle的默認10行爲fetchSize屬性。所以我把它增加到1000,性能增益很明顯。然後,我將它改爲10000,但隨後一些表開始因執行器(6個執行器,每個4G內存,2G驅動器內存)中的內存不足而失敗。Spark JDBC fetchsize選項

我的問題是:

  • 是火花的JDBC獲取的數據執行內存堅持每次運行?有沒有辦法un-persist它在作業運行?

  • 我在哪裏可以獲得有關fetchSize屬性的更多信息?我猜測它不會被所有JDBC驅動程序支持。

  • 是否還有其他需要注意的與JDBC相關的事情以避免OOM錯誤?

回答

1

訪存大小它只是JDBC PreparedStatement的一個值。

你可以看到它在JDBCRDD.scala:

stmt.setFetchSize(options.fetchSize) 

你可以閱讀更多有關JDBC FETCHSIZE here

一,你還可以改善的事情就是將所有4個參數,這將導致並行讀。查看更多here。然後你的閱讀可以分解成許多機器,因此每個機器的內存使用量可能會更小。

對於細節JDBC選項的支持,以及如何,你必須尋找你的驅動程序文檔 - 每個驅動器可以有它自己的行爲

+0

@ zero323你是什麼意思?只是一個笑話,OP不應該使用JDBC或我有一些錯誤? (你現在,它晚了;)) –

+0

這只是一個笑話:)答案看起來不錯。 – zero323

+0

嘿,好的:D這個來源我不喜歡的一件事是我們必須依賴第三方驅動程序 - 它們的工作方式都不相同。但是誰不使用RDBMS? ;) –