ApacheSparkBook
ApacheSparkBook copied to clipboard
NarrowDependency中的ManyToManyDependency不会造成重复计算吗?
我在看书籍图3.2的时候发现ManyToManyDependency和ShuffleDependency很像,但ManyToManyDependency属于NarrowDependency,那么Stage划分的时候不会分成两个分区,这样按照P103的想法2,每次计算child RDD的每个分区的时候都需要重复计算全部的父RDD,因此将ManyToManyDependency划分为ShuffleDependency会不会更好一点呢?ManyToManyDependency可以看作在shuffle write的时候写入整个分区到各个子RDD的ShuffleDependency。
@ycli12 谢谢提出的问题,ManyToManyDependency确实和ShuffleDependency很像,但ManyToManyDependency属于NarrowDependency,因为ManyToManyDependency不涉及分区,也不需要运行Shuffle write/read流程,具体例子见cartesian()。当然如果强行套用Shuffle框架,将RDD中所有数据都放到一个分区,然后执行Shuffle过程,那么child RDD可能不能收到想要的数据,比如如果将图3.2中的第二图中的分区1和2都改为分区1,那么RDD2中第二个p得不到任何数据。所以虽然ManyToManyDependency和ShuffleDependency样子相似,但两者是不同的计算逻辑。
@JerryLead 谢谢徐老师的回复,我还有一点疑问,根据P103的想法2,ManyToManyDependency在这里会不会存在重复计算的问题呢?每次计算child RDD的每个分区的时候都需要重复计算全部的父RDD。
@ycli12 理论上会出现重复计算,如果父RDD已经被cache就不用重复计算。
做一下总结,ManyToManyDependency跟ShuffleDependency不一样的地方: 1、ShuffleDependency在分区时候需要对partitionId进行排序或者Hash,而ManyToManyDependency不需要 2、ShuffleDependency是分发,只有一份,而ManyToManyDependency是复制多份