为什么Hadoop Spilling会发生?

时间:2015-01-11 19:00:01

标签: hadoop mapreduce

我对Hadoop系统和学习阶段都很陌生。

我注意到在Shuffle和Sort阶段,只要MapOutputBuffer达到80%就会发生Spill(我认为这也可以配置)。

现在为什么需要溢出阶段?

是因为MapOutputBuffer是一个循环缓冲区,如果我们不清空它可能导致数据覆盖和内存泄漏?

1 个答案:

答案 0 :(得分:9)

我写了一篇很好的文章,涵盖了这个主题:http://0x0fff.com/hadoop-mapreduce-comprehensive-description/

一般来说:

  • 当没有足够的内存来容纳所有映射器输出时,就会发生溢出。可用内存量由mapreduce.task.io.sort.mb
  • 设置
  • 当80%的缓冲区占用时,会发生这种情况,因为溢出是在一个单独的线程中完成的,不会干扰映射器。如果缓冲区达到100%利用率,映射器线程必须停止并等待溢出线程释放空间。为避免这种情况,选择了80%的阈值
  • 当映射器完成时,溢出至少发生一次,因为映射器的输出应该被排序并保存到磁盘以供reducer进程读取。没有必要为最后一次“保存到磁盘”发明一个单独的功能,因为通常它会执行相同的任务