在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应满足最多需求。为什么我们甚至给出了超过地图内存的块大小?
答案 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相关的进程,因此需要更多内存。