Spark(14) -- Spark的任务调度

    科技2022-08-07  103

    1. 任务调度流程图

     各个RDD之间存在着依赖关系,这些依赖关系就形成有向无环图DAG,DAGScheduler对这些依赖 关系形成的DAG进行Stage划分,划分的规则很简单,从后往前回溯,遇到窄依赖加入本stage,遇 见宽依赖进行Stage切分。完成了Stage的划分。DAGScheduler基于每个Stage生成TaskSet,并将 TaskSet提交给TaskScheduler。TaskScheduler 负责具体的task调度,最后在Worker节点上启动 task

    1-首先RDD计算任务是DAG有向无环图的形式2-使用DAGScheduler负责将graph图切分为stage3-DAGSCheduler会提交stages的taskset给taskScheduler执行4-向CLusterManager申请资源启动task,这里ClusterManager在spark自身的standalone模式下就指的是master和worker,在yarn模式下指的是RM和NM,同时TaskScheduler会监控某些计算失败的算子重新拉取task执行计算5-真正执行的地方是在Worker中,通过ExecutorBackend进程启动Executor(内存+磁盘)后,通过task的线程池中的task线程拉取RDD中一个分区执行计算

    2. DAGScheduler

    (1)DAGScheduler对DAG有向无环图进行Stage划分。(2)记录哪个RDD或者 Stage 输出被物化(缓存),通常在一个复杂的shuffle之后,通常物 化一下(cache、persist),方便之后的计算。(3)重新提交shuffle输出丢失的stage(stage内部计算出错)给TaskScheduler(4)将 Taskset 传给底层调度器 a)– spark-cluster TaskSchedulerb)– yarn-cluster YarnClusterSchedulerc)– yarn-client YarnClientClusterScheduler

    3. TaskScheduler

    (1)为每一个TaskSet构建一个TaskSetManager 实例管理这个TaskSet 的生命周期(2)数据本地性决定每个Task最佳位置(3)提交 taskset( 一组task) 到集群运行并监控(4)推测执行,碰到计算缓慢任务需要放到别的节点上重试(5)重新提交Shuffle输出丢失的Stage给DAGScheduler

    4. 图解总结

    Taskset划分如下图:

    5. Spark的任务调度流程:

    第一步:客户端提交jar包,提交一个application第二步:根据提交的application以及rdd的依赖关系和血统lineage划分DAG第三步:DAG送给DAGScheduler第四步:DAGScheduler划分stage,划分taskSet第五步:将taskSet送给taskScheduler第六步:taskScheduler接收到taskSet第七步:taskScheduler将接收到的taskset分解成为一个个的task,等待将task送给executor去执行以上七部:都是Driver程序负责的职责,Driver程序一般都是运行在worker里面,使用cluster模式第八步:将分解之后的task与executor进行通信,将task放到executor里面去执行
    Processed: 0.015, SQL: 8