Spark性能調優---算子調優

一、MapPartitions提升Map類型操作性能

Spark中,每個task處理一個RDD的partition。

①MapPartitions的優點

如果是普通的map,比如一個partition中有一萬條數據,那麼function需要執行和計算一萬次。如果使用了MapPartitions,一個task只執行一次function,function一次接受所有的partition數據。只要執行一次就可以了,性能比較高。

②MapPartitions的缺點

當數據量很大的情況下,比如有一千萬條數據。如果使用普通的map,一次只處理一條數據,在處理的過程中,如果內存不足,則會將處理完的數據從內存中垃圾回收掉,或者使用其他方法,清理出內存,程序可以正常運行。如果是MapPartitions操作,一次需要讀入所有的數據,內存不足的話也無法騰出空間,會導致內存溢出。

③適用場景

數據量不是很大的時候,內存足夠存放一次function操作所需的所有數據。

 

二、filter之後使用coalesce減少分區數量

①filter只有可能會產生的後果

  1. 每個partition數據量變少了,但是在後面進行處理的時候,還是要跟partition數量一樣的task來進行處理,造成task資源的浪費。
  2. 每個partition的數據量不一樣,會導致後面的每個task處理每個partition的時候,每個task要處理的數據量就不一樣,造成數據的傾斜。

②解決方案

  1. 針對第一個問題,因爲數據量變少了,那麼partition其實也可以相應地變少,可以考慮進行partition的壓縮。
  2. 針對第二個問題,解決方案和第一個問題一樣,也可以考慮partition的壓縮,儘量讓每個partition的數據量差不多。這樣,後面的task需要處理的數據量就差不多,處理速度差不多,避免數據傾斜帶來的問題。

③實現

在代碼中,filter算子後面添加.coalesce(numPartitions),比如:

RDD.filter(XXXXXXXXXXXXXXX).coalesce(100);

 

三、repartition解決Spark SQL低並行度的性能問題

①問題描述

通過spark.default.parallelism設置的並行度,對Spark SQL操作不生效,Spark SQL依然使用自身默認的並行度。這種情況下,可能我們的環境中可以使用的cpu core數量爲200,手動設置的並行度爲600。但是,Spark SQL操作執行後生成的task數量爲10,那麼後續的所有操作,並行度都是10,而不是我們設置的600,。這樣,就會對後續的操作帶來性能上的問題。

②解決方案

對Spark SQL操作產生的partition,使用reparation操作,設置並行度。

③代碼示例

xxxRDD.repartition(numPartitions);

 

四、foreachPartition優化寫數據庫性能

①問題描述

默認的foreach性能有很大的缺陷:

  1. 對於每條數據,task都要單獨執行一次function
  2. 每次執行function的時候,都需要發送SQL語句往數據庫寫數據,需要創建和銷燬數據庫連接,而數據庫的創建和連接對資源的消耗很大。即使使用數據庫連接池,也只是創建有限個數據庫連接,很難滿足實際需求。

以上兩點,多次數據庫連接和多次發送SQL語句,非常消耗資源,影響性能。

②使用foreachPartition的好處

在function函數中,對一個partition的數據進行批量處理,只調用一次function函數,一次傳入partition中的所有數據。這樣,數據庫連接只需要創建一次,想數據庫發送一次SQL語句,只是需要傳入多組參數即可。

③foreachPartition的缺陷

如果一個partition的數據量特別大,比如達到上百萬條,一次性傳入,可能會造成OOM內存溢出。

所以,foreachPartition的適用環境還需要在現實的生產環境中慢慢調試。

 

五、reduceByKey本地聚合

相比較於普通的shuffle,reduceByKey會對map端的數據進行本地聚合。也就是說,map端給下一個stage的每個task創建的輸出文件,在寫數據之前,會對數據進行一次本地聚合combiner操作。

好處在於:

  1. 在本地進行聚合以後,在map端的數據量就會變少,減少磁盤IO,減少磁盤空間的佔用。
  2. 下一個stage的task,在拉取數據的時候,數據量減少,減少網絡傳輸的性能消耗。
  3. reduce端拉取的數據減少,需要進行聚合的數據減少,需要的緩存也減少。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章