2013-10-31 36 views
0

从“Hadoop权威指南” [每个映射任务都有一个循环内存缓冲区,它将输出写入到其中。默认情况下,缓冲区大小为 100 MB,可以通过更改io.sort.mb属性来调整大小。当 缓冲器的内容达到特定阈值的大小(io.sort.spill.percent, 具有默认0.80,或80%),后台线程将开始溢出内容 到磁盘]循环缓冲区如何用于hadoop中的溢出处理?

这里的问题是,由于每个map任务在单个输入分割上工作(或多或少会等于HDFS块的大小,即64 MB),所以回溢到磁盘的条件决不会产生。我错过了什么。请帮忙。

回答

0

为什么你认为分割大小或块大小是64 MB?实际上,我看到有一个小块大小降低了性能(对于我分析的数据的规模)。在我的使用案例中,我已经看到更好的性能,块大小/分割大小为256MB。

回到你的问题, 有太多的Mappers也是一个开销的框架。按照问题中提到的用例,我们可能不会溢出键,即100 MB循环缓冲区中的值。但考虑这种情况,分割大小为64MB,Mapper根据输入做出一些计算,并将其他计算结果作为Map输出的一部分发送,Map输出可能会超过配置的循环缓冲区大小。另一个用例是64 MB块压缩数据,数据在处理时只是大小增加。考虑将在Map阶段从“边数据分布”,“分布式缓存”获取附加数据的映射器。

附加说明: 根据我的经验,我可以清楚地说,当我们使用框架/使用框架时,默认配置将永远不符合我们的要求。我们需要调整和调整系统,以使我们获得最佳性能。

+0

好的!我明白,大块大小肯定会调用这种情况。但是,由于多次溢出,大块大小还会增加磁盘I/O的数量。如何考虑这种交易? – user2925172

+0

如果块大小很大,并且您注意到性能的瓶颈位于缓冲区溢出到磁盘的位置,则需要:选项1)将分割大小更改为小于块大小的值。帮助减少缓冲溢出。选项2)如果你有更多的内存来增加io.sort.mb内存。 – Thejas