說說Spark應用程式的效能調優(分散式計算引擎)

desaco發表於2016-01-22

  Spark是基於記憶體的分散式計算引擎,以處理的高效和穩定著稱。然而在實際的應用開發過程中,開發者還是會遇到種種問題,其中一大類就是和效能相關。

  分散式計算引擎在調優方面有四個主要關注方向,分別是CPU、記憶體、網路開銷和I/O,其具體調優目標如下:

  1. 提高CPU利用率。
  2. 避免OOM。
  3. 降低網路開銷。
  4. 減少I/O操作。
>資料傾斜意味著某一個或某幾個Partition中的資料量特別的大,這意味著完成針對這幾個Partition的計算需要耗費相當長的時間。要避免資料傾斜的出現,一種方法就是選擇合適的key,或者是自己定義相關的partitioner。

>Spark的Shuffle過程非常消耗資源,Shuffle過程意味著在相應的計算節點,要先將計算結果儲存到磁碟,後續的Stage需要將上一個Stage的結果再次讀入。資料的寫入和讀取意味著Disk I/O操作,與記憶體操作相比,Disk I/O操作是非常低效的。

使用iostat來檢視disk i/o的使用情況,disk i/o操作頻繁一般會伴隨著cpu load很高。

如果資料和計算節點都在同一臺機器上,那麼可以避免網路開銷,否則還要加上相應的網路開銷。 使用iftop來檢視網路頻寬使用情況,看哪幾個節點之間有大量的網路傳輸。 

 為了提高Spark應用程式的效率,儘可能的提升CPU的利用率。併發數應該是可用CPU物理核數的兩倍。在這裡,併發數過低,CPU得不到充分的利用,併發數過大,由於spark是每一個task都要分發到計算結點,所以任務啟動的開銷會上升。

併發數的修改,通過配置引數來改變spark.default.parallelism,如果是sql的話,可能通過修改spark.sql.shuffle.partitions來修改。

  /repartition和coalesce都能實現資料分割槽的動態調整,但需要注意的是repartition會導致shuffle操作,而coalesce不會。

  /groupBy操作應該儘可能的避免,第一是有可能造成大量的網路開銷,第二是可能導致OOM。

  /在Join過程中,經常會遇到大表和小表的join. 為了提高效率可以使用BroadcastHashJoin, 預先將小表的內容廣播到各個Executor, 這樣將避免針對小表的Shuffle過程,從而極大的提高執行效率。

  /移動計算的開銷遠遠低於移動資料的開銷。

  /使用好的序列化演算法能夠提高執行速度,同時能夠減少記憶體的使用。

Spark在Shuffle的時候要將資料先儲存到磁碟中,儲存的內容是經過序列化的。序列化的過程牽涉到兩大基本考慮的因素,一是序列化的速度,二是序列化後內容所佔用的大小.

相關文章