spark cluster和spark client的区别

张映 发表于 2019-03-21

分类目录: hadoop/spark/scala

标签:, , ,

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工作流

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工作流

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模式。



转载请注明
作者:海底苍鹰
地址:http://blog.51yip.com/hadoop/2109.html