Apache Hadoop YARN 中的“mapreduce.map.memory.mb”和“mapred.map.child.java.opts”之间有啥关系?

Posted

技术标签:

【中文标题】Apache Hadoop YARN 中的“mapreduce.map.memory.mb”和“mapred.map.child.java.opts”之间有啥关系?【英文标题】:What is the relation between 'mapreduce.map.memory.mb' and 'mapred.map.child.java.opts' in Apache Hadoop YARN?Apache Hadoop YARN 中的“mapreduce.map.memory.mb”和“mapred.map.child.java.opts”之间有什么关系? 【发布时间】:2014-07-27 01:24:09 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

以下属性可让您指定要传递给运行任务的 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 设置为memory.mb 值的75%。

在 YARN 集群中,作业使用的内存不得超过服务器端配置 yarn.scheduler.maximum-allocation-mb,否则它们将被终止。

要检查这些默认值和优先级,请参阅 Hadoop 源代码中的 JobConfMRJobConfig

疑难解答

请记住,您的 mapred-site.xml 可能会为这些设置提供默认值。这可能会令人困惑 - 例如如果您的作业以编程方式设置mapred.child.java.opts,则如果mapred-site.xml 设置mapreduce.map.java.optsmapreduce.reduce.java.opts,这将无效。您需要在作业中设置这些属性,以覆盖 mapred-site.xml。检查您的作业的配置页面(搜索“xmx”)以查看已应用的值以及它们的来源。

ApplicationMaster 内存

在 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

将此设置为较低的值 (10) 以在您在 MapOutputCopier.shuffleInMemory 处点击 OutOfMemoryError 时强制在磁盘上进行随机播放。

【讨论】:

请再问一个问题,'mapreduce.map.memory.mb' 是否正是运行映射器任务的容器所使用的资源量?【参考方案2】:

ma​​preduce.map.memory.mb 是 Hadoop 允许分配给映射器的内存上限,以兆字节为单位。默认值为 512。 如果超出此限制,Hadoop 将终止映射器并显示如下错误:

容器[pid=container_1406552545451_0009_01_000002,containerID=container_234132_0001_01_000001] 正在超出物理内存限制。当前使用量:569.1 MB 使用了 512 MB 物理内存;使用了 970.1 MB 的 1.0 GB 虚拟内存。 杀死容器。

Hadoop 映射器是一个 java 进程,每个 Java 进程都有自己的堆内存最大分配设置,通过 ma​​pred.map.child.java.opts(或 Hadoop 中的 mapreduce.map.java.opts 2+)。 如果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 内存不足错误,则必须增加两个内存设置。

【讨论】:

请再问一个问题,'mapreduce.map.memory.mb' 是否正是运行映射器任务的容器所使用的资源量?

以上是关于Apache Hadoop YARN 中的“mapreduce.map.memory.mb”和“mapred.map.child.java.opts”之间有啥关系?的主要内容,如果未能解决你的问题,请参考以下文章

Apache Hadoop YARN Architecture

如何正确使用Hadoop YARN Restful api提交spark应用

NoClassDefFoundError:org/apache/hadoop/yarn/exceptions/YarnException

NoSuchMethodException org.apache.hadoop.yarn.api.records.URL.fromURI

Hadoop之YARN的安装与测试

hadoop MapReduce Yarn运行机制