實際項目中調節並行度
並行度概述
其實就是指的是,Spark作業中,各個stage的task數量,也就代表了Spark作業的在各個階段(stage)的並行度
spark架構一覽

如果不調節並行度,導致並行度過低,會怎么樣?
假設,現在已經在spark-submit腳本里面,給我們的spark作業分配了足夠多的資源,比如50個executor,每個executor有10G內存,每個executor有3個cpu core。基本已經達到了集群或者yarn隊列的資源上限。
task沒有設置,或者設置的很少,比如就設置了,100個task。50個executor,每個executor有3個cpu core,也就是說,你的Application任何一個stage運行的時候,都有總數在150個cpu core,可以並行運行。但是你現在,只有100個task,平均分配一下,每個executor分配到2個task,ok,那么同時在運行的task,只有100個,每個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的數據就可以。
很簡單的道理,只要合理設置並行度,就可以完全充分利用你的集群計算資源,並且減少每個task要處理的數據量,最終,就是提升你的整個Spark作業的性能和運行速度
設置spark作業並行度
-
task數量,至少設置成與Spark application的總cpu core數量相同(最理想情況,比如總共150個cpu core,分配了150個task,一起運行,差不多同一時間運行完畢)
-
官方是推薦,task數量,設置成spark application總cpu core數量的2~3倍,比如150個cpu core,基本要設置task數量為300~500;
-
實際情況,與理想情況不同的,有些task會運行的快一點,比如50s就完了,有些task,可能會慢一點,要1分半才運行完,所以如果你的task數量,剛好設置的跟cpu core數量相同,可能還是會導致資源的浪費,因為,比如150個task,10個先運行完了,剩余140個還在運行,但是這個時候,有10個cpu core就空閑出來了,就導致了浪費。那如果task數量設置成cpu core總數的2~3倍,那么一個task運行完了以后,另一個task馬上可以補上來,就盡量讓cpu core不要空閑,同時也是盡量提升spark作業運行的效率和速度,提升性能
-
設置一個Spark Application的並行度
spark.default.parallelism
SparkConf conf = new SparkConf()
.set("spark.default.parallelism", "500")
小結
越平凡的技術點越是重中之重,看起來沒有那么“炫酷”,但是其實是你每次寫完一個spark作業,進入性能調優階段的時候,應該優先調節的事情,就是這些(大部分時候,可能資源和並行度到位了,spark作業就很快了,幾分鍾就跑完了)
