对RDD的操作,体现在对算子的操作
算子分两类:Transformation、Action
运行调度:
->DAG->Stage->Task
DAGSchedule遇到Action时会回溯,当遇到shuffle时会产生新的Stage,从而产生Stage;
使用TaskSchedule对Stage1进行调度,把stage1 task任务委派到Worker上。
由于stage1 - stage2有个Shuffle,对stage1进行shuffleWriter
在worker上启动shuffleReader读取stage1的shuffleWriter读取然后启动stage2
宽依赖和宅依赖: 发生在RDD与RDD之间
本质区别为RDD与RDD之间的Partition是否为一一对应的关系。
Stage的好处是可以进行算子融合,做流水处理,提高任务处理效率。
def compute(split: Partition, context: TaskContext): Iterator[T]
protected def getPartitions: Array[Partition]
窄依赖:map、filter、unio、co-partition下的join
宽依赖:join、groupBy等
Stage有两种:
- ShuffleMapStage
这种Stage是以Shuffle为输出边界,其输入边界可以是从外部获取数据,也可以是另一个ShuffleMapStage的输出,其输出可以。是另一个Stage的开始ShuffleMapStage的最后Task就是ShuffleMapTask。在一个Job里可能有该类型的Stage,也可以能没有该类型Stage。
- ResultStage
这种Stage是直接输出结果。其输入边界可以是从外部获取数据,也可以是另一个ShuffleMapStage的输出。ResultStage的最后Task就是ResultTask。在一个Job里必定有该类型Stage。一个Job含有一个或多个Stage,但至少含有一个ResultStage。