Spark的任务调度流程

  1. Client 提交应用,Master节点启动Driver

  2. Driver向Cluster Manager申请资源,并构建Application的运行环境,即启动SparkContext

  3. SparkContext向ClusterManager申请Executor资源,Worker会先实例化ExecutorRunner对象,在ExecutorRunner启动中会创建进程生成器ProcessBuilder,然后由该生成器创建CoarseGrainedExecutorBackend对象。

  4. Spark应用程序中会有各种转换操作,会通过行动操作触发Job。Job提交之后,会依据RDD之间的依赖关系构建DAG图。DAG图构建好之后,会交给DAGScheduler进行解析。

  5. DAGScheduler是面向调度阶段的高层次调度器。他会把DAG拆分成相互依赖的调度阶段(Stage),Stage是以RDD的依赖是否为宽依赖。当遇到宽依赖,就划分为新的调度阶段,每个调度阶段包含一个或者多个任务,这些任务形成任务集(task set)。DAGScheduler会记录哪些RDD被存入磁盘等物化操作,同时还会寻求任务的最优化调度(数据本地性)。DAGScheduler会监控调度阶段的运行过程,如果某个阶段运行失败,就会重新提交该阶段。

  6. DAGScheduler会将taskset提交给TaskScheduler。每个TaskScheduler只为一个SparkContext服务,TaskScheduler接收来自DAGScheduler发送来的任务集,TaskScheduler接收到任务集后,会把任务集中以任务的形式一个个分发到集群Worker节点的Executor中执行。如果任务执行失败,TaskScheduler要负责重试。如果某个任务一直执行不完,就可能启动多个节点运行同一个任务。

  7. Worker中的Executor收到TaskScheduler发送过来的任务后,以多线程的方式运行。每个线程负责一个任务。任务结束后需要返回给TaskScheduler,不同类型的任务,返回的方式也不同。ShuffleMap Task 返回的是一个Map Status对象,而不是结果本身。Result Task会返回结果。

  8. 在返回结果时,对于Executor的计算结果
    1. 生成结果大小在 ( ∞ , 1 G B ) (\infty, 1GB) (,1GB):直接丢弃。该配置项可以通过spark.driver.maxResultSize进行设置
    2. 生成结果大小在 ( 1 G B , 128 M B − 200 K B ) (1GB, 128MB-200KB) (1GB,128MB200KB):会把结果所在的taskId保存至BlockManager中,然后将该编号通过Netty传输给Driver终端点。该阈值是Netty框架的传输最大值spark.akka.frameSize(默认是128MB)和Netty的预留空间reservedSizeBytes(200KB)的差值。
    3. 生成结果大小在 ( 128 M B − 200 K B , 0 ) (128MB-200KB, 0) (128MB200KB,0):通过Netty直接将结果发送到Driver终端点。

  9. 同时,TaskRunner将任务的执行结果发送给DriverEndPoint。该终端点会转给TaskSchedulerImpl的stateUpdate进行处理。

    1. 如果返回状态是TaskState.FINISHED,那么调用TaskResultGetter的enqueueSuccessfulTask方法进行处理。如果是IndirectTaskResult,就会通过blockId进行获取:sparkEnv.blockManager.getRemoteBytes(blockId);如果是DirectResult,则可以直接获取结果。
    2. 如果返回状态时TaskState.FAILED、TaskState.KILLED或者是TaskState.LOST,调用TaskResultGetter的enqueueFailedTask进行处理。对于TaskState.LOST,还需要将其所在的Executor标记为Failed,并根据更新后的Executor重新进行调度。
  10. ShuffleMap Task还会涉及到Shuffle过程。

  11. Standalone模式下,ClusterManager即为Master。在YARN下,ClusterManager为资源管理器

  12. Driver Program可以在Master上运行,此时Driver就在Master节点上。如果是YARN集群,那么Driver可能被调度到Worker node上运行。为了防止Driver和Executor间通信过慢,一般原则上要使它们分布在同一个局域网中

  13. Result Task过后,若作业已完成,则标记已完成。

你可能感兴趣的:(大数据,大数据,spark)