一、分配更多資源
性能調優的王道,就是增加和分配更多的資源,性能和速度上會得到很大提升。基本上,在一定的範圍之內,增加的資源和性能的提升是成正比的。所以,性能調優的第一步是增加資源,調節最優的資源配置;第二步,能夠分配的資源達到能力範圍的頂端都,無法再分配更多的資源,需要考慮下面幾個性能調優的點。
二、性能調優的點
①分配哪些資源?
- executor
- cup per executor
- memory per executor
- driver memory
②在哪裏分配資源?
在我們的生產環境中,提交spark作業時,用的spar-submit shell腳本,調整對應的參數
/usr/local/spark/bin/spark-submit \ --class cn.spark.sparktest.core.WordCountCluster \ --num-executors 3 \ 配置executor的數量 --driver-memory 100m \ 配置driver的內存(影響不大) --executor-memory 100m \ 配置每個executor的內存大小 --executor-cores 3 \ 配置每個executor的cpu core數量 /usr/local/SparkTest-0.0.1-SNAPSHOT-jar-with-dependencies.jar \ |
③調節到多大才算最大?
第一種,Spark Standalone,公司的Spark集羣上,根據實際情況,調節每個spark作業的資源分配。比如集羣有30臺機器,每臺機器8G內存,4個cpu core;20個executor;那麼,每個executor分配12G內存,6個cpu core。
第二種,Yarn。spark作業提交到yarn資源隊列執行,需要查看隊列剩下的可以使用的資源。比如500G內存,200個cpu core;50個executor;那麼每個executor分配10G內存,4個cpu core。
三、爲什麼調節了資源之後,性能可以提升?
①增加executor
如果executor的數量少,那麼能夠 並行執行的task數量就會變少,這就意味着Application的並行執行能力比較弱。
比如有3個executor,每個executor有2個cpu core,那麼同時能夠執行的task數量爲6個。執行完當前的6個task後,再執行下一批6個task。
增加了executor後,能夠並行執行的task的數量就會變多,就以爲着性能得到提升。
②增加每個executor的cpu core
根據上面一點,Application的並行執行能力跟每個executor的cpu core數量有關。
比如,原來有20個executor,每個executor有2個cpu core,那麼並行執行的task數量爲40個;
現在還是20個executor,把每個executor的數量增加到5個,那麼並行執行的task數量爲100個,性能提升了2.5倍。
③增加每個executor的內存
增加每個executor的內存,對性能的提升有3點:
- 如果需要對RDD進行cache,更多的內存意味着可以緩存更多的數據,將更少的數據寫入磁盤,甚至不寫入磁盤,減少了磁盤IO,性能得到提升;
- 對於shuffle操作,reduce端需要內存,來存放拉取過來的數據並進行聚合。如果內存不夠,會寫入磁盤。如果給executor分配更多的內存,那麼需要寫入磁盤的數據就會變少,甚至沒有數據需要寫入磁盤,減少了磁盤IO,性能得到提升;
- 對於task的執行,可能需要創建對象。如果內存比較小,可能會導致頻繁的JVM存內存滿了,然後頻繁的GC垃圾回收(minor GC和full GC),導致性能下降。內存加大之後,GC變少了,避免了性能下降,性能得到提升。