我想知道mapreduce.map.memory.mb
和mapred.map.child.java.opts
参数之间的关系。
是mapreduce.map.memory.mb
>mapred.map.child.java.opts
吗?
我想知道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 将终止映射器并显示如下错误:
容器[pid=container_1406552545451_0009_01_000002,containerID=container_234132_0001_01_000001] 运行超出物理内存限制。当前使用情况:已使用 512 MB 物理内存中的 569.1 MB;使用了 970.1 MB 的 1.0 GB 虚拟内存。杀死容器。
Hadoop mapper 是一个 java 进程,每个 Java 进程都有自己的堆内存最大分配设置,通过mapred.map.child.java.opts(或 Hadoop 2+ 中的 mapreduce.map.java.opts)配置。如果 mapper 进程耗尽堆内存,则 mapper 会抛出 java out of memory 异常:
错误:java.lang.RuntimeException:java.lang.OutOfMemoryError
因此,Hadoop 和 Java 设置是相关的。Hadoop 设置更像是一种资源强制/控制,而 Java 更像是一种资源配置。
Java 堆设置应该小于 Hadoop 容器内存限制,因为我们需要为 Java 代码保留内存。通常,建议为代码保留 20% 的内存。因此,如果设置正确,则基于 Java 的 Hadoop 任务永远不会被 Hadoop 杀死,因此您永远不会看到像上面这样的“Killing container”错误。
如果您遇到 Java 内存不足错误,则必须增加这两个内存设置。
以下属性允许您指定要传递给运行任务的 JVM 的选项。这些可以用来-Xmx
控制堆可用。
Hadoop 0.x, 1.x (deprecated) Hadoop 2.x
------------------------------- --------------------------
mapred.child.java.opts
mapred.map.child.java.opts mapreduce.map.java.opts
mapred.reduce.child.java.opts mapreduce.reduce.java.opts
请注意,其中第一个没有直接的 Hadoop 2 等效项;源代码中的建议是使用其他两个。mapred.child.java.opts
仍受支持(但如果存在,则被其他两个更具体的设置覆盖)。
作为对这些的补充,以下内容允许您限制可用于您的任务的总内存(可能是虚拟的) - 包括堆、堆栈和类定义:
Hadoop 0.x, 1.x (deprecated) Hadoop 2.x
------------------------------- --------------------------
mapred.job.map.memory.mb mapreduce.map.memory.mb
mapred.job.reduce.memory.mb mapreduce.reduce.memory.mb
我建议设置-Xmx
为 75% 的memory.mb
值。
在 YARN 集群中,作业使用的内存不得超过服务器端配置yarn.scheduler.maximum-allocation-mb
,否则它们将被终止。
要检查这些的默认值和优先级,请参阅Hadoop 源代码中的JobConf
和。MRJobConfig
故障排除
请记住,您的 mapred-site.xml 可能会为这些设置提供默认值。这可能会令人困惑 - 例如,如果您的作业以mapred.child.java.opts
编程方式设置,那么如果 mapred-site.xml 设置mapreduce.map.java.opts
或mapreduce.reduce.java.opts
. 您需要在作业中设置这些属性,以覆盖 mapred-site.xml。检查您的工作的配置页面(搜索“xmx”)以查看已应用的值以及它们的来源。
应用主内存
在 YARN 集群中,您可以使用以下两个属性来控制 ApplicationMaster 可用的内存量(保存输入拆分的详细信息、任务状态等):
Hadoop 0.x, 1.x Hadoop 2.x
------------------------------- --------------------------
yarn.app.mapreduce.am.command-opts
yarn.app.mapreduce.am.resource.mb
同样,您可以将-Xmx
(在前者中)设置为该resource.mb
值的 75%。
其他配置
还有许多其他与内存限制相关的配置,其中一些已被弃用 - 请参阅JobConf
课程。一个有用的:
Hadoop 0.x, 1.x (deprecated) Hadoop 2.x
------------------------------- --------------------------
mapred.job.reduce.total.mem.bytes mapreduce.reduce.memory.totalbytes
OutOfMemoryError
将此设置为较低的值 (10) 以在您点击at 时强制在磁盘上发生随机播放MapOutputCopier.shuffleInMemory
。