容器使用超过了虚拟内存的限制大小,该容器被杀死,导致作业提交失败

来源:互联网 发布:张铁林书法 知乎 编辑:程序博客网 时间:2024/04/30 14:18

is running beyond virtual memory limits. Current usage: 53.7 MB of 1 GB physical memory used; 4.4 GB of 2.1 GB virtual memory used. Killing container.
容器使用超过了虚拟内存的限制大小,该容器被杀死,导致作业提交失败

physical memory used由于使用了默认虚拟内存率(也就是2.1倍),所以对于Map Task和Reduce Task总的虚拟内存为都为1G*2.1=2.1G。而应用的虚拟内存4.4G超过了这个数值,故报错 

解决方案:在启动Yarn是调节虚拟内存率或者应用运行时调节内存大小。
解决思路参考
要解决这个异常,得熟悉yarn自身的虚拟内存管理规则,在Yarn平台中,CPU,内存,磁盘都被抽象成资源来自使用,管理资源的角色主要有Yarn Resource Manager (RM) 负责总的资源调度,然后每个节点上有Nodemanager 来监听守护资源,在具体到每一个应用上是通过Application Master (AM) container来给Map或Reduce任务来分配资源
具体的属性如下:

  1. yarn.nodemanager.resource.memory-mb
    可分配的物理内存总量,默认是8*1024MB。
  2. yarn.nodemanager.vmem-pmem-ratio
    每单位的物理内存总量对应的虚拟内存量,默认是2.1,表示每使用1MB的物理内存,最多可以使用2.1MB的虚拟内存总量。
    第二个属性,比率的控制影响着虚拟内存的使用,当yarn计算出来的虚拟内存,比在mapred-site.xml里的mapreduce.map.memory.mb或mapreduce.reduce.memory.mb2.1倍还要多时,就会发生上面截图中的异常,而默认的mapreduce.map.memory.mb或mapreduce.reduce.memory.mb得初始大小为1024M,然后根据异常中的yarn自身根据运行环境推算出来的虚拟内存来做比较,发现比1024*2.1还要大,所以就会由NodeManage守护进程kill掉AM容器,从而导致整个MR作业运行失败,现在我们只需要调大这个比率即可,避免发生这种异常。具体调大多小,可根据具体情况来设置。

详细解决配置设置(各集群根据自己的配置修改):
mapred-site.xml:

<configuration>            <property>                <name>mapreduce.framework.name</name>                <value>yarn</value>            </property>            <property>                <name>mapreduce.jobhistory.address</name>            <value>10.45.249.173:10020</value>            </property>            <property>                <name>mapreduce.task.io.sort.mb</name>                <value>1024</value>             </property>             <property>                <name>mapred.child.java.opts</name>                <value>-Xmx2560M</value>             </property>             <property>                <name>mapreduce.reduce.java.opts</name>                <value>-Xmx2560M</value>             </property>             <property>                    <name>mapreduce.map.memory.mb</name>                    <value>2560</value>             </property>             <property>                          <name>mapreduce.reduce.memory.mb</name>                <value>2560</value>             </property></configuration>

yarn-site.xml:

<configuration><!-- Site specific YARN configuration properties -->    <property>        <name>yarn.resourcemanager.hostname</name>        <value>SparkMaster</value>    </property>     <property>        <name>yarn.nodemanager.aux-services</name>        <value>mapreduce_shuffle</value>    </property>    <property>        <name>yarn.nodemanager.vmem-pmem-ratio</name>        <value>21</value>    </property>    <property>        <name>yarn.nodemanager.pmem-check-enabled</name>        <value>false</value>    </property>    <property>        <name>yarn.nodemanager.vmem-check-enabled</name>        <value>false</value>    </property></configuration>
同步集群,并在客户端同步

下面的参数是关于mapreduce任务运行时的内存设置,如果有的任务需要可单独配置,就统一配置了。如果有container被kill 可以适当调高
mapreduce.map.memory.mb map任务的最大内存
mapreduce.map.java.opts -Xmx1024M map任务jvm的参数
mapreduce.reduce.memory.mb reduce任务的最大内存
mapreduce.reduce.java.opts -Xmx2560M reduce任务jvm的参数
yarn.scheduler.minimum-allocation-mb 容器的最小内存
yarn.nodemanager.resource.memory-mb 容器的最大内存
如果mapreduce.reduce.memory.mb或mapreduce.map.memory.mb小于容器的最小内存,则容器内存为自身所设置的参数值yarn.scheduler.minimum-allocation-mb
mapreduce.task.io.sort.mb 512 Higher memory-limit while sorting data for efficiency.

0 0
原创粉丝点击