Spark專案實戰-實際專案中常見的優化點-使用foreachPartition優化寫資料庫效能
阿新 • • 發佈:2018-12-11
首先,我們看一下foreach的寫原理:
1、foreach的效能缺陷在哪裡?
(1)首先對於每條資料都要單獨去呼叫一次function,task為每個資料都要去執行一次function函式。 如果100萬條資料(一個partition),呼叫100萬次,效能比較差。
(2)另外一個非常非常重要的一點,如果每個資料你都去建立一個數據庫連線的話,那麼你就得建立100萬次資料庫連線。我們都知道資料庫連線的建立和銷燬,都是非常非常消耗效能的。雖然我們可以用資料庫連線池,只是建立了固定數量的資料庫連線。但還是得多次通過資料庫連線,往資料庫(MySQL)傳送一條SQL語句,然後MySQL需要去執行這條SQL語句。如果有100萬條資料,那麼就是100萬次傳送SQL語句。
基於以上兩點(資料庫連線,多次傳送SQL語句),都是非常消耗效能的。 那麼foreachPartition的寫原理是怎樣的呢?我們往下看:
2、用了foreachPartition運算元
(1)對於我們寫的function函式,就呼叫一次,一次傳入一個partition所有的資料。
(2)建立或者獲取一個數據庫連線就可以。
(3)只要向資料庫傳送一次SQL語句和多組引數即可。
3、foreachPartition的缺點
在實際生產環境中基本上都是使用foreachPartition操作,但是有個問題,跟mapPartitions操作一樣,如果一個partition的數量真的特別特別大,比如真的是100萬,那基本上就不太靠譜了。 一下子進來,很有可能會發生OOM記憶體溢位的問題。