为什么Hadoop Spilling会发生?

Tal*_*ner 4 hadoop mapreduce

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

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

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

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

0x0*_*FFF 9

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

一般来说:

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