【Spark調優】:盡量避免使用shuffle類算子


  如果有可能的話,盡量避免使用shuffle類算子。因為Spark作業運行過程中,最消耗性能的地方就是shuffle過程。shuffle過程,就是將分布在集群中多個節點上的同一個key,拉取到同一個節點上,進行聚合或join等操作。比如reduceByKey、join等算子,都會觸發shuffle操作。

 

   shuffle過程中,各個節點上的相同key都會先寫入本地磁盤文件中,然后其他節點需要通過網絡傳輸拉取各個節點上的磁盤文件中的相同key。而且相同key都拉取到同一個節點進行聚合操作時,還有可能會因為一個節點上處理的key過多,導致內存不夠存放,進而溢寫到磁盤文件中。因此在shuffle過程中,可能會發生大量的磁盤文件讀寫的IO操作,以及數據的網絡傳輸操作。會引起大量磁盤IO和網絡數據傳輸也是shuffle性能較差的主要原因。

 

   因此在生產環境開發過程中,能避免則盡可能避免使用reduceByKey、join、distinct、repartition等會進行shuffle的算子,盡量使用map類的非shuffle算子。這樣的話,沒有shuffle操作或者僅有較少shuffle操作的Spark作業,可以大大減少性能開銷。

 

spark中會導致shuffle操作的有以下幾種算子:

  • 重分區類操作:

  比如repartition、repartitionAndSortWithinPartitions、coalesce(shuffle=true)等。重分區一般會shuffle,因為需要在整個集群中,對之前所有的分區的數據進行隨機,均勻的打亂,然后把數據放入下游新的指定數量的分區內。

  • 聚合,byKey類操作:

  比如reduceByKey、groupByKey、sortByKey等。byKey類的操作要對一個key,進行聚合操作,那么肯定要保證集群中,所有節點上的相同的key,移動到同一個節點上進行處理。

  • 集合/表間交互操作:

  比如join、cogroup等。兩個rdd進行join,就必須將相同join key的數據,shuffle到同一個節點上,然后進行相同key的兩個rdd數據的笛卡爾乘積。

 

  • 去重類操作:

  如distinct。   

  • 排序類操作:

 

  如sortByKey。

 

 

  代碼實踐:https://github.com/wwcom614/Spark

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM