Spark性能調優之合理設置並行度
1.Spark的並行度指的是什么?
task沒有設置,或者設置的很少,比如就設置了,100個task 。 50個executor ,每個executor 有3個core ,也就是說
Application 任何一個stage運行的時候,都有總數150個cpu core ,可以並行運行。但是,你現在只有100個task ,平均分配一下,每個executor 分配到2個task,ok,那么同時在運行的task,只有100個task,每個executor 只會並行運行 2個task。 每個executor 剩下的一個cpu core 就浪費掉了!你的資源,雖然分配充足了,但是問題是, 並行度沒有與資源相匹配,導致你分配下去的資源都浪費掉了。合理的並行度的設置,應該要設置的足夠大,大到可以完全合理的利用你的集群資源; 比如上面的例子,總共集群有150個cpu core ,可以並行運行150個task。那么你就應該將你的Application 的並行度,至少設置成150個,才能完全有效的利用你的集群資源,讓150個task ,並行執行,而且task增加到150個以后,即可以同時並行運行,還可以讓每個task要處理的數量變少; 比如總共 150G 的數據要處理, 如果是100個task ,每個task 要計算1.5G的數據。 現在增加到150個task,每個task只要處理1G數據。
2.如何去提高並行度?
1、task數量,至少設置成與spark Application 的總cpu core 數量相同(最理性情況,150個core,分配150task,一起運行,差不多同一時間運行完畢)官方推薦,task數量,設置成spark Application 總cpu core數量的2~3倍 ,比如150個cpu core ,基本設置 task數量為 300~ 500. 與理性情況不同的,有些task 會運行快一點,比如50s 就完了,有些task 可能會慢一點,要一分半才運行完,所以如果你的task數量,剛好設置的跟cpu core 數量相同,可能會導致資源的浪費,因為 比如150task ,10個先運行完了,剩余140個還在運行,但是這個時候,就有10個cpu core空閑出來了,導致浪費。如果設置2~3倍,那么一個task運行完以后,另外一個task馬上補上來,盡量讓cpu core不要空閑。同時盡量提升spark運行效率和速度。提升性能。
2、如何設置一個Spark Application的並行度?
spark.defalut.parallelism 默認是沒有值的,如果設置了值比如說10,是在shuffle的過程才會起作用(val rdd2 = rdd1.reduceByKey(_+_) //rdd2的分區數就是10,rdd1的分區數不受這個參數的影響)
new SparkConf().set(“spark.defalut.parallelism”,”“500)