参考:http://blog.csdn.net/trigl/article/details/72732241
http://blog.csdn.net/xinganshenguang/article/details/53302526
http://blog.csdn.net/high2011/article/details/67637338
摘要
注意:
spark on yarn 的支持两种模式
1)yarn-cluster:适用于生产环境;
2)yarn-client:适用于交互、调试,希望立即看到app的输出
Yarn-cluster和yarn-client的区别在于appMaster:yarn appMaster,每个yarn app实例有一个appMaster进程,是为app启动的第一个container;负责从ResourceManager请求资源,获取到资源后,告诉NodeManager为其启动container;appMaster消除了active client的需要,app client启动app后可以结束,协调由运行在cluster上被yarn管理的进程继续
Yarn-cluster mode
Spark的dirver 运行在 appMaster中,appMaster进程同时负责driving app,请求资源;
启动spark app的client不需要一直存在于整个spark app运行生命周期
yarn-client mode
某些情况需要与spark交互,要求user input,如spark-shell和pyspark,这样的spark app需要spark-driver运行在初始化spark app的client端进程中
这种情况,appMaster仅仅用于从yarn集群请求executor,app client会和请求的container通信来调度他们工作
总结来说:yarn-client 与yarn-cluster的区别就在于driver所在的位置,yarn-client driver运行在client端 yarn-cluster driver 运行在Application Manager内 client模式适合开发 cluster模式 适合正式环境
其中deploy-mode是针对集群而言的,是指集群部署的模式,根据Driver主进程放在哪分为两种方式:client和cluster,默认是client,下面我们就详细研究一下这两种模式的区别
1. client mode
首先明白几个基本概念:Master节点就是你用来提交任务,即执行bin/spark-submit命令所在的那个节点;Driver进程就是开始执行你Spark程序的那个Main函数,虽然我这里边画的Driver进程在Master节点上,但注意Driver进程不一定在Master节点上,它可以在任何节点;Worker就是Slave节点,Executor进程必然在Worker节点上,用来进行实际的计算
1、client mode下Driver进程运行在Master节点上,不在Worker节点上,所以相对于参与实际计算的Worker集群而言,Driver就相当于是一个第三方的“client”
2、正由于Driver进程不在Worker节点上,所以其是独立的,不会消耗Worker集群的资源
3、client mode下Master和Worker节点必须处于同一片局域网内,因为Drive要和Executorr通信,例如Drive需要将Jar包通过Netty HTTP分发到Executor,Driver要给Executor分配任务等
4、client mode下没有监督重启机制,Driver进程如果挂了,需要额外的程序重启
2. cluster mode
1、Driver程序在worker集群中某个节点,而非Master节点,但是这个节点由Master指定
2、Driver程序占据Worker的资源
3、cluster mode下Master可以使用–supervise对Driver进行监控,如果Driver挂了可以自动重启
4、cluster mode下Master节点和Worker节点一般不在同一局域网,因此就无法将Jar包分发到各个Worker,所以cluster mode要求必须提前把Jar包放到各个Worker几点对应的目录下面
3. 总结
是选择client mode还是cluster mode呢?
一般来说,如果提交任务的节点(即Master)和Worker集群在同一个网络内,此时client mode比较合适
如果提交任务的节点和Worker集群相隔比较远,就会采用cluster mode来最小化Driver和Executor之间的网络延迟