映射器输出临时存储在循环缓冲区中(在内存中)。默认缓冲区大小为100mb。当缓冲区填充到80%时,将启动溢出进程。(http://grepalex.com/2012/09/24/map-partition-sort-spill/)这种溢出(一次溢出)什么时候停止/完成?它会在形成固定规模的溢出后停止吗?
问得好。让我一步一步来解释。
- map会(使用Mapper.Context.write())将它的输出写入一个循环内存缓冲区(MapTask.MapOutputBuffer)。
- 当缓冲区超过默认阈值80%时,缓冲区中的所有数据将溢出到磁盘。 所以,假设mapreduce.task.io.sort.mb被设置为100mb, mapreduce.map.sort.spill.percent被设置为0.8。
- 现在,当缓冲区中的数据达到85mb(超过80%)时,所有85mb的数据将溢出到单个拆分文件中。
- 使用多个线程将数据溢出到磁盘 溢出在一个单独的线程中工作,允许映射器在溢出发生时继续运行和处理输入数据。
- 所以循环缓冲区超过其大小的80%的情况将再次发生,并且将创建一个新的溢出文件。
参考链接:链接1链接2
这里的spill表示它溢出到本地磁盘(而不是hdfs), reducer将在那里拾取它。溢出以轮询方式写入mapred.local.dir属性指定的目录。当所有映射输出写入磁盘时,溢出将停止。