总篇121篇 2021年第14篇
前言
本文主要讲述了在使用MapReduce计算框架时发生Java.lang.OutOfMemory(OOM)的故障及其处理方式。通过本文可以了解到OOM问题在MapReduce框架发生的四个具体位置,以及不同位置的解决方案,给予广大读友们类似问题的解决思路。
01
介绍
正如大家所知的,Hadoop早已成为了大数据行业的事实标准。作为一个可靠,可扩展的分布式项目Hadoop的核心组成模块有YARN,HDFS和MapReduce,其中YARN是用于作业调度和集群资源管理的框架,HDFS为海量数据提供了存储服务,MapReduce为海量数据提供计算框架。本文我们主要介绍在使用MapReduce计算框架时发生java.lang.OutOfMemoryError的处理方式。
先简单的介绍一下java.lang.OutOfMemoryError错误,当 Java 虚拟机由于内存不足而无法分配对象并且垃圾收集器无法回收已使用的内存时java虚拟机就会抛出java.lang.OutOfMemoryError 错误。造成 OOM错误的原因大体可以分为两类:
1、内存泄漏:
内 存泄漏是指程序申请内存后,无法释放已申请的内存。 通常的解决方法是通过java分析工具定位到泄漏代码位置。 通过优化代码来避免内存泄漏。 常用的分析工具有: MAT,JProfile
2、内存溢出:
即内存没有泄漏,内存中的对象确实都需要存活。这时我们首先需要检查JVM堆参数(-Xmx和-Xms)将JVM堆参数调大,先让程序正常运行。然后检查程序代码判断对象存活周期长是否合理,通过优化程序减少对象内存的占用。
02
武林秘笈(解决办法)
在生产环境中无论是内存泄漏还是内存溢出原因造成的服务故障,首先要做的最重要事情是保服务,使服务依旧可以正常对外提供服务,这时就需要我们平台管理员介入,在资源允许的前提下调整增加JVM参数重启服务来缓解OOM问题。然后监控服务在服务发生故障前重启服务避免OOM。
Hadoop框架是以java为主要开发语言的,如果你使用过Java语言那么你一定也遇到过OOM堆内存溢出的错误。接下来我们来详细看看MapReduce分布式计算框架运行过程中可能出现OOM问题的位置和每个位置相应的可配置参数,如果遇到了OOM问题并且需要保证服务正常运行,那么就可以通过管理员介入调节JVM参数来保障服务运行。
1、hadoop客户端
在Hadoop客户端提交Jar包时遇到报错OOM问题截图:
[dpm@lf-hadoop-apollo-28-235-41〜]$ hadoop jar /data/sysdir/servers/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar wordcount-Dmapreduce.job.queuename=q_m_tch.m_tch_basic /hyll0/a20 /test/hy004 java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Arrays.java:3236) at sun.misc.Resource.getBytes(Resource.java:117) at java.net.URLClassLoader.defineClass(URLClassLoader.java:462) at java.net.URLClassLoader.access$100(URLClassLoader.java:73) at java.net.URLClassLoader$l.run(URLClassLoader.java:368) at java.net.URLClassLoader$l.run(URLClassLoader.java:362) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.jav