在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 回答
MapReduce根本不会将完整的128 MB输入块加载到内存中,因为它应该通过map函数传输数据 .
但是它有一些输出和溢出缓冲区以及需要维护的排序缓冲区,它们非常大(超过64mb,
mapreduce.task.io.sort.mb
的默认值为100mb) .此外,您自己的 Map 处理逻辑可能需要具有关联的内存 - 例如,用于从其他地方加载的其他资源 . 毕竟,1gb是一个安全的默认值,它不一定与输入块大小相关联 .
折扣分配的溢出缓冲区的框架开销非常小(<50mb) .
每个容器(映射器运行的位置)都在单独的JVM上运行 .
mapreduce.map.memory.mb
反映了容器所需的所有总空间:堆,堆栈等 . 因此,除了加载那些128MB的块大小以进行处理之外,还必须管理其他与JVM相关的进程,因此需要更多内存 .