DAGScheduler代码注释翻译

DAGScheduler:实现了基于Stage调度的高级调度层。它为每个job计算出一个stage组成的DAG(有向无环图),并且能够追踪RDD和Stage的输出,并且找到一个最小化的调度去执行这个job。然后它会向一个TaskScheduler提交stages,TaskScheduler 负责在集群中执行这些stages。task的集合包含完全独立的task,这些task可以在数据所在的集群上执行。尽管如果数据变得不可用的时候,执行会失败。
Spark 的stages 是在shuffle的边界切分RDD图的时候创建的。
贯穿整个代码,这里有几个关键的概念:

  • Jobs(表示为 ActiveJob)是提交给调度器的最高级的工作项。举个例子,当一个用户调用一个action的时候,比如是 count(),一个job就会通过submitJob提交。每个job可能需要多个stages的执行去创建中间数据。
  • Stages 就是task的集合。在job中计算中间数据,也就是每个task使用同一个函数计算同一个RDD的不同分区。stage是通过shuffle的边界切分的。这就引入了一个障碍(也就是 如果我们要获取输出我们必须等待之前的stage完成)。这儿有两种类型的stages: ResultStage,对应于最终的stage也就是执行action的。ShuffleMapStage, 也就是shuffle的时候输出map数据。如果job会复用相同的RDD,则这些stage会在不同的job之间共享。
  • Tasks 是单独的工作单元,会被发送到不同的机器。
  • Cache tracking: DAGSchduler 计算出哪些Rdd 是已经被缓存了以防止重新计算。就像记住哪些shuffler map的stages已经产出了来避免重新进行shuffle的map端的操作。
  • Preferred location:DAGScheduler 也会计算根据RDD的位置或者cache的或者shuffle的数据的位置选择在哪里运行每个task。
  • CleanUp 所有的数据结构都会在运行在它们之上的job结束后被清除,以防止长期运行的job发生内存泄漏。
    为了从失败中恢复,相同的stage可能运行多次,这被称为 attempts 重试。如果TaskScheduler 报告说 一个task因为来自之前的stage的map输出文件丢失了导致失败,DAGScheduler 会重新提交丢失的stage。这个机制是通过一个FetchFailed 的CompletionEvent 或者 一个ExecutorLost 的事件被检测到。DAGScheduler 会等待一小段时间去看一下是否有其他的节点或者task失败,然后重新提任何一个丢失stage的Task集合。作为这个处理过程中的一部分,我们也必须去为老的Stage创建一个Stage对象。由于一个stage之前的重试可能还在运行,所以必须在正确的Stage对象中注意map任何事件。

你可能感兴趣的:(DAGScheduler代码注释翻译)