概述
在使用spark-submit
提交Spark任务一般有以下参数:
./bin/spark-submit \
--class <main-class> \
--master <master-url> \
--deploy-mode <deploy-mode> \
--conf <key>=<value> \
... # other options
<application-jar> \
[application-arguments]
其中deploy-mode
是针对集群而言的,是指集群部署模式,根据Driver主进程放在哪分为两种方式:
client mode(默认)
cluster mode
下面我们就详细研究一下这两种模式的区别.
1. Client Mode
首先明白几个基本概念:
Master节点
就是你用来提交任务,即执行bin/spark-submit命令所在的那个节点;Driver进程
就是开始执行你Spark程序的那个Main函数,虽然我这里边画的Driver进程在Master节点上,但注意Driver进程不一定在Master节点上,它可以在任何节点;Worker
就是Slave节点,Executor进程必然在Worker节点上,用来进行实际的计算
- client mode下Driver进程运行在Master节点上,不在Worker节点上,所以相对于参与实际计算的Worker集群而言,Driver就相当于是一个第三方的“client”
- 由于Driver进程不在Worker节点上,所以其是独立的,不会消耗Worker集群的资源
- client mode下Master和Worker节点必须处于同一片局域网内,因为Driver要和Executorr通信,例如Driver需要将Jar包通过Netty HTTP分发到Executor,Driver要给Executor分配任务等
- client mode下没有监督重启机制,Driver进程如果挂了,需要额外的程序重启
2. Cluster Mode
- Driver程序在worker集群中某个节点,而非Master节点,但是这个节点由Master指定
- Driver程序占据Worker的资源
- cluster mode下Master可以使用–supervise对Driver进行监控,如果Driver挂了可以自动重启
- cluster mode下Master节点和Worker节点一般不在同一局域网,因此就无法将Jar包分发到各个Worker,所以cluster mode要求必须提前把Jar包放到各个Worker几点对应的目录下面
- 典型的集群模式,参考集群模式
- 例如
standalone模式
,就是spark自己的一个独立集群,因此属于cluster模式,也就是说,在StandaloneAppClient在向Master注册Application时,不会像AppClient一样去先向Master注册Driver,因为它的Driver注册是交给了它自己指定的Worker。 - 而像
yarn-cluster
这样的,Application不是交给Driver去管理,而是他们自身有例如ApplicationMaster这样的组件去进行管理。
- 例如
3. 总结
client mode or cluster mode?
- 一般来说,如果提交任务的节点(即Master)和Worker集群在同一个网络内,此时client mode比较合适
- 如果提交任务的节点和Worker集群相隔比较远,就会采用cluster mode来最小化Driver和Executor之间的网络延迟