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.mb
和mapred.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 源代码中的 JobConf
和 MRJobConfig
。
疑难解答
请记住,您的 mapred-site.xml 可能会为这些设置提供默认值。这可能会令人困惑 - 例如如果您的作业以编程方式设置mapred.child.java.opts
,则如果mapred-site.xml 设置mapreduce.map.java.opts
或mapreduce.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】:mapreduce.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 进程都有自己的堆内存最大分配设置,通过 mapred.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