Spark描述DAG的2种Task类型解析

Spark有2个类型的Task: ShuffleMapTask和ResultTask;

 

设想有:  Stage1  ----shuffle-------->  Stage2 -----shuffle------>  Stage3

 

Stage3就是一个ResultTask, 因为是最终的action的执行;

Stage2既是1个shuffle的数据读取者, 又是1个shuffle的数据输出者, 需要考虑如何在一个task的类型中同时兼具上述两种角色;

 

Spark的设计非常巧妙.

    Spark将对shuffle的数据读取封装到RDD中, 对于上层来说,只要调用rdd.iterator就可以拿到该RDD的iterator对象,然后调用iterator就

可以拿到RDD中的数据, 具体这个数据存储在哪里, 完全又不同的RDD的实现决定. 这样其实使用通用的代码,就可以读取所有RDD

的数据, 不管这个RDD是否是ShuffleRDD,还是HadoopRDD. 所以从shuffle读取数据就不需要上层特殊处理了.

 

这样, 上层只要关心,  处于不同的stage阶段, 相应的stage应该处理什么,就可以写出相应的代码.

                                                                                ShuffleMapTask的处理代码


                                                                               ResultTask的处理代码 


从上面代码可以看出,rdd读取数据都是一样的;不同的是, shuffleMapTask需要将数据写入磁盘作为shuffle的文件,ResultTask,会调用

action的实际处理函数,对读出的数据进行处理.

你可能感兴趣的:(spark)