我想知道 mapreduce.map.memory.mb
和 mapred.map.child.java.opts
参数之间的关系。
mapreduce.map.memory.mb
> mapred.map.child.java.opts
?
最佳答案
mapreduce.map.memory.mb 是 Hadoop 允许分配给映射器的内存上限,以兆字节为单位。默认值为 512。 如果超过此限制,Hadoop 将终止映射器并显示如下错误:
Container[pid=container_1406552545451_0009_01_000002,containerID=container_234132_0001_01_000001] is running beyond physical memory limits. Current usage: 569.1 MB of 512 MB physical memory used; 970.1 MB of 1.0 GB virtual memory used. Killing container.
Hadoop 映射器是一个 java 进程,每个 Java 进程都有自己的堆内存最大分配设置,通过 mapred.map.child.java.opts(或 Hadoop 中的 mapreduce.map.java.opts 2+). 如果 mapper 进程用完堆内存,mapper 会抛出 java 内存不足异常:
Error: java.lang.RuntimeException: java.lang.OutOfMemoryError
因此,Hadoop 和Java 设置是相关的。 Hadoop 设置更像是一种资源实现/控制,而 Java 更多是一种资源配置。
Java 堆设置应该小于 Hadoop 容器内存限制,因为我们需要为 Java 代码预留内存。通常,建议为代码预留 20% 的内存。因此,如果设置正确,基于 Java 的 Hadoop 任务永远不会被 Hadoop 杀死,因此您永远不会看到像上面那样的“Killing container”错误。
如果您遇到 Java 内存不足错误,则必须增加这两个内存设置。
关于apache - Apache Hadoop YARN 中的 'mapreduce.map.memory.mb' 和 'mapred.map.child.java.opts' 是什么关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24070557/