spark-6 spark运行架构和任务调度
spark运行架构和任务调度
spark运行架构
简单来讲:driver端划分任务,向资源管理器发送申请资源,executor向driver端(不是MAster)申请task,负责执行任务
-
Driver端向资源管理器Master(可能是HMaster或者yarn的NodeManager)发送注册和申请计算资源的请求
-
Master通知对应的worker节点启动executor进程(计算资源)
-
executor进程向Driver端发送注册并申请task请求
-
Driver端运行客户端的main方法,构建sparkcontext对象,在sparkcontext对象内部一次构建
DAGScheduler
和TaskScheduler
-
按照客户端代码生成rdd的一系列操作顺序,生成DAG有向无环图
-
DAGScheduler拿到DAG有向无环图之后,按照宽依赖进行stage的划分。每一个stage内部有很多可以并行运行的task,最后封装在一个一个的taskSet集合中,然后把taskSet发送给TaskScheduler
-
TaskScheduler得到taskSet集合之后,依次遍历取出每一个task提交到worker节点上的executor进程中运行
-
所有task运行完成,Driver端向Master发送注销请求,Master通知Worker关闭executor进程,Worker上的计算资源得到释放,最后整个任务也就结束了。
几点注意事项:
-
为什么说 Driver端运行客户端的main方法?
- 因为driver端既可能运行在客户端本地也可能运行在集群上,driver端不等同于客户端。
-
谁负责划分任务
- driver端负责划分
- 先生成DAG有向无环图
- 然后根据有向无环图划分stage
- 在把每个stage中的task封装到一个taskset中,同一个taskset中的stage可以并行执行
- driver端负责划分
-
DAGSheduler提交给TaskScheduler的基本单位是什么?、
- taskset
-
executor执行的基本单位是什么?
- 基本单位是task
-
注意第七步
- Master负责资源的调度,当driver和executor都完成注册后,executor直接向driver端的taskscheduler申请task,此处不再经过Master
spark任务调度
-
Driver端运行客户端的main方法,构建SparkContext对象,在SparkContext对象内部依次构建DAGScheduler和TaskScheduler
-
按照rdd的一系列操作顺序,来生成DAG有向无环图
-
DAGScheduler拿到DAG有向无环图之后,按照
宽依赖
进行stage的划分。每一个stage内部有很多可以并行运行
的task,最后封装在一个一个的taskSet集合中,然后把taskSet发送给TaskScheduler -
TaskScheduler得到taskSet集合之后,依次遍历取出每一个task提交到worker节点上的executor进程中运行。
-
所有task运行完成,整个任务也就结束了
注意
- 当taskScheduler执失败会返回DAGScheduler,再走一遍提交流程