Spark on yarn 的兩種模式不同之處:
1.進程名字不同
Cluster模式:
CoarseGrainedExecutorBackend : 幹活的程序員
ApplicationMaster: 程序的主控進程 driver就運行在該進程中
Client 模式:
SparkSubmit
CoarseGrainedExecutorBackend : 幹活的程序員
ExecutorLauncher: 管理executor
- 提交命令的不同
spark2.x:
Client模式:
spark-submit --master yarn --deploy-mode client
Cluster模式:
spark-submit --master yarn --deploy-mode cluster
補充:spark1.x的提交命令:
spark-submit --master yarn-client
spark-submit --master yarn-cluster
- driver運行的位置不同
Cluster模式:
driver運行在yarn的一個nodemanager中,driver掛掉還能在其他nodemanager中啓動。
Client模式:
driver運行在客戶端窗口,客戶端掛掉,程序將掛掉不會重啓。
- 資源分配的進程不同
Cluster模式:
ApplicationMaster進程進行資源分配和executor的啓動。
Client模式:
ExecutorLauncher進程進行資源分配和executor的啓動。
圖1.各個集羣模式下的進程對比
- 提交命令不同
Spark on yarn的cluster的提交命令:
spark-submit \ --driver-memory 512m \ #applicationMaster所在容器的內存 --driver-cores 2 \ #applicationMaster所在容器的核數 --executor-cores 2 \ #executor所在容器的核數 --executor-memory 2g \ --num-executors 10000 \ #最多能啓動的executor數量 --class org.apache.spark.examples.SparkPi \ --master yarn \ --deploy-mode cluster \ /root/apps/spark-2.2.0-bin-hadoop2.7/examples/jars/spark-examples_2.11-2.2.0.jar 10000 |
Spark on yarn的client的提交命令:
spark-submit \ --conf spark.yarn.am.memory=1g \ #ExecutorLauncher所在容器的內存 --conf spark.yarn.am.cores=3 \ #ExecutorLauncher所在容器的核數 --executor-cores 2 \ --executor-memory 2g \ --num-executors 10000 \ --class org.apache.spark.examples.SparkPi \ --master yarn \ --deploy-mode client\ /root/apps/spark-2.2.0-bin-hadoop2.7/examples/jars/spark-examples_2.11-2.2.0.jar 10000 |
6.yarn的資源分配不一樣
Spark on yarn的資源分配:
但每一個executor真正申請的資源數量是:是由 –executor-memory 和spark.yarn.executor.memoryOverhead共同決定的。
memoryOverhead=384MB
每個executor要分配的堆外內存量。這個內存,可以解決諸如VM開銷,其他本機開銷等問題。
spark.yarn.executor.memoryOverhead的值,是參數分配值的0.1倍,最少384MB。
每一個executor的資源是max((--executor-memory)*0.1,384)+(--executor-memory),
因爲最終是要提交到yarn的container中,所以最終要聽從yarn的管理。
Yarn中有個最小 yarn.scheduler.minimum-allocation-mb 參數爲1024mb
(參考:
http://hadoop.apache.org/docs/r2.8.4/hadoop-yarn/hadoop-yarn-common/yarn-default.xml)
因爲每一個container實際消耗的內存爲1024的整數倍;
所以每一個executor的內存實際爲:
注意:如果默認的yarn最小資源改變則此處以下的1024都要改成自己設置的參數。
ceil( ( max((--executor-memory)*0.1,384)+(--executor-memory) )/1024)*1024
Cluster模式:
Driver端使用的內存資源:
driver=ceil(((driver-memory *0.1 >384? driver-memory *0.1:384)+driver-memory)/1024)*1024
executor端使用的內存資源:
executor=ceil(((executor-memory *0.1 >384? executor-memory *0.1:384)+executor-memory)/1024)*1024*(實際啓動的executor個數)
總消耗 sum_memory=driver+exector
Client模式:
Driver端使用的內存資源:
driver=ceil(((spark.yarn.am.memory *0.1 >384? spark.yarn.am.memory *0.1:384)+spark.yarn.am.memory)/1024)*1024
executor端使用的內存資源:
executor=ceil(((executor-memory *0.1 >384? executor-memory *0.1:384)+executor-memory)/1024)*1024*(實際啓動的executor個數)
總消耗 sum_memory=driver+exector
補充:圖2.spark on yarn 查看監控界面