Spark 高性能算子

Spark 高性能算子

1. map 與 mapPartitions

1.優缺點

mapPartition的優點:

普通的map執行一個partition中有1.2萬條數據。ok,那麼function要執行和計算1.2萬次。

如果使用MapPartitions操作之後,一個task僅僅會執行一次function,function一次接收所有的partition數據。只要執行一次就可以了,性能比較高。

mapPartition的缺點:

普通的map操作一次function的執行就處理一條數據。那麼如果內存不夠用的情況下,回收內存就OK,一般來說普通的map操作通常不會導致內存的OOM異常。

但是MapPartitions操作,對於大量數據來說,比如甚至一個partition,200萬數據,一次傳入一個function以後,那麼可能一下子內存不夠,可能導致OOM,內存溢出。

2.使用場景

在項目中先要預估一下每個partition中rdd的數量,同時瞭解內存大小,當分析的數據量不是特別大的時候且不會出現OOM,選擇MapPartitions。

2. foreach 與 foreachPartition

1.優缺點

foreachPartition的優點:

foreachPartition一般是用來將處理好的數據保存到數據庫,使用它有三大好處:

  • 調用一次func函數,一次傳入一個partition所有的數據
  • 一個分區創建一個數據庫連接(數據庫連接的創建和銷燬,都是非常非常消耗性能的)
  • 只需要向數據庫發送一次SQL語句和多組參數即可(多次發送SQL語句,非常消耗性能)。

3. filter過後使用coalesce減少分區數量

1.原因

rdd經過filter之後,rdd中的每個partition的數量可能不一樣,原本每個partition的數量差不多,但處理後,會導致後面的task處理partition的時候,要處理的數據量就不同,這樣就會導致有些task運行的速度很快,有些task運行的速度很慢。如果partition數量少的就浪費了task計算資源,這就是傳說中的數據傾斜。

2.解決方案

調用coalesce算子,用於在filter操作之後,針對每個partition的數據量各不相同的情況,來壓縮partition的數量,而且讓每個partition的數據量都儘量均勻緊湊。從而便於後面的task進行計算操作,在某種程度上,能夠一定程度的提升性能。

4. persist\cache數據複用的時候使用持久化算子

cache()是使用persist()的快捷方法,cache()方法使用了默認的存儲級別—StorageLevel.MEMORY_ONLY

  • StorageLevel.MEMORY_ONLY(),純內存,無序列化,那麼就可以用cache()方法來替代

  • StorageLevel.MEMORY_ONLY_SER() ,將RDD作爲非序列化的Java對象存儲jvm中,如果RDD不合適存在內存中,將這些不合適在內存中的分區存儲在磁盤中,每次需要時讀取它們。

  • StorageLevel.MEMORY_AND_DISK() 將RDD作爲序列化的Java對象存儲,這種方式比非序列化方式更節儉空間,快速序列化會比較耗費CPU資源

  • StorageLevel.MEMORY_AND_DISK_SER(), 與MEMORY_ONLY_SER()類似,但不是每次需要時重複計算這些不合適存儲到內存中的分區,而是將這些分區存儲到磁盤中。

  • StorageLevel.DISK_ONLY() ,僅僅將RDD分區存儲到磁盤中

  • 如果內存充足,要使用雙副本高可靠機制,選擇後綴帶_2的策略,StorageLevel.MEMORY_ONLY_2()

5. reduceByKey和aggregateByKey取代groupByKey

1.原因
groupByKey不會進行Mapper的聚合操作,groupByKey不會進行Mapper端的aggregate的操作,所有的數據會通過網絡傳輸傳到Reducer端,性能會比較差.

2.aggregateByKey取代groupByKey
aggregateByKey的時候,可以自定義Mapper端的操作和Reducer端的操作

6.repartition解決Spark SQL低並行度的性能問題

並行度是設置的:spark.default.parallelism,在生產環境中,是最好設置一下並行度。官網有推薦的設置方式,根據你的application的總cpu core數量(在spark-submit中可以指定),自己手動設置spark.default.parallelism參數,指定爲cpu core總數的2~3倍

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章