Spark中可用下面的算子對數據計算進行優化處理,包括:
- mapPartition:一次處理一個分區數據,能夠使用mapPartition的盡量使用,但是使用時會一次性讀取整個分區數據到內存,占內存很大,同理還有foreachRDD、foreachPartition(例如寫入數據庫使用,不用每條打開關閉連接)。
- coalesce:當分區由多變少建議不使用Shuffle而使用coalesce,如果很多變很少可以開啟Shuffle;如果少變多必須開啟Shuffle,否則分區不會執行。filter盡量和coalesce結合使用,降低數據傾斜。如果使用SparkSQL讀取數據,因為初始分區數無法參考spark.default.parallelism則讀取后最好進行重分區(repartition),防止數據傾斜或資源分配不均。
- reduceByKey:盡量使用reduceByKey,而不要使用groupByKey,除非必須使用,例如均值計算,因為前者會本地聚合。