宽依赖、shuffle、stage的理解
首先,stage内的多个task分别处理不同分区的数据,是并行执行的。而stage之间,是要从前往后依次执行的。
在窄依赖中,父RDD的一个分区的数据只会发往子RDD的一个分区,即子RDD的数据通常确定的来自于父RDD的某一个或几个分区的数据,因此可以在一个executor的一个task上以流水线的方式(pipeline)顺序执行多个算子,完成计算。
在宽依赖中,一个父RDD的分区的数据可能要发往多个子RDD的分区,即子RDD的数据通常来自于父RDD的所有分区,更本质的说法是,无法事先确定父RDD的一个分区的数据该如何发往子RDD的分区。因此子RDD的数据无法进行分区间的并行计算;只能等待父RDD的所有分区的数据计算完毕后,进行各分区数据的打乱分发,重新组合,即shuffle。
因此,窄依赖的RDD划分在一个stage内,各分区数据并行执行;宽依赖的RDD划分为不同stage,等待上游Stage执行完毕,进行shuffle完成数据的打乱重组。