为什么MapReduce映射内存大于簇上的块大小?

问题描述:

在Hadoop Yarn中,下面是观察值:为什么MapReduce映射内存大于簇上的块大小?

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

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

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

其实对于Cloudera的块大小的建议是128 MB和MapReduce.map.memory.mb为1 GB

当块大小只有128 MB,为什么我们需要1 GB分配给映射存储器(MapReduce.map.memory.mb)?理想情况下,128 MB应该最多可以满足需要。为什么我们甚至给予地图内存块大小?

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

MapReduce根本不会将完整的128 MB输入块加载到内存中,因为它应该通过地图功能对数据进行流式传输。

但是它有一些输出和溢出缓冲区和排序缓冲区需要维护,它们非常大(高达64MB,mapreduce.task.io.sort.mb的默认值为100MB)。

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

框架开销,折扣分配的溢出缓冲区是超小的(< 50mb)。

+0

感谢@Thomas的解释。输出,溢出缓冲区和排序缓冲区需要内存是有意义的。作为输出,溢出缓冲区和排序缓冲区来自映射函数的数据,该数据以128 MB的块运行,如果我的块大小为256 MB,我希望有更多的内存分配给MapReduce.map.memory.mb? – Premchand

+0

@Premchand我不希望根据输入块大小更改映射器的堆内存。 –