1. 本地Master负责调度资源
1.1 命令行
bin/spark-submit --class cn.spark.com.WordCountForHDFS \
--master spark:node01:8080 \
--executor-memory 1g \
--total-executor-cores 4 \
/root/spark-root-1.0-SANPSHOT.jar \
/test.txt /out-spark-hdfs123
1.2 执行流程

- 通过启动sparkContext(程序运行的main方法).向资源管理器注册, 并申请每个executor执行的内存, 以及总的executor和核数(spark的交互方式), 以下三种模式对应的资源管理器不同
- master–> master
- yarn–>resourceManager
- mesos–>mesos
- 资源管理器为每个数据的每个分区分配资源,并启动executor, executor汇报资源情况给资源管理器
- sc 构建DAG–>DAG schedule 切割stages(taskSet)–>TASK schedule–> 提交task(脚本&.jar&参数) -->Executor executor向sc申请task
- master–>task schedule
- spark on yarn --> yarnClusterSchedule
- tasks 在每个分区的executor中运行, 运行完毕释放资源
2. Spark on yarn_cluster模式
2.1 命令行
bin/spark-submit --class cn.spark.com.WordCountForHDFS \
--master yarn-cluster \
--executor-memory 1g \
--total-executor-cores 4 \
/root/spark-root-1.0-SNAPSHOT.jar
/test.txt /out-spark-hdfs123v
2.2 运行流程
- application master: SparkContext&executor)运行在application master中
- application master是nodeManager向resourceManager申请下来的, 启动在nodeManager中.
- 关闭client, 不影响application的运行
- resourceManager负责分配资源,application master负责任务的分配

- Spark Yarn Client向Yarn中提交应用程序, 包括ApplicationMaster程序,启动ApplicationMaster的命令, 需要在Execturo中运行的程序
也就是Jar包和资源到hdfs - Spark Yarn Client向RescourceManager提交请求.
- ResourceManager收到请求后, 在集群中选择一个NodeManager, 申请ApplicationMaster
- NodeManager启动ApplicationMaster, 用于分配后续任务的执行
- ApplicationMaster启动调度器, DAGScheduler和YarnClousterScheduler, ApplicationMaster调度任务其实本质上是这两个调度器在调度任务.
- ApplicationMaster启动后, 向ResourceManager申请Container, Container是真正执行任务的场所.
- ResourceManager接到了ApplicationMaster的请求,给NodeManager分配Container.
- NodeManager启动申请到的Container.
- YarnClousterScheduler对Worker分配工作.
- Spark的Worker, 启动Executor, Executor从hdfs上读取分片数据,执行任务.
3. Sparn on Yarn_client
3.1 命令行
bin/spark-submit \
--class cn.spark.com.WordCountForHDFS \
--master yarn_client \
--executor-memory 1g \
--total-executor-cores 4 \
/root/spark-root-1.0-SNAPSHOT.jar \
/test.txt \
/out-spark-hdfs123v
3.2 执行流程图解
- Spark Yarn Client 向 YARN 的 ResourceManager 申请启动 Application Master。同时在 SparkConten始化中将创建 DAGScheduler 和 TASKScheduler 等,由于我们选择的是 Yarn-Client 模式,程序会选YarnClientClusterScheduler 和 YarnClientSchedulerBackend;
- ResourceManager 收到请求后,在集群中选择一个 NodeManager,为该应用程序分配第一个 Contain要 求 它 在 这 个 Container 中 启 动 应 用 程 序 的 ApplicationMaster , 与 YARN-Cluster 区 别 的 是 在 ApplicationMaster 不运行 SparkContext,只与 SparkContext 进行联系进行资源的分派;
- Client 中的 SparkContext 初始化完毕后,与 ApplicationMaster 建立通讯,向 ResourceManager 注册根据任务信息向 ResourceManager 申请资源(Container);
- 一旦 ApplicationMaster 申请到资源(也就是 Container)后,便与对应的 NodeManager 通信,要在获得的 Container 中启动启动 CoarseGrainedExecutorBackend,CoarseGrainedExecutorBackend 启动后会Client 中的 SparkContext 注册并申请 Task;
- Client 中 的 SparkContext 分 配 Task 给 CoarseGrainedExecutorBackend 执 行 CoarseGrainedExecutorBackend 运行 Task 并向 Driver 汇报运行的状态和进度,以让 Client 随时掌握各个务的运行状态,从而可以在任务失败时重新启动任务;
- 应用程序运行完成后,Client 的 SparkContext 向 ResourceManager 申请注销并关闭自吉己
4. Yarn_client和Yarn_cluster区别
- 理解Yarn_client和Yarn_cluster深层次的区别之前先清楚一个概念: ApplicationMaster. 在Yarn, 每个Appliaction实例都有一个ApplicationMaster进程, 它是Application启动的第一个容器. AppMaster负责和ResourceManager打交道并且申请资源, 获取资源后告诉NodeManager为自己启动Container. 从深层次的含义将Yarn_cluster和Yarn_client模式的区别其实就是ApplicationMaster进程的区别.
- Yarn_Cluster模式下,Driver运行在AM(ApplicationMaster)中, AM它负责向Yarn申请资源, 并监督作业的运行状况. 当用户提交了作业之后, 就可以关掉Client, 作业会继续在Yarn上运行, 因而Yarn_cluster模式不适合运行交互类型的作业.
- Yarn_client模式下, ApplicationMaster仅仅向Yarn请求Executor, Client会和Container通信来调度工作, 因此Client不能关闭.