效能優化王道就是給更多資源!機器更多了,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:
比如有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,垃圾**,
避免了速度變慢,效能提公升。
Spark效能調優之分配資源
結論分配更多的資源才是效能調優的王道。在寫完乙個spark作業後,要進行效能調優的時候,第一件事就是調配更多的資源 如果已經分配到你能力範圍內的資源頂端後,公司無法再給你更多資源了 再考慮其他效能優化的點。筆者後面會寫到更多的效能優化的點 1.分配哪些資源?2.給 分配這些資源?3.資源分配到多大,...
Spark效能調優之Shuffle調優總結
spark底層shuffle的傳輸方式是使用netty傳輸,netty在進行網路傳輸的過程會申請堆外記憶體 netty是零拷貝 所以使用了堆外記憶體。shuffle過程中常出現的問題 常見問題一 reduce oom?問題原因 reduce task 去map端獲取資料,reduce一邊拉取資料一邊...
Spark效能調優 之 運算元調優(二)
map 表示每乙個元素 rrd.foreache 表示每乙個元素 rrd.forpartitions 表示每個分割槽的資料組成的迭代器 在生產環境中,通常使用foreachpartition運算元來完成資料庫的寫入,通過foreachpartition運算元的特性,可以優化寫資料庫的效能。如果使用f...