Spark支持Yarn,Mesos,Standalone三种集群部署模式,它们的共同点:Master服务(Yarn ResourceManager,Mesos master,Spark standalone)来决定哪些应用可以运行以及在哪什么时候运行,Slave服务(Yarn NodeManger)运行在每个节点上,节点上实际运行着Executor进程,此外还监控着它们的运行状态以及资源的消耗
Spark On Yarn模式,又分cluster和client模式。cluster和client的最大区别在于,driver运行在哪里。
本篇文章,部分来自网络。
一,yarn-cluster工作流
spark-cluster工作流
yarn-cluster模式下作业执行流程:
1. 客户端生成作业信息提交给ResourceManager(RM)
2. RM在某一个NodeManager(由Yarn决定)启动container并将Application Master(AM)分配给该NodeManager(NM)
3. NM接收到RM的分配,启动Application Master并初始化作业,此时这个NM就称为Driver
4. Application向RM申请资源,分配资源同时通知其他NodeManager启动相应的Executor
5. Executor向NM上的Application Master注册汇报并完成相应的任务
二,yarn-client工作流
spark-client工作流
yarn-client模式下作业执行流程:
1. 客户端生成作业信息提交给ResourceManager(RM)
2. RM在本地NodeManager启动container并将Application Master(AM)分配给该NodeManager(NM)
3. NM接收到RM的分配,启动Application Master并初始化作业,此时这个NM就称为Driver
4. Application向RM申请资源,分配资源同时通知其他NodeManager启动相应的Executor
5. Executor向本地启动的Application Master注册汇报并完成相应的任务
三,spark-cluster和spark-client对比
模式 | 提交模式 | driver(main方法,用户程序) | ApplicationMaster | ResourceManager | NodeManager | Master | Worker | Container | Executor |
---|---|---|---|---|---|---|---|---|---|
spark on yarn(client) | –master yarn –deploy-mode client | driver运行在提交作业的机器上(可以看到程序打印日志) | 运行在某一台机器上,向RM申请资源(container),杀死任务 | 管理资源,接受任务 | 根据RM命令,分配container | 无 | 无 | Container里面运行着Spark Executor | 运行在Container里里面运行Task |
spark on yarn(cluster) | –master yarn –deploy-mode cluster | driver运行在集群上某个机器上(看不到日志,只可以看到running状态),Driver在AppMaster执行 | 运行在集群某一台机器上,申请资源(container),杀死任务. | 管理资源,接受任务 | 根据RM命令,分配container | 无 | 无 | Container里面运行着Spark Executor | 运行在Container里,里面运行Task |
spark-submit提交任务时,
cluster模式,会把jar包,分配到某一个nodemanager中,你是不知道的。但是可以通过命令,或者管理工具,去查找才能知道。并且日志无输出
[root@bigserver3 conf]# ps axu |grep -i jar
root 19676 2.2 3.4 2916432 394984 ? Sl 01:05 0:33 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.191.b12-1.el7_6.x86_64/bin/java -Dproc_nodemanager -Xmx1000m -Dhadoop.log.dir=/home/bigdata/hadoop/logs -Dyarn.log.dir=/home/bigdata/hadoop/logs -Dhadoop.log.file=yarn-root-nodemanager-bigserver3.log -Dyarn.log.file=yarn-root-nodemanager-bigserver3.log -Dyarn.home.dir= -Dyarn.id.str=root -Dhadoop.root.logger=INFO,RFA -Dyarn.root.logger=INFO,RFA -Djava.library.path=/home/bigdata/hadoop/lib/native -Dyarn.policy.file=hadoop-policy.xml -server -Dhadoop.log.dir=/home/bigdata/hadoop/logs -Dyarn.log.dir=/home/bigdata/hadoop/logs -Dhadoop.log.file=yarn-root-nodemanager-bigserver3.log -Dyarn.log.file=yarn-root-nodemanager-bigserver3.log -Dyarn.home.dir=/home/bigdata/hadoop -Dhadoop.home.dir=/home/bigdata/hadoop -Dhadoop.root.logger=INFO,RFA -Dyarn.root.logger=INFO,RFA -Djava.library.path=/home/bigdata/hadoop/lib/native -classpath /home/bigdata/hadoop/etc/hadoop:/home/bigdata/hadoop/etc/hadoop:/home/bigdata/hadoop/etc/hadoop:/home/bigdata/hadoop/share/hadoop/common/lib/*:/home/bigdata/hadoop/share/hadoop/common/*:/home/bigdata/hadoop/share/hadoop/hdfs:/home/bigdata/hadoop/share/hadoop/hdfs/lib/*:/home/bigdata/hadoop/share/hadoop/hdfs/*:/home/bigdata/hadoop/share/hadoop/yarn/lib/*:/home/bigdata/hadoop/share/hadoop/yarn/*:/home/bigdata/hadoop/share/hadoop/mapreduce/lib/*:/home/bigdata/hadoop/share/hadoop/mapreduce/*:/bigdata/hadoop/contrib/capacity-scheduler/*.jar:/bigdata/hadoop/contrib/capacity-scheduler/*.jar:/home/bigdata/hadoop/share/hadoop/yarn/*:/home/bigdata/hadoop/share/hadoop/yarn/lib/*:/home/bigdata/hadoop/etc/hadoop/nm-config/log4j.properties org.apache.hadoop.yarn.server.nodemanager.NodeManager
root 23024 0.0 0.0 113136 1216 ? Ss 01:15 0:00 /bin/bash -c /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.191.b12-1.el7_6.x86_64/bin/java -server -Xmx512m -Djava.io.tmpdir=/bigdata/hadoop/tmp/nm-local-dir/usercache/root/appcache/application_1551675014530_0010/container_e61_1551675014530_0010_02_000001/tmp -Dspark.yarn.app.container.log.dir=/home/bigdata/hadoop/logs/userlogs/application_1551675014530_0010/container_e61_1551675014530_0010_02_000001 org.apache.spark.deploy.yarn.ApplicationMaster --class 'netjoy.spark_sql.track_app.run' --jar file:/home/bigdata/web/target/sparkApp3-1.0-SNAPSHOT.jar --arg 'debug' --properties-file /bigdata/hadoop/tmp/nm-local-dir/usercache/root/appcache/application_1551675014530_0010/container_e61_1551675014530_0010_02_000001/__spark_conf__/__spark_conf__.properties 1> /home/bigdata/hadoop/logs/userlogs/application_1551675014530_0010/container_e61_1551675014530_0010_02_000001/stdout 2> /home/bigdata/hadoop/logs/userlogs/application_1551675014530_0010/container_e61_1551675014530_0010_02_000001/stderr
client模块,jar包跑在本地,进程日志输出,都是可以获取的。可控性比较强。
四,正式环境用spark-cluster,还是spark-client
1,appmanager和nodemanger是不是在同一网段。
2,整个spark on yarn集群节点数,有多少
本人主要参考以上二点;
如果节点数很多,采用spark-cluster,这样可以资源均衡。
如果在appmanager和nodemanger不在同一网段,采用spark-cluster模式,减少网络延迟。
如果节点数少,又在同一网段,client模式和cluster模式,都是可以的。
就算正式环境采用了spark-cluster模式,在刚上线时也要采用spark-client模式,这样可以获取信息,都没有问题了,稳定了,在切换到spark-cluster模式。