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 查看监控界面