1. 程式人生 > >spark優化---提高並行度

spark優化---提高並行度

簡介:
     並行度就是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,那麼同時在執行的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的資料就可以。
設定依據:
      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。
      3.因為實際情況,與理想情況不同的,有些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()
    conf.set("spark.default.parallelism", "500")