八、混洗
spark
中的某些操作会触发shuffle
shuffle
是spark
重新分配数据的一种机制,它使得这些数据可以跨不同区域进行分组- 这通常涉及到在
executor
和驱动器程序之间拷贝数据,使得shuffle
成为一个复杂的、代价高昂的操作
- 这通常涉及到在
在
spark
里,特定的操作需要数据不会跨分区分布。如果跨分区分别,则需要混洗。以
reduceByKey
操作的过程为例。一个面临的挑战是:一个key
的所有值不一定在同一个分区里,甚至不一定在同一台机器里。但是它们必须共同被计算。为了所有数据都在单个
reduceByKey
的reduce
任务上运行,我们需要执行一个all-to-all
操作:它必须从所有分区读取所有的key
和key
对应的所有的值,并且跨分区聚集取计算每个key
的结果。 这个过程叫做shuffle
。触发混洗的操作包括:
- 重分区操作,如
repartition、coalesce
等等 ByKey
操作(除了countint
之外),如groupByKey、reduceByKey
等等join
操作,如cogroup、join
等等
- 重分区操作,如
混洗是一个代价比较高的操作,它涉及到磁盘
IO
,数据序列化,网络IO
为了准备混洗操作的数据,
spark
启动了一系列的任务:map
任务组织数据,reduce
完成数据的聚合。这些术语来自于
MapReduce
,与spark
的map,reduce
操作没有关系map
任务的所有结果数据会保存在内存,直到内存不能完全存储为止。然后这些数据将基于目标分区进行排序,并写入到一个单独的文件中reduce
任务将读取相关的已排序的数据块
某些混洗操作会大量消耗堆内存空间,因为混洗操作在数据转换前后,需要使用内存中的数据结构对数据进行组织
混洗操作还会在磁盘上生成大量的中间文件。
- 这么做的好处是:如果
spark
需要重新计算RDD
的血统关系时,混洗操作产生的这些中间文件不需要重新创建
- 这么做的好处是:如果