为什么MapReduce Map内存大于群集上的Block大小?

时间:2017-03-09 21:59:51

标签: hadoop mapreduce hdfs yarn cloudera

在Hadoop中,下面是观察结果:

a)对于每个InputSplit或块,将触发新地图。

b)群集的典型块大小为128 MB。

c)在大多数集群中,MapReduce.map.memory.mb的配置大于1 GB。

事实上,Cloudera建议的块大小为128 MB,MapReduce.map.memory.mb为1 GB

当块大小只有128 MB时,为什么我们需要为地图内存(MapReduce.map.memory.mb)分配1 GB?理想情况下,128 MB应满足最多需求。为什么我们甚至给出了超过地图内存的块大小?

2 个答案:

答案 0 :(得分:1)

MapReduce根本不会将完整的128 mb输入块加载到内存中,因为它应该通过map函数传输数据。

但它有一些输出和溢出缓冲区以及需要维护的排序缓冲区,它们非常大(超过64mb,class Foo(object): def __add__(self, rhs): rhs_value_func = getattr(rhs, "value", None) if rhs_value_func is None: return NotImplemented else: return self._value + rhs_value_func() 的默认值为100mb)。

此外,您自己的地图处理逻辑可能需要关联内存 - 例如,从其他地方加载的其他资源。毕竟,1gb是一个安全的默认值,它不一定与输入块大小相关联。

对分配的溢出缓冲区进行折扣的框架开销非常小(<50mb)。

答案 1 :(得分:0)

每个容器(映射器运行的位置)都在单独的JVM上运行。 mapreduce.map.memory.mb反映了容器所需的所有总空间:堆,堆栈等。因此,除了加载那些128MB的块大小以进行处理之外,还必须管理其他与JVM相关的进程,因此需要更多内存。