Spark2.4-----JVM 内存不足

1、虚拟机配置

物理内存:3G

磁盘大小:100G

2、使用hive插入事务表提示内存不足如下

Diagnostic Messages for this Task:
[2019-08-20 14:10:13.903]
Container [pid=33009,containerID=container_1566276450532_0003_01_000018] 
is running 337144320B beyond the 'VIRTUAL' memory limit. 
Current usage: 195.4 MB of 1 GB physical memory used; 
2.4 GB of 2.1 GB virtual memory used. Killing container.
Dump of the process-tree for container_1566276450532_0003_01_000018 :
        |- PID PPID PGRPID SESSID CMD_NAME USER_MODE_TIME(MILLIS) 
        SYSTEM_TIME(MILLIS) VMEM_USAGE(BYTES) RSSMEM_USAGE(PAGES) 
        FULL_CMD_LINE
        |- 33450 33009 33009 33009 (java) 463 48 2582212608 49718 
        /hello/java/javajdk/jdk1.8/bin/java -Djava.net.preferIPv4Stack=true
         -Dhadoop.metrics.log.level=WARN -Xmx820m 
         -Djava.io.tmpdir=/hello/java/hadoop/hadoop3.1/tmp/nm-local-dir/usercache/root/appcache/application_1566276450532_0003/container_1566276450532_0003_01_000018/tmp 
         -Dlog4j.configuration=container-log4j.properties 
         -Dyarn.app.container.log.dir=/hello/java/hadoop/hadoop3.1/logs/userlogs/application_1566276450532_0003/container_1566276450532_0003_01_000018 
         -Dyarn.app.container.log.filesize=0 
         -Dhadoop.root.logger=INFO,CLA 
         -Dhadoop.root.logfile=syslog 
         -Dyarn.app.mapreduce.shuffle.logger=INFO,shuffleCLA 
         -Dyarn.app.mapreduce.shuffle.logfile=syslog.shuffle 
         -Dyarn.app.mapreduce.shuffle.log.filesize=0 
         -Dyarn.app.mapreduce.shuffle.log.backups=0 org.apache.hadoop.mapred.YarnChild 127.0.0.1 40424 attempt_1566276450532_0003_r_000001_3 18

挑出重点

Container [pid=33009,containerID=container_1566276450532_0003_01_000018] is running 337144320B beyond the 'VIRTUAL' memory limit. Current usage: 195.4 MB of 1 GB physical memory used; 2.4 GB of 2.1 GB virtual memory used. Killing container.

3、错误分析

195.4MB:任务所占的物理内存

1GB: mapreduce.map.memory.mb 参数默认设置大小

2.4 GB:程序占用的虚拟内存

2.1 GB: mapreduce.map.memory.mb 乘以 yarn.nodemanager.vmem-pmem-ratio 得到的

 

其中 yarn.nodemanager.vmem-pmem-ratio 是 虚拟内存和物理内存比例,在yarn-site.xml中设置,默认是2.1

<property>
<description>Ratio between virtual memory to physical memory when
setting memory limits for containers. Container allocations are
expressed in terms of physical memory, and virtual memory usage
is allowed to exceed this allocation by this ratio.
</description>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>2.1</value>
</property>

很明显,container占用了2.4G的虚拟内存,但是分配给container的却只有2.1GB。所以kill掉了这个container

 

上面只是map中产生的报错,当然也有可能在reduce中报错,如果是reduce中,那么就是mapreduce.reduce.memory.db * yarn.nodemanager.vmem-pmem-ratio

 

注:

物理内存:真实的硬件设备(内存条)

虚拟内存:利用磁盘空间虚拟出的一块逻辑内存,用作虚拟内存的磁盘空间被称为交换空间(Swap Space)。(为了满足物理内存的不足而提出的策略)

linux会在物理内存不足时,使用交换分区的虚拟内存。内核会将暂时不用的内存块信息写到交换空间,这样以来,物理内存得到了释放,这块内存就可以用于其它目的,当需要用到原始的内容时,这些信息会被重新从交换空间读入物理内存。

 

4、解决方案

1. 取消虚拟内存的检查(不建议):

在yarn-site.xml或者程序中中设置yarn.nodemanager.vmem-check-enabled为false

<property>
  <name>yarn.nodemanager.vmem-check-enabled</name>
  <value>false</value>
  <description>Whether virtual memory limits will be enforced for containers.</description>
</property>

除了虚拟内存超了,也有可能是物理内存超了,同样也可以设置物理内存的检查为 yarn.nodemanager.pmem-check-enabled :false

个人认为这种办法并不太好,如果程序有内存泄漏等问题,取消这个检查,可能会导致集群崩溃。

 

2. 增大mapreduce.map.memory.mb 或者 mapreduce.map.memory.mb (建议)

个人觉得是一个办法,应该优先考虑这种办法,这种办法不仅仅可以解决虚拟内存,或许大多时候都是物理内存不够了,这个办法正好适用

 

3. 适当增大 yarn.nodemanager.vmem-pmem-ratio的大小,为物理内存增大对应的虚拟内存, 但是这个参数也不能太离谱

 

4. 如果任务所占用的内存太过离谱,更多考虑的应该是程序是否有内存泄漏,是否存在数据倾斜等,优先程序解决此类问题

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值