52

我想知道mapreduce.map.memory.mbmapred.map.child.java.opts参数之间的关系。

mapreduce.map.memory.mb>mapred.map.child.java.opts吗?

4

2 回答 2

78

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 内存不足错误,则必须增加这两个内存设置。

于 2014-09-20T06:20:06.777 回答
60

以下属性允许您指定要传递给运行任务的 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.optsmapreduce.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

于 2015-02-13T12:08:59.560 回答