寫在前面的一些”廢話“:
最近在做spark的項目瑰艘,雖然項目基本功能都實現(xiàn)了像屋,但是在真正的成產(chǎn)環(huán)境中去運行崭放,發(fā)現(xiàn)程序運行效率異常緩慢鬼吵;迫于無奈(實際是自己都不忍直視了)扣甲,所以決定對程序做一番優(yōu)化操作。在網(wǎng)上查看了不上關(guān)于spark程序的優(yōu)化方法,但是都比較分散不夠全面琉挖,所以決定就自己編寫的基于Java的spark程序启泣,記錄一下我所做過的一些優(yōu)化操作,加深印象方面以后的項目調(diào)優(yōu)使用示辈。這是一個Spark系列的優(yōu)化操作寥茫,包括了很多方面,歡迎大家一塊討論學習矾麻。好了纱耻,廢話好像有點多,下面開始進入正題:
關(guān)于spark最基本的優(yōu)化就是盡量給spark作業(yè)分配盡量多的資源供spark程序使用险耀,一般只有在拿不到更多的資源供spark作業(yè)使用的時候膝迎,才會去考慮在其他方面對spark作業(yè)進行優(yōu)化(好像有點像廢話)。那么本片文章中介紹的調(diào)優(yōu)主要是幾個在提交任務的時候設(shè)定的參數(shù)胰耗,在介紹本文的內(nèi)容之前限次,首先提出幾個問題:
問題一:有哪些資源可以分配給spark作業(yè)使用?
問題二:在什么地方分配資源給spark作業(yè)柴灯?
問題三:為什么分配了這些資源以后卖漫,我們的spark作業(yè)的性能就會得到提升呢?
接下來我們就圍繞這三個問題展開討論赠群。
第一個問題:那些資源可以分配給spark作業(yè)羊始?
答案:executor個數(shù),cpu per exector(每個executor可使用的CPU個數(shù))查描,memory per exector(每個executor可使用的內(nèi)存)突委,driver memory
第二個問題:我們在什么地方分配這些資源?
答案:很簡單冬三,就是在我們提交spark作業(yè)的時候的腳本中設(shè)定匀油,具體如下(這里以我的項目為例):
/usr/local/spark/bin/spark-submit \
--class ?com.xingyun.test.WordCountCluster \
--num-executors ? ?3 ? ? ? ? ? ? \*配置executor的數(shù)量 *\
--driver-memory ? ?100m ? ? ? \*配置driver的內(nèi)存(影響不大)*\
--executor-memory ? 100m ? \*配置每個executor的內(nèi)存大小 *\
--executor-cores ? 3 ? ? ? ? ? ? ? \*配置每個executor的cpu core數(shù)量 *\
/usr/local/SparkTest-0.0.1-SNAPSHOT-jar-with-dependencies.jar ?\
我們該如何設(shè)定這些參數(shù)的大小呢?下面分兩種情況討論勾笆。
case1:把spark作業(yè)提交到Spark Standalone上面敌蚜。一般自己知道自己的spark測試集群的機器情況。舉個例子:比如我們的測試集群的機器為每臺4G內(nèi)存窝爪,2個CPU core弛车,5臺機器。這里以可以申請到最大的資源為例蒲每,那么 ?--num-executors ?參數(shù)就設(shè)定為 5纷跛,那么每個executor平均分配到的資源為:--executor-memory 參數(shù)設(shè)定為4G,--executor-cores 參數(shù)設(shè)定為 2 邀杏。
case2:把spark作業(yè)提交到Y(jié)arn集群上去贫奠。那就得去看看要提交的資源隊列中大概還有多少資源可以背調(diào)度。舉個例子:假如可調(diào)度的資源配置為:500G內(nèi)存,100個CPU core叮阅,50臺機器刁品。?--num-executors ?參數(shù)就設(shè)定為 50泣特,那么每個executor平均分配到的資源為:--executor-memory 參數(shù)設(shè)定為 10G浩姥,--executor-cores 參數(shù)設(shè)定為 2
第三個問題:為什么分配了這些資源以后,我們的spark作業(yè)的性能就會得到提升呢状您?
首先勒叠,先來看一張圖:
Spark程序啟動的時候,SparkContext膏孟,DAGScheduler眯分,TaskScheduler會將我們的RDD算子切割成一個個的Taskset(一系列的task任務),然后提交到Application的executor上面去執(zhí)行柒桑。
基于此有如下兩點說明:
第一:增加每個executor的cpu core弊决,也是增加了執(zhí)行的并行能力。假定原本20個executor魁淳,每個2個cpu core飘诗。能夠并行執(zhí)行的task數(shù)量,就是40個task〗绻洌現(xiàn)在每個executor的cpu core昆稿,增加到了5個。能夠并行執(zhí)行的task數(shù)量息拜,就是100個task溉潭。執(zhí)行的速度,提升了2.5倍少欺。增加Exector的道理也是一樣的喳瓣。第二:增加每個executor的內(nèi)存量。
第二:增加了內(nèi)存量以后赞别,對性能的提升有兩點夫椭。
? ? ? ? 1.如果需要對RDD產(chǎn)生的結(jié)果進行cache操作,那么內(nèi)存越大氯庆,我們可以緩存的內(nèi)容就越多蹭秋,寫入磁盤的數(shù)據(jù)就越少。從而減小了磁盤的IO堤撵。
? ? ? ?2.對于task的執(zhí)行仁讨,會創(chuàng)建很多的臨時對象,這些對象全部都在內(nèi)存中实昨,如果內(nèi)存比較小洞豁,可能會導致頻繁的GC(minor GC,full GC),從而導致程序運行緩慢,將內(nèi)存變大以后丈挟,會是的GC次數(shù)減少刁卜,從而提高了程序的運行速度。
本片文章到這里基本就完了曙咽,后面會不定期的更新關(guān)于spark調(diào)優(yōu)的一些文章蛔趴,希望可以一塊討論學習。歡迎關(guān)注例朱。
如需轉(zhuǎn)載孝情,請注明: