11.Spark性能調優之資源分配

 性能優化王道就是給更多資源!機器更多了,CPU更多了,內存更多了,性能和速度上的提升,是顯而易見的。基本上,在一定範圍之內,增加資源與性能的提升,是成正比的;寫完了一個複雜的spark作業之後,
進行性能調優的時候,首先第一步,我覺得,就是要來調節最優的資源配置;在這個基礎之上,
如果說你的spark作業,能夠分配的資源達到了你的能力範圍的頂端之後,無法再分配更多的資源了,
公司資源有限;那麼纔是考慮去做後面的這些性能調優的點。
    
   大體上這兩個方面:core    mem

問題:

1、分配哪些資源?
2、在哪裏分配這些資源?
3、爲什麼多分配了這些資源以後,性能會得到提升?

答案:

1、分配哪些資源?
   executor、core per executor、memory per executor、driver memory
2、在哪裏分配這些資源?
   在我們在生產環境中,提交spark作業時,用的spark-submit shell腳本,裏面調整對應的參數
/usr/local/spark/bin/spark-submit \
--class cn.spark.sparktest.core.WordCountCluster \
--num-executors 3 \  配置executor的數量
--executor-memory 100m \  配置每個executor的內存大小
--executor-cores 3 \  配置每個executor的cpu core數量
--driver-memory 100m \  配置driver的內存(影響很大)
/usr/local/SparkTest-0.0.1-SNAPSHOT-jar-with-dependencies.jar \
3、調節到多大,算是最大呢?
第一種,Spark Standalone,公司集羣上,搭建了一套Spark集羣,你心裏應該清楚每臺機器還能夠
給你使用的,大概有多少內存,多少cpu core;那麼,設置的時候,就根據這個實際的情況,
去調節每個spark作業的資源分配。比如說你的每臺機器能夠給你使用4G內存,2個cpu core;
20臺機器;executor,20;平均每個executor:4G內存,2個cpu core。
 
第二種,Yarn。資源隊列。資源調度。應該去查看,你的spark作業,要提交到的資源隊列,  
 hadoop   spark  storm 每一個隊列都有各自的資源(cpu mem)
大概有多少資源?500G內存,100個cpu core;executor,50;平均每個executor:10G內存,2個cpu core。
 
Spark-submit的時候怎麼指定資源隊列?  --conf spark.yarn.queue default
設置隊列名稱:spark.yarn.queue default
 
一個原則,你能使用的資源有多大,就儘量去調節到最大的大小(executor的數量,幾十個到上百個不等;
executor內存;executor cpu core)
4、爲什麼調節了資源以後,性能可以提升?
增加executor:
   如果executor數量比較少,那麼,能夠並行執行的task數量就比較少,就意味着,我們的Application的並行執行的能力就很弱。
   比如有3個executor,每個executor有2個cpu core,那麼同時能夠並行執行的task,就是6個。6個執行完以後,再換下一批6個task。增加了executor數量以後,那麼,就意味着,能夠並行執行的task數量,也就變多了。比如原先是6個,現在可能可以並行執行10個,甚至20個,100個。那麼並行能力就比之前提升了數倍,數十倍。相應的,性能(執行的速度),也能提升數倍~數十倍。
 
增加每個executor的cpu core:
   也是增加了執行的並行能力。原本20個executor,每個才2個cpu core。能夠並行執行的task數量,
就是40個task。現在每個executor的cpu core,增加到了5個。能夠並行執行的task數量,就是100個task。執行的速度,提升了2倍左右。
 
增加每個executor的內存量:
增加了內存量以後,對性能的提升,有三點:
   1、如果需要對RDD進行cache,那麼更多的內存,就可以緩存更多的數據,將更少的數據寫入磁盤
甚至不寫入磁盤。減少了磁盤IO
   2、對於shuffle操作,reduce端,會需要內存來存放拉取的數據並進行聚合。如果內存不夠,也會寫入磁盤。如果給executor分配更多內存以後,就有更少的數據,需要寫入磁盤,甚至不需要寫入磁盤。減少了磁盤IO,提升了性能。
   3、對於task的執行可能會創建很多對象。如果內存比較小,可能會頻繁導致JVM堆內存滿了,
然後頻繁GC,垃圾回收,minor GC和full GC。(速度很慢)。內存加大以後,帶來更少的GC,垃圾回收,
避免了速度變慢,性能提升



本文轉自:這裏

發佈了13 篇原創文章 · 獲贊 25 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章