一.常用的参数
其中- -deploy-mode默认为client。
二.Standalone模式
-
Standalone-client
./spark-submit --master spark://node1:7077 --deploy-mode client --class org.apache.spark.examples.SparkPi …/examples/jars/spark-examples_2.11-2.4.0.jar 100
在这种模式下,我们能够很清楚的在客户端看到 Driver
与 Worker
的通信,因为此时 Driver
是运行在客户端的。
并且:
Standalone-client
模式会在客户端看到 task
的执行情况,当客户端提交多个 application
时都会启动自己的 driver
,driver
与集群的 worker
有大量的通信,会造成客户端网卡流量激增的问题,这种模式适用于程序测试,不适用于生产环境。
2. Standalone-cluster
./spark-submit --master spark://node1:7077 --deploy-mode cluster --class org.apache.spark.examples.SparkPi …/examples/jars/spark-examples_2.11-2.4.0.jar 100
Standalone-cluster模式driver会在集群的随机一台worker节点上启动。如果提交多个application,那么每个application的driver会分散到集群的worker节点,起到一个分担流量的作用。这种模式适用于生产模式。
三.Yarn模式
1.Yarn-client模式提交任务
./spark-submit --master yarn --deploy-mode client --class org.apache.spark.examples.SparkPi …/examples/jars/spark-examples_2.11-2.4.0.jar 100
与Standalone-client模式一样,会造成流量激增,适合做测试不适合生产。下面是运行流程序列图:
2.Yarn-cluster模式提交任务
./spark-submit --master yarn --deploy-mode cluster --class org.apache.spark.examples.SparkPi …/examples/jars/spark-examples_2.11-2.4.0.jar 100
与Standalone-cluster模式一样,用集群分散网卡流量负担。
下面是运行流程序列图:
四.yarn-cluster和yarn-client提交模式的区别与总结
- ApplicationMaster的作用:
当前的Application申请资源
给nodemanager发送消息 启动Excutor。
任务调度。(这里和client模式的区别是AM具有调度能力,因为其就是Driver端,包含Driver进程) - 如果是yarn-cluster模式,spark-submit在提交的时候请求到ResourceManager,请求来启动ApplicationMaster,ResourceManager接收到请求后会分配一个container,在某个NodeManager上启动ApplicationMaster,ApplicationMaster(AM)启动后会反过来向ResourceManager进行通讯,其实这个ApplicationMaster就相当于是driver,AM找RM请求container,启动excutor,然后RM会分配一批container,用于启动executor,AM链接其他的NM,来启动executor,这里的NM相当于worker,executor向AM反向注册。ResourceManager相当于之前的master。
- yarn-client模式,spark-submit在提交的时候发送给RM,请求启动AM,分配一个container,在某个NM上,启动AM,但是这里的AM只是一个ExecutorLauncher,功能是很有限的。AM启动后会找RM申请container,启动executor,AM链接其他的NM,用container的资源来启动executor。executor会反向注册到本地的driver上。
- 区别:yarn-cluster不会产生某一台机器网卡流量激增的现象,缺点是任务提交后不能看到日志。yarn-cluster的driver相当于就是在NodeManager上的某一个ApplicationMaster;yarn-client的driver还是在本地启动的一个进程,在NodeManager启动的ApplicationMaster只是一个ExecutorLauncher,ExecutorLauncher只会向ResourceManager申请资源,然后用container资源去链接其他的NodeManager,然后去启动executor,executor启动后会反向注册到提交应用程序的本地客户端的driver进程上,通过本地客户端的driver进程里面的DAGScheduler、TaskScheduler会大量进行task的调度,发送到NodeManager上的executor上去执行。