首页 文章

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

提问于
浏览
2

在Hadoop纱线下面是观察:

a)对于每个InputSplit或块,将触发新 Map .

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

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

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

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

2 回答

  • 0

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

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

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

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

  • 1

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

相关问题