目录
1.Standalone
任务提交流程:
-
Spark-Submit 提交任务给 Master;
-
Master 收到任务请求后,通过 LaunchDriver 向合适的 Worker 请求启动 Driver;
-
Worker 收到请求后启动 Driver;
-
Driver 启动后向 Master 注册用户App信息;
-
Master 收到 App 信息后根据资源的情况向 Worker 发送 launchExecutor 启动 Executor;
-
Worker 收到 Master 的请求后,启动相应的 Executor;
-
Executor 启动后负责与 Driver 通信,执行相关任务;
2.Yarn-Cluster
任务提交流程:
-
Client 向 RM 提交请求,并上传 jar 包到 HDFS 上;这期间包括四个步骤:
-
连接到 RM;
-
从 RM ASM(Applications Manager )中获得 metric、queue、resource 等信息;
-
上传 app jar and spark-assembly jar;
-
设置运行环境和 container 上下文(launch-container.sh等脚本);
-
-
ASM 向 Scheduler 申请空闲 container;
-
Scheduler 向 ASM 返回空闲 container 信息(NM等);
-
RM(ASM)根据返回信息向 NM 申请资源;
-
NM 分配创建一个 container 并创建 Spark Application Master(AM),此时 AM 上运行的是 Spark Driver(每个 SparkContext 都有一个 AM);
-
AM 启动后,和 RM(ASM) 通讯,请求根据任务信息向 RM(ASM) 申请 container 来启动 Executor;
-
RM(ASM) 将申请的资源信息返回给 AM;
-
AM 根据返回的资源信息请求对应的 NM 分配 container 来启动 Executor;
-
NM 收到请求会启动相应的 container 并启动 Executor;
-
Executor 启动成功后,反向向 AM 注册;
-
Executor 和 AM 交互完成任务;
-
后续的 DAGScheduler、TaskScheduler、Shuffle等操作都是和 Standaloe 一样;
-
等到所有的任务执行完毕后,AM 向 ASM 取消注册并释放资源;
3.Yarn-Client
yarn-client模式下,Driver运行在Client上,通过ApplicationMaster向RM获取资源。本地Driver负责与所有的executor container进行交互,并将最后的结果汇总。Driver 是运行在本地客户端,它的 AM 只是作为一个 Executor 启动器,并没有 Driver 进程。而且 Executor启动后是与 Client 端的 Driver 进行交互的,所以 Client 如果挂了 任务也就挂了。