Spark效能優化:提高並行度、使用reduceByKey

豐澤發表於2018-09-14

一、提高並行度

實際上Spark叢集的資源並不一定會被充分利用到,所以要儘量設定合理的並行度,來充分地利用叢集的資源。才能充分提高Spark應用程式的效能。

Spark會自動設定以檔案作為輸入源的RDD的並行度,依據其大小,比如HDFS,就會給每一個block建立一個partition,也依據這個設定並行度。對於reduceByKey等會發生shuffle的操作,就使用並行度最大的父RDD的並行度即可。

可以手動使用textFile()parallelize()等方法的第二個引數來設定並行度;也可以使用spark.default.parallelism引數,來設定統一的並行度。Spark官方的推薦是,給叢集中的每個cpu core設定2~3個task

比如說,spark-submit設定了executor數量是10個,每個executor要求分配2個core,那麼application總共會有20個core。此時可以設定new SparkConf().set("spark.default.parallelism", "60")來設定合理的並行度,從而充分利用資源。

原理圖:

Spark效能優化:提高並行度、使用reduceByKey

二、reduceByKey和groupByKey

val counts = pairs.reduceByKey(_ + _)

val counts = pairs.groupByKey().map(wordCounts => (wordCounts._1, wordCounts._2.sum))

如果能用reduceByKey,那就用reduceByKey,因為它會在map端,先進行本地combine,可以大大減少要傳輸到reduce端的資料量,減小網路傳輸的開銷。

只有在reduceByKey處理不了時,才用groupByKey().map()來替代。

原理圖:

reduceByKey-

Spark效能優化:提高並行度、使用reduceByKey

groupByKey-

Spark效能優化:提高並行度、使用reduceByKey

相關文章