DAGScheduler会将Job的RDD划分到不同的Stage,并构建这些Stage的依赖关系。这样可以使得没有依赖关系的Stage并行执行,并保证有依赖关系的Stage顺序执行。并行执行能够有效利用集群资源,提升运行效率,而串行执行则适用于那些在时间和数据资源上存在强制依赖的场景。Stage分为需要处理Shuffle的ShuffleMapStage和最下游的ResultStage。上游Stage先于下游Stage执行,ResultStage是最后执行的Stage。Stage的属性如下:
- id:Stage的身份标识
- rdd:当前Stage包含的RDD
- numTasks:当前Stage的Task数量
- parents:当前Stage的父Stage列表。说明一个Stage可以有一个到多个父Stage
- firstJobId:第一个提交当前Stage的Job的身份标识(即Job的id)。当使用FIFO调度时,通过firstJobId首先计算来自较早Job的Stage,或者在发生故障时更快地恢复
- callSite:应用程序中与当前Stage相关联的调用栈信息
- numPartitions:当前Stage的分区数量。实际为rdd的分区的数量
- jobIds:当前Stage所属的Job的身份标识集合。说明一个Stage可以属于一到多个Job
- pendingPartitions:存储待处理分区的索引的集合
- nextAttemptId:用于生成Stage下一次尝试的身份标识
- _latestInfo:Stage最近一次尝试的信息,即StageInfo
- fetchFailedAttemptIds:发生过FetchFailure的Stage尝试的身份标识的集合。此属性用于避免在发生FetchFailure后无止境的重试
下面来学习一下Stage的方法
- clearFailures:清空fetchFialedAttemptIds
- failedOnFetchAndShouldAbort:用于将发生FetchFailure的Stage尝试的身份标识添加到fetchFailedAttemptIds中,并返回发生FetchFailure的次数是否已经超过了允许发生FetchFailure的次数的状态。允许发生FetchFailure的次数固定为4
- latestInfo:返回最近一次Stage尝试的StageInfo,即返回_latestInfo
- findMissingPartitions:找到还未执行完成的分区
- mekeNewStageAttempt:用于创建新的Stage尝试