本文主要从spark-submit提交到spark集群和yarn两个方向进行介绍
当通过Spark-Submit方式提交任务到Spark集群中, 采用client的部署模式
1- 启动Driver程序
2- 将整个python代码加载到Driver程序中, 然后根据python中sc创建代码基于py4j映射为 java代码. 构建sc对象
3- Driver程序根据提交资源参数信息, 向Master申请资源(executor)
4- Master根据要申请资源, 返回给Driver程序
executor1: node1 1核 1GB
executor2: node3 1核 1GB
5- Driver程序连接对应worker节点, 让其启动executor, 并占用相关的资源 同时, worker节点启动后, 反向注册回Driver(通知)
6- 当Driver程序接收到各个executor都已经启动完成了, 接下来Driver开始进行任务分配工作:
6.1 Driver根据RDD之间依赖的关系,形成一个DAG执行流程图,并且划分为多个stage阶段, 并且还要确定每一个阶段要运行多少个线程
6.2 根据每个阶段的线程, 进行任务分配, 将各个线程尽量的均匀分配各个executor
6.3 分配完成后, 将各个线程需要执行的任务推送给executor
6.4 Driver负责监控各个executor是否执行完成
7- executor 接收到任务后, 开始运行, 但是由于代码是python, 所以executor无法直接运行, 此时调用python解析器, 运行python代码. executor中各个线程接收对应相关结果即可
8- 如何任务最后要求将结果返回给Driver, 此时将最终的结果返回, 如果是直接输出, 那么输出即可
9- 当Driver接收到各个executor的线程执行完成后, 接收返回值(如果有), 开始执行后续的非RDD的代码即可, 如果后续执行触发关闭sc对象, 直接关闭 同时通知Master 整个应用执行完成, 如果没有遇到, 一直占用