天天看点

Spark源码分析 – Dependency

依赖, 用于表示rdd之间的因果关系, 一个dependency表示一个parent rdd, 所以在rdd中使用seq[dependency[_]]来表示所有的依赖关系

Spark源码分析 – Dependency

dependency的base class 

可见dependency唯一的成员就是rdd, 即所依赖的rdd, 或parent rdd

dependency分为两种, narrow和shuffle

先看看比较简单的narrow 

定义, parent rdd中的每个partition最多被child rdd中的一个partition使用, 即不需要shuffle 

更直白点, 就是narrow只有map, partition本身范围不会改变, 一个parititon经过transform还是一个partition, 虽然内容发生了变化, 所以可以在local完成 

而wide就是, partition需要打乱从新划分, 存在shuffle的过程, partition的数目和范围都发生了变化

唯一的接口getparents, 即给定任一个partition-id, 得到所有依赖的parent partitions的id的seq

narrowdependency又分为两种,

onetoonedependency 

最简单的依赖关系, 即parent和child里面的partitions是一一对应的, 典型的操作就是map, filter…

其实partitionid就是partition在rdd中的序号, 所以如果是一一对应, 那么parent和child中的partition的序号应该是一样的

rangedependency

虽然仍然是一一对应, 但是是parent rdd中的某个区间的partitions对应到child rdd中的某个区间的partitions 

典型的操作是union, 多个parent rdd合并到一个child rdd, 故每个parent rdd都对应到child rdd中的一个区间 

由于是range, 所以直接记录起点和length就可以了, 没有必要加入每个中间rdd, 所以rangedependency优化了空间效率

widedependency, 也称为shuffledependency 

首先需要基于pairrdd, 因为一般需要依据key进行shuffle, 所以数据结构往往是kv 

即rdd中的数据是kv pair, [_ <: product2[k, v]],

product2是trait, 这里实现了product2可以用于表示kv pair? 不是很理解

其次, 由于需要shuffle, 所以当然需要给出partitioner, 如何完成shuffle

然后, shuffle不象map可以在local进行, 往往需要网络传输或存储, 所以需要serializerclass

最后, 每个shuffle需要分配一个全局的id, context.newshuffleid()的实现就是把全局id累加

}

本文章摘自博客园,原文发布日期:2013-12-24

继续阅读