spark的任务调度
- Driver会运行客户端main方法中的代码,代码就会构建SparkContext对象,在构建SparkContext对象中,会创建DAGScheduler和TaskScheduler,然后按照rdd一系列的操作生成DAG有向无环图。最后把DAG有向无环图提交给DAGScheduler
- DAGScheduler拿到DAG有向无环图后,按照宽依赖进行stage的划分,这个时候会产生很多个stage,每一个stage中都有很多可以并行运行的task,把每一个stage中这些task封装在一个taskSet集合中,最后提交给TaskScheduler
- TaskScheduler拿到taskSet集合后,依次遍历每一个task,最后提交给worker节点的exectuor进程中。task就以线程的方式运行在worker节点的executor进程中。
standalone模式
- 使用sparksubmit提交任务,Driver运行在Client上
- 使用本地的Client类的main函数创建sparkcontext并初始化它
- sparkcontext连接到Master,注册并申请资源
- master根据sc提出的申请,根据worker的心跳报告,来决定在哪个worker上启动executor
- executor向sc注册,sc将应用分配给executor
- sc解析应用,创建DAG图,提交给DAGScheduler进行分解成stage,然后stage被发送到TaskScheduler,TaskScheduler负责将stage中的task分配到相应的worker上
- executor创建Executor线程池,开始执行task,并向SC汇报
- 所有的task执行完成之后,SC向Master注销
Client模式:Spark客户端直接连接Yarn;不需要额外构建Spark集群。Driver程序运行在客户端,适用于交互、调试,希望立即看到app的输出
- spark-submit脚本提交,Driver在客户端本地运行
- Client向RM申请启动AM,同时在SC(client上)中创建DAGScheduler和TaskScheduler
- RM收到请求之后,查询NM并选择其中一个,分配container,并在container中开启AM
- client中的SC初始化完成之后,与AM进行通信,向RM注册,根据任务信息向RM申请资源
- AM申请到资源之后,与NM进行通信,要求在它申请的container中开启CoarseGrainedExecutorBackend(executor)。Executor在启动之后会向SC注册并申请task
- SC分配task给executor,executor执行任务并向Driver(运行在client之上的)汇报,以便客户端可以随时监控任务的运行状态
- 任务运行完成之后,client的SC向RM注销自己并关闭自己
Cluster模式
- spark-submit脚本提交,向yarn(RM)中提交ApplicationMaster程序、AM启动的命令和需要在Executor中运行的程序等
- RM收到请求之后,选择一个NM,在其上开启一个container,在container中开启AM,并在AM中完成SC的初始化
- SC向RM注册并请求资源,这样用户可以在RM中查看任务的运行情况。RM根据请求采用轮询的方式和RPC协议向各个NM申请资源并监控任务的运行状况直到结束
- AM申请到资源之后,与对应的NM进行通信,要求在其上获取到的Container中开启CoarseGrainedExecutorBackend(executor),executor 开启之后,向AM中的SC注册并申请task
- AM中的SC分配task给executor,executor运行task兵向AM中的SC汇报自己的状态和进度
- 应用程序完成之后(各个task都完成之后),AM向RM申请注销自己并关闭自己