1. 程式人生 > >Spark調優之並行度那些事~

Spark調優之並行度那些事~

Spark調優之調節並行度

一、並行度概念:就是指的是Spark作業中,各個stage的task數量,代表了Spark作業的各個階段(Stage)的並行度。
二、試想如果不調節並行度,導致並行度過低,會怎麼樣?
比如現在spark-submit腳本里面,給我們的spark作業分配了足夠多的資源,比如50個executor,每個executor有10G記憶體,每個executor有3個cpu core。基本已經達到了叢集或者yarn佇列的資源上限。task沒有設定,或者設定的很少,比如就設定了100個task,你的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”)


四、個人感悟
一些調優的方法,主要還看你的使用的場景;尋找一種合適的調優方案,將會使執行速度提升很多。調優是專案過程中,不可缺少的一個環節,如果需求程式碼過於繁瑣,可能會嚴重影響執行速度,最終導致使用者體驗極差!