Spark中Standalone有两种提交模式,一个是Standalone-client模式,一个是Standalone-cluster模式。
1.Standalone-client提交任务方式
提交命令
./spark-submit --master spark://node01:7077 --class org.apache.spark.examples.SparkPi ../lib/spark-examples-1.6.0-hadoop2.6.0.jar 100
或者
./spark-submit --master spark://node01:7077 --deploy-mode client --class org.apache.spark.examples.SparkPi ../lib/spark-examples-1.6.0-hadoop2.6.0.jar 100
解释:–class org.apache.spark.examples.SparkPi 是main函数
执行流程
1.集群启动,worker向master汇报情况,master掌握了worker的工作情况;
2.client模式提交任务后,会在客户端启动Driver进程;Driver会向Master申请启动Application启动的资源。
3.资源申请成功,Driver端将task发送到worker端执行。
4.worker将task执行结果返回到Driver端。(由代码设置)
总结
client模式适用于测试调试程序。Driver进程是在客户端启动的,这里的客户端就是指提交应用程序的当前节点。在Driver端可以看到task执行的情况。
生产环境下不能使用client模式,是因为:假设要提交100个application到集群运行,Driver每次都会在client端启动,那么就会导致客户端100次网卡流量暴增的问题。(因为要监控task的运行情况,会占用很多端口,如上图的结果图)客户端网卡通信,都被task监控信息占用。
Client端作用
1.任务的分发。
2.结果的回收。(可能)
3.监控task执行情况。
4.任务的重试
2.Standalone-cluster提交任务方式
提交命令
./spark-submit --master spark://node01:7077 --deploy-mode cluster --class org.apache.spark.examples.SparkPi ../lib/spark-examples-1.6.0-hadoop2.6.0.jar 100
1.当在客户端提交多个application时,Driver会在Woker节点上随机启动,这种模式会将单节点的网卡流量激增问题分散到集群中。在客户端看不到task执行情况和结果。要去webui中看。
2.cluster模式适用于生产环境
3.Master模式先启动Driver,再启动Application。
注意:Standalone-cluster提交方式,应用程序使用的所有jar包和文件,必须保证所有的worker节点都要有,因为此种方式,spark不会自动上传包。
解决办法:
将所有的依赖包和文件打到同一个包中,然后放在hdfs上。
将所有的依赖包和文件各放一份在worker节点上。
执行流程
1.集群启动,worker向master汇报工作情况,master掌握集群资源;
2.客户端使用命令spark-submit --deploy-mode cluster 后会启动spark-submit进程
3.此进程为Driver向Master申请资源,Driver进程默认需要1G内存和1Core
4.Master会随机在一台worker节点来启动Driver进程
5.Driver启动成功后,spark-submit关闭,然后Driver向Master申请资源
6.Master接收到请求后,会在资源充足的worker节点上启动Executor进程
7.Driver分发Task到Executor中执行
总结
1.当在客户端提交多个application时,Driver会在Woker节点上随机启动,这种模式会将单节点的网卡流量激增问题分散到集群中。在客户端看不到task执行情况和结果。要去webui中看。
2.cluster模式适用于生产环境
3.Master模式先启动Driver,再启动Application。
须知
spark shell 模式是以client提交的(第一种),所以不能加入--deploy-mode cluster的(第二种) client方式用于测试环境,用于方便查看结果,因为 spark shell 模式以client方式提交,所以 spark shell 模式不支持--deploy-mode cluster提交
使用StandAlone集群的话:
1.不需要开启HDFS,但保证需要执行的Application的包,每个节点都有
2.都需要spark的包
3.不能开启yarn集群
yarn和Stand alone都是资源管理的,同时开启会造成资源隔离和资源抢夺