Spark的三种提交模式
- Spark内核架构,其实就是第一种模式,standalone模式,基于Spark自己的Master-Worker集群
- 第二种,是基于YARN的yarn-cluster模式
- 第三种,是基于YARN的yarn-client模式。
如果,你要切换到第二种和第三种模式,很简单,将我们之前用于提交spark应用程序的spark-submit脚本,加上–master参数,设置为yarn-cluster,或yarn-client,即可。如果你没设置,那么,就是standalone模式。
yarn-cluster提交任务方式
yarn-cluster提交模式:
- spark-submit提交,发送请求到ResourceManager请求启动ApplicationMaster;
- ResourceManager分配container在某个nodemanager上,启动ApplicationMaster(相当于Driver);
- ApplicationMaster找到ResourceManager,进行反注册,请求container启动executor;
- ResourceManager分配一批container给ApplicationMaster用于启动executor
- ApplicationMaster连接其他NodeManager来启动executor,这里的NodeManager相当于Worker。
- executor启动后向ApplicationMaster反注册。ApplicationMaster发送task到executor
写法:
./spark-submit
--master yarn
--deploy-mode cluster
--class org.apache.spark.examples.SparkPi ../lib/spark-examples-1.6.0-hadoop2.6.0.jar
100
./spark-submit
--master yarn-cluster
--class org.apache.spark.examples.SparkPi ../lib/spark-examples-1.6.0-hadoop2.6.0.jar
100
yarn-client提交任务方式
yarn-client提交模式:
- spark-submit提交,在本地启动Driver进程,并发送请求给ResourceManager,请求ApplicationMaster。
- ResourceManager接收到请求之后分配一个container在某个NodeManager(其实只是一个ExecutorLauncher,相当于ApplicationMaster)。
- ExecutorLanucher向ResourceManager申请container,启动executor;
- ResourceManager分配一批contianer给ApplicationMaster用于启动executor;
- ApplicationMaster直接连接启动NodeManager,用contianer的资源,启动executor;
- Executor启动后,会反向注册给Driver,Driver发送task到Executor,执行情况和结果返回给Driver端。
配置:
在client节点配置中spark-env.sh添加Hadoop_HOME的配置目录即可提交yarn 任务,具体步骤如下:
export HADOOP_HOME=/usr/local/hadoop
注意:client只需要有Spark的安装包即可提交任务,不需要其他配置
写法:
./spark-submit
--master yarn
--class org.apache.spark.examples.SparkPi ../lib/spark-examples-1.6.0-hadoop2.6.0.jar
100
./spark-submit
--master yarn–client
--class org.apache.spark.examples.SparkPi ../lib/spark-examples-1.6.0-hadoop2.6.0.jar
100
./spark-submit
--master yarn
--deploy-mode client
--class org.apache.spark.examples.SparkPi ../lib/spark-examples-1.6.0-hadoop2.6.0.jar
100
Yarn执行一个任务的过程
- 客户端client向ResouceManager提交Application,ResouceManager接受Application并根据集群资源状况选取一个node来启动Application的任务调度器driver(ApplicationMaster)
- ResouceManager找到那个node,命令其该node上的nodeManager来启动一个新的JVM进程运行程序的driver(ApplicationMaster)部分,driver(ApplicationMaster)启动时会首先向ResourceManager注册,说明由自己来负责当前程序的运行
- driver(ApplicationMaster)开始下载相关jar包等各种资源,基于下载的jar等信息决定向ResourceManager申请具体的资源内容。
- ResouceManager接受到driver(ApplicationMaster)提出的申请后,会最大化的满足资源分配请求,并发送资源的元数据信息给driver(ApplicationMaster);
- driver(ApplicationMaster)收到发过来的资源元数据信息后会根据元数据信息发指令给具体机器上的NodeManager,让其启动具体的container。
- NodeManager收到driver发来的指令,启动container,container启动后必须向driver(ApplicationMaster)注册。
- driver(ApplicationMaster)收到container的注册,开始进行任务的调度和计算,直到任务完成。
如果ResourceManager第一次没有能够满足driver(ApplicationMaster)的资源请求,后续发现有空闲的资源,会主动driver(ApplicationMaster)发送可用资源的元数据信息以提供更多的资源用于当前程序的运行。
总结:
Yarn-cluster模式:
Yarn-cluster主要用于生产环境中,因为Driver运行在Yarn集群中某一台nodeManager中,每次提交任务的Driver所在的机器都是随机的,不会产生某一台机器网卡流量激增的现象,缺点是任务提交后不能看到日志,调试不方便,只能通过yarn logs -applicationId application_id
这种命令查看日志。
Yarn-client模式:
Yarn-client模式适用于测试,因为Driver运行在本地,负责调度application,会与yarn集群中的Executor进行大量的通信,会造成客户机网卡流量的大量增加。好处在于,直接执行时,本地可以看到所有的log,方便调试。
停止集群任务命令:yarn application -kill applicationID