9. 数据重组Shuffle介绍
Spark的某些操作会触发数据重组Shuffle事件。Shuffle是Spark对各分区的数据进行重新分布的机制,是一个复杂而且代价较高的操作,因为一般需要在执行器和数据节点之间进行数据复制。
9.1 背景
我们可以通过reduceByKey操作的例子来理解shuffle过程。reduceByKey操作将原PairRDD中具有相同key的元素聚合为一个元组tuple,该tuple中的key对应的值为执行指定函数之后的结果,最后生成了一个新的PairRDD。这个操作的挑战是:具有相同key的元素不一定都分布在同一个分区,甚至不在同一个数据节点,但是它们必须协同定位计算结果。在计算过程中,一个任务task处理一个分区。因此,为了执行reduceByKey操作,Spark需要进行一个“全交互”操作:必须先从所有分区读取全部的keys和对应的values,然后把各个分区具有相同key的合并结果汇总在一起计算出最终结果,这个过程称为数据重组Shuffle。
虽然每个分区中经过shuffle后的数据元素是确定的,分区间的顺序也是确定的,但是这些元素是无序的。如果想在shuffle操作后得到排序的数据,可以考虑使用以下方法:
Spark的某些操作会触发数据重组Shuffle事件。Shuffle是Spark对各分区的数据进行重新分布的机制,是一个复杂而且代价较高的操作,因为一般需要在执行器和数据节点之间进行数据复制。
9.1 背景
我们可以通过reduceByKey操作的例子来理解shuffle过程。reduceByKey操作将原PairRDD中具有相同key的元素聚合为一个元组tuple,该tuple中的key对应的值为执行指定函数之后的结果,最后生成了一个新的PairRDD。这个操作的挑战是:具有相同key的元素不一定都分布在同一个分区,甚至不在同一个数据节点,但是它们必须协同定位计算结果。在计算过程中,一个任务task处理一个分区。因此,为了执行reduceByKey操作,Spark需要进行一个“全交互”操作:必须先从所有分区读取全部的keys和对应的values,然后把各个分区具有相同key的合并结果汇总在一起计算出最终结果,这个过程称为数据重组Shuffle。
虽然每个分区中经过shuffle后的数据元素是确定的,分区间的顺序也是确定的,但是这些元素是无序的。如果想在shuffle操作后得到排序的数据,可以考虑使用以下方法:
- mapPartitions 结合sort方法对每一个分区内的数据进行排序
- repartitionAndSortWithinPartitions 在重新分区的同时对分区内的数据进行排序
- sortBy 对整个RDD排序
- 重新分区操作,例如repartition、coalesce
- *ByKey操作,