简介: 当一个Spark应用提交到集群上运行时,应用架构包含了两个部分
- Driver Program(资源申请和调度Job执行)
- Executors(运行Job中Task任务和缓存数据),两个都是JVM Process进程
1: Driver程序运行的位置可以通过–deploy-mode 来指定:
明确: Driver指的是The process running the main() function of the application and creating the SparkContext
运行应用程序的main()函数并创建SparkContext的进程
-
client:表示Driver运行在提交应用的Client上(默认)
-
cluster:表示Driver运行在集群中(Standalone:Worker,YARN:NodeManager)
-
cluster和client模式最最本质的区别是:Driver程序运行在哪里。
企业实际生产环境中使用cluster
1. Client(客户端)模式
- DeployMode为Client,表示应用Driver Program运行在提交应用Client主机上
示意图:
Client模式测试圆周率:
SPARK_HOME=/export/server/spark
${SPARK_HOME}/bin/spark-submit \
--master yarn \
--deploy-mode client \
--driver-memory 512m \
--executor-memory 512m \
--num-executors 1 \
--total-executor-cores 2 \
--class org.apache.spark.examples.SparkPi \
${SPARK_HOME}/examples/jars/spark-examples_2.11-2.4.5.jar \
10
Yarn的webUI查看结果:
2. cluster(集群)模式,生产环境用
- DeployMode为Cluster,表示应用Driver Program运行在集群从节点某台机器上
示意图:
圆周率测试:
SPARK_HOME=/export/server/spark
${SPARK_HOME}/bin/spark-submit \
--master yarn \
--deploy-mode cluster \
--driver-memory 512m \
--executor-memory 512m \
--num-executors 1 \
--total-executor-cores 2 \
--class org.apache.spark.examples.SparkPi \
${SPARK_HOME}/examples/jars/spark-examples_2.11-2.4.5.jar \
10
yarn的webUI:
进入该任务里面查看log
总结:
Client模式和Cluster模式最最本质的区别是:Driver程序运行在哪里。
- Client模式:测试时使用,开发不用,了解即可
1.Driver运行在Client上,和集群的通信成本高
2.Driver输出结果会在客户端显示 - Cluster模式:生产环境中使用该模式
1.Driver程序在YARN集群中,和集群的通信成本低
2.Driver输出结果不能在客户端显示
3.该模式下Driver运行ApplicattionMaster这个节点上,由Yarn管理,如果出现问题,yarn会重启ApplicattionMaster(Driver)
3. 两种模式的详细流程图
client模式图示:
在YARN Client模式下,Driver在任务提交的本地机器上运行
- Driver在任务提交的本地机器上运行,Driver启动后会和ResourceManager通讯申请启动ApplicationMaster;
- 随后ResourceManager分配Container,在合适的NodeManager上启动ApplicationMaster,此时的ApplicationMaster的功能相当于一个ExecutorLaucher,只负责向ResourceManager申请Executor内存;
- ResourceManager接到ApplicationMaster的资源申请后会分配Container,然后ApplicationMaster在资源分配指定的NodeManager上启动Executor进程;
- Executor进程启动后会向Driver反向注册,Executor全部注册完成后Driver开始执行main函数;
- 之后执行到Action算子时,触发一个Job,并根据宽依赖开始划分Stage,每个Stage生成对应的TaskSet,之后将Task分发到各个Executor上执行。
cluster模式示意图:
在YARN Cluster模式下,Driver运行在NodeManager Contanier中,此时Driver与AppMaster合为一体
- Driver在任务提交的本地机器上运行,Driver启动后会和ResourceManager通讯申请启动ApplicationMaster
- 随后ResourceManager分配Container,在合适的NodeManager上启动ApplicationMaster,此时的ApplicationMaster的功能相当于一个ExecutorLaucher,只负责向ResourceManager申请Executor内存
- ResourceManager接到ApplicationMaster的资源申请后会分配Container,然后ApplicationMaster在资源分配指定的NodeManager上启动Executor进程;
- Executor进程启动后会向Driver反向注册,Executor全部注册完成后Driver开始执行main函数;
- 之后执行到Action算子时,触发一个Job,并根据宽依赖开始划分Stage,每个Stage生成对应的TaskSet,之后将Task分发到各个Executor上执行
附录: Spark集群中的角色
- 1)Driver:是一个JVM Process 进程,编写的Spark应用程序就运行在Driver上,由Driver进程执行;
- 2)Master(ResourceManager):是一个JVM Process 进程,主要负责资源的调度和分配,并进行集群的监控等职责;
- 3)Worker(NodeManager):是一个JVM Process 进程,一个Worker运行在集群中的一台服务器上,主要负责两个职责,一个是用自己的内存存储RDD的某个或某些partition;另一个是启动其他进程和线程(Executor),对RDD上的partition进行并行的处理和计算。
- 4)Executor:是一个JVM Process 进程,一个Worker(NodeManager)上可以运行多个Executor,Executor通过启动多个线程(task)来执行对RDD的partition进行并行计算,也就是执行我们对RDD定义的例如map、flatMap、reduce等算子操作。