0

来自“Hadoop 权威指南” [每个地图任务都有一个循环内存缓冲区,它将输出写入。缓冲区默认为 100 MB,可以通过更改 io.sort.mb 属性来调整大小。当缓冲区的内容达到某个阈值大小(io.sort.spill.percent,默认为 0.80,即 80%)时,后台线程将开始将内容溢出到磁盘]

这里的问题是,由于每个映射任务都在单个输入拆分上工作(或多或少等于 HDFS 块的大小,即 64 MB),因此不会出现溢出回磁盘的条件。我是不是错过了什么。请帮忙。

4

1 回答 1

0

为什么假设拆分大小或块大小为 64 MB?实际上,我已经看到小块大小会降低性能(对于我分析的数据规模)。在我的用例中,我看到块大小/分割大小为 256MB 的性能更好。

回到您的问题,拥有太多映射器也是框架的开销。按照问题中提到的用例,我们可能不会从 100 MB 循环缓冲区中溢出键值。但是考虑到这些拆分大小为 64MB 并且 Mapper 根据输入进行一些计算并作为 Map 输出的一部分发出额外计算结果的情况,Map 输出可能会超过配置的循环缓冲区大小。另一个用例是我们有 64 MB 的块压缩数据,这些数据在处理时会突然变大。考虑将在 Map 阶段从“Side Data Distribution”,“distributed cache”获取额外数据的映射器。

补充一点:根据我的经验,我可以清楚地说,当我们使用/使用框架时,默认配置永远不会满足我们的要求。我们需要调整和调整系统以提供最佳性能。

于 2013-10-31T06:16:44.350 回答