【hadoop运维】running beyond physical memory limits:正确配置yarn中的mapreduce内存

文章目录

  • [一. 问题描述](#一. 问题描述)
  • [二. 问题分析与解决](#二. 问题分析与解决)
    • [1. container内存监控](#1. container内存监控)
      • [1.1. 虚拟内存判断](#1.1. 虚拟内存判断)
      • [1.2. 物理内存判断](#1.2. 物理内存判断)
    • [2. 正确配置mapReduce内存](#2. 正确配置mapReduce内存)
      • [2.1. 配置map和reduce进程的物理内存:](#2.1. 配置map和reduce进程的物理内存:)
      • [2.2. Map 和Reduce 进程的JVM 堆大小](#2.2. Map 和Reduce 进程的JVM 堆大小)
    • [3. 小结](#3. 小结)

一. 问题描述

在hadoop3.0.3集群上执行hive3.1.2的任务,任务提交时报如下错误:

Application application_1409135750325_48141 failed 2 times due to AM Container for

appattempt_1409135750325_48141_000002 exited with exitCode: 143 due to: Container

pid=4733,containerID=container_1409135750325_48141_02_000001 is running beyond physical memory limits.
Current usage: 2.0 GB of 2 GB physical memory used; 6.0 GB of 4.2 GB virtual memory used. Killing container.

上述日志大致描述了:

任务申请了2.0g的物理内存,6g的虚拟内存,但是yarn只能分配2g的物理内存,4.2g的虚拟内存。因为虚拟内存不够,导致任务无法启动而报错。

二. 问题分析与解决

报错的原因是:申请的物理内存比container中物理内存大,导致任务无法运行。那为什么超预算申请?这是我们需要探索的问题。

1. container内存监控

本节讨论yarn是如何监控container的内存变化。

每一个yarn的节点都会运行一个nodemanager,nodemanager会监控container的运行,其中nodemanager会监控container的内存使用率。具体地,nodemanager会定期(yarn.nodemanager.container-monitor.interval-ms 默认三秒)监控container,它会计算进程树(每一个container所有的子进程),检查每一个进程文件/proc/<PID>/stat(PID:container的pid),并解析物理内存和虚拟内存。

1.1. 虚拟内存判断

如果启用虚拟内存检查(默认为 true,yarn.nodemanager.vmem-check-enabled),则 YARN 会判断container现在所申请的虚拟内存是否小于允许的最大虚拟内存

而最大的虚拟内存由yarn.nodemanager.vmem-pmem-ratio(默认为 2.1)计算得出。

比如,container配置 2 GB 物理内存,则该数字乘以 2.1,得出可以使用 4.2 GB 虚拟内存。

1.2. 物理内存判断

如果启用物理内存检查(默认为 true,yarn.nodemanager.pmem-check-enabled),则 YARN 会判断container现在所申请的物理内存是否小于允许的最大物理内存

综上所述:

如果虚拟或物理高于允许的最大值,YARN 将终止container运行,报错如本文顶部所示。

知道了报错的原因我们就可以针对性的配置mapreduce相关配置,接着往下看。

2. 正确配置mapReduce内存

2.1. 配置map和reduce进程的物理内存:

假如map限制为2GB、reduce限制为4GB,且设置为默认值,则可以在mapred-site.xml中配置:

xml 复制代码
<property>
  <name>mapreduce.map.memory.mb</name>
  <value>2048</value>
</property>
<property>
  <name>mapreduce.reduce.memory.mb</name>
  <value>4096</value>
</property>

而上述的配置必须在container允许的最小和最大内存范围内(在yarn-site.xml中分别检查yarn.scheduler.maximum-allocation-mb和yarn.scheduler.minimum-allocation-mb属性)。

xml 复制代码
    <property>
        <name>yarn.scheduler.minimum-allocation-mb</name>
        <value>1024</value>
    </property>
        <property>
        <name>yarn.scheduler.maximum-allocation-mb</name>
        <value>8196</value>
    </property>

2.2. Map 和Reduce 进程的JVM 堆大小

这些大小需要小于您在上一节中配置的物理内存。一般来说,它们应该是 YARN 物理内存设置大小的 80%。采用 2GB 和 4GB 物理内存限制并乘以 0.8 来得出 Java 堆大小。

xml 复制代码
<property>
  <name>mapreduce.map.java.opts</name>
  <value>-Xmx1638m</value>
</property>
<property>
  <name>mapreduce.reduce.java.opts</name>
  <value>-Xmx3278m</value>
</property>

3. 小结

如果说配置之后还是报开头的错误,说明物理内存配置还是小不足以加载mr程序,接着申请了大于2.1比例的虚拟内存,这样任务还是启动不了。

这时可以调大yarn.nodemanager.vmem-pmem-ratio比例,或者进一步调大物理内存。2.1是yarn推荐的比例(ing),这里建议调整物理内存。

如果是少数任务需要特定调整,则我们可以在任务启动时,根据实际情况配置,动态地传递以下参数,来覆盖不适合此任务的默认配置。

配置 描述
mapreduce.map.memory.mb map所用物理内存
mapreduce.reduce.memory.mb reduce所用物理内存
mapreduce.map.java.opts map堆内存,一般为mapreduce.map.memory.mb的80%
mapreduce.reduce.java.opts reduce堆内存,一般为mapreduce.reduce.memory.mb的80%

参考:

http://grepalex.com/2016/12/07/mapreduce-yarn-memory/

相关推荐
Shadow(⊙o⊙)25 分钟前
Linux进阶知识1.0
linux·运维·服务器
闲云自留地1 小时前
告别命令恐惧症,openEuler 基础操作 + 文本 + 网络管理实战
linux·运维·云计算
其实防守也摸鱼2 小时前
常见安全架构中 Shiro 的认证确认机制解析
运维·服务器·数据库·windows·github
^Rocky3 小时前
IT 疑难杂症诊疗室:复杂技术问题解决实录
运维·bug
挖掘狂人4 小时前
当生产环境"变慢",我用这套 perf + strace 30 分钟定位瓶颈
linux·运维·性能优化
阿明66 小时前
Linux进程【Linux】
linux·运维·服务器
Android系统攻城狮6 小时前
Linux Gstreamer深度解析之gst_audio_resampler_update调用流程与实战(三十)
linux·运维·服务器·gstreamer音视频·音视频进阶
微信ipad协议开发6 小时前
微信视频号自动化:内容发布与互动的 API 实现
运维·微信
卷毛迷你猪8 小时前
快速实验篇(A9-2)Python vs MapReduce:小批量任务的工具选择
大数据·hadoop
蓝速科技9 小时前
会议室门牌签到功能选型与落地指南丨蓝速科技
大数据·运维·数据库·人工智能·科技