溢出过程何时停止?

When will a spilling process stop?

映射器输出临时存储在循环缓冲区(内存中)中。默认缓冲区大小为 100 Mb。当缓冲区填满 80% 时,将开始溢出过程。 (http://grepalex.com/2012/09/24/map-partition-sort-spill/) 什么时候溢出(一次溢出)stop/complete? 它会在创建固定大小的溢出后停止吗?

这里的 spill 意味着它正在溢出到本地磁盘(不是 hdfs),reducer 会把它捡起来。溢出以循环方式写入 mapred.local.dir 属性 指定的目录。当所有地图输出都写入磁盘时,溢出将停止。

好问题。让我逐步解释一下。

  1. 地图将(使用 Mapper.Context.write())其输出写入循环内存缓冲区 (MapTask.MapOutputBuffer)。
  2. 当缓冲区超过 80% 的默认阈值限制时,缓冲区中的所有数据都将溢出到磁盘。
  3. 因此,假设 mapreduce.task.io.sort.mb 设置为 100 MB,mapreduce.map.sort.spill.percent 设置为 0.8。
  4. 现在,当缓冲区中的数据达到 85 MB(超过 80%)时,所有 85 MB 都将溢出到一个拆分文件中。
  5. 使用多线程将数据溢出到磁盘。
  6. 溢出在一个单独的线程中工作,允许映射器在溢出发生时继续运行和处理输入数据。
  7. 因此循环缓冲区超过其大小的 80% 的情况将再次发生,并且将创建一个新的溢出文件。

参考链接: Link 1 Link 2