八、混洗

  1. spark 中的某些操作会触发shuffle

  2. shufflespark 重新分配数据的一种机制,它使得这些数据可以跨不同区域进行分组

    • 这通常涉及到在executor 和驱动器程序之间拷贝数据,使得shuffle 成为一个复杂的、代价高昂的操作
  3. spark 里,特定的操作需要数据不会跨分区分布。如果跨分区分别,则需要混洗。

    reduceByKey 操作的过程为例。一个面临的挑战是:一个key 的所有值不一定在同一个分区里,甚至不一定在同一台机器里。但是它们必须共同被计算。

    为了所有数据都在单个reduceByKeyreduce 任务上运行,我们需要执行一个all-to-all 操作:它必须从所有分区读取所有的keykey 对应的所有的值,并且跨分区聚集取计算每个key 的结果。 这个过程叫做shuffle

  4. 触发混洗的操作包括:

    • 重分区操作,如repartition、coalesce 等等
    • ByKey 操作(除了countint 之外),如groupByKey、reduceByKey 等等
    • join操作,如cogroup、join 等等
  5. 混洗是一个代价比较高的操作,它涉及到磁盘IO,数据序列化,网络IO

    • 为了准备混洗操作的数据,spark 启动了一系列的任务:map 任务组织数据,reduce 完成数据的聚合。

      这些术语来自于MapReduce,与sparkmap,reduce 操作没有关系

      • map 任务的所有结果数据会保存在内存,直到内存不能完全存储为止。然后这些数据将基于目标分区进行排序,并写入到一个单独的文件中
      • reduce 任务将读取相关的已排序的数据块
    • 某些混洗操作会大量消耗堆内存空间,因为混洗操作在数据转换前后,需要使用内存中的数据结构对数据进行组织

    • 混洗操作还会在磁盘上生成大量的中间文件。

      • 这么做的好处是:如果spark 需要重新计算RDD的血统关系时,混洗操作产生的这些中间文件不需要重新创建