您好,登錄后才能下訂單哦!
并行度:其實就是指的是,Spark作業中,各個stage的task數量,也就代表了Spark作業的在各個階段(stage)的并行度。
如果不調節并行度,導致并行度過低,會怎么樣?
假設,現在已經在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作業的性能和運行速度。
1、task數量,至少設置成與Spark application的總cpu core數量相同(最理想情況,比如總共150個cpu core,分配了150個task,一起運行,差不多同一時間運行完畢)
2、官方是推薦,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作業運行的效率和速度,提升性能。
3、如何設置一個Spark Application的并行度?
spark.default.parallelism
SparkConf conf = new SparkConf()
.set("spark.default.parallelism", "500")
“重劍無鋒”:真正有分量的一些技術和點,其實都是看起來比較平凡,看起來沒有那么“炫酷”,但是其實是你每次寫完一個spark作業,進入性能調優階段的時候,應該優先調節的事情,就是這些(大部分時候,可能資源和并行度到位了,spark作業就很快了,幾分鐘就跑完了)
“炫酷”:數據傾斜(100個spark作業,最多10個會出現真正嚴重的數據傾斜問題),感冒和發燒,你不能上來就用一些偏方(×××,用癩蛤蟆熬煮湯藥);JVM調優;
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。