在2.2节中介绍了RDD DAG构建了RDD的数据流,即RDD的各个分区的数据是从哪来的;还进一步分析了RDD DAG的生成机制和RDD DAG的逻辑视图。
RDD DAG还构建了基于数据流之上的操作算子流,即RDD的各个分区的数据总共会经过哪些Transformation和Action这两种类型的一系列操作的调度运行,从而RDD先被Trans-formation操作转换为新的RDD,然后被Action操作将结果反馈到Driver Program或存储到外部存储系统上。
上面提到的一系列操作的调度运行其实是DAG提交给DAGScheduler来解析完成的。DAGScheduler是面向Stage的高层级的调度器,DAGScheduler把DAG拆分成很多Tasks,每组Tasks都是一个Stage,解析时是以Shuffle为边界反向解析构建Stage(参考4.4.3节和4.4.4节),每当遇到Shuffle就会产生新的Stage,然后以一个个TaskSet(每个Stage封装一个TaskSet)的形式提交给底层调度器TaskScheduler(参考4.5节)。另外,DAGScheduler需要记录哪些RDD被存入磁盘等物化动作,同时要寻求Task的最优化调度,如在Stage内部数据的本地性等(参考4.4.5节)。DAGScheduler还需要监视因为Shuffle跨结点输出可能导致的失败,如果发现这个Stage失败,可能就要重新提交该Stage(参考5.3.3节的相关内容)。
由此可见,为了更好地理解Spark高层调度器DAGScheduler,除了已经提到过的RDD(参考1.2.1节的相关内容)、Application(参考3.2节的相关内容)、Driver Program(参考4.2.1节的相关内容)和Job(参考4.3节的相关内容)这些概念以外,还需要了解以下几个概念。(www.xing528.com)
1)Stage:一个Job需要拆分成多组任务来完成,每组任务由Stage封装。跟一个Job的所有涉及的PartitionRDD类似,Stage之间也有依赖关系。
2)TaskSet:一组任务就是一个TaskSet,对应一个Stage。其中,一个TaskSet的所有Task之间没有Shuffle依赖,因此互相之间可以并行运行。
3)Task:一个独立的工作单元,由Driver Program发送到Executor(参阅第5章)上去执行。通常情况下,一个Task处理RDD的一个Partition的数据。根据Task返回类型的不同,Task又分为ShuffleMapTask和ResultTask。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。