Hadoop 故障:java.lang.OutOfMemoryError: Java heap space
2015-02-03 10:39
645 查看
一个作业运行时,在maptask阶段出现了如下错误:
根据错误信息初步判断是JVM堆内存不够用导致,有可能是单条数据过大,或JVM内存过小导致,首先验证了该错误并非数据导致,方法是把导致问题的那行数据导出来,单独运行了MR是没有问题的,检查了MR没有死循环分配内存的问题,那基本可以断定确实是JVM的内存太小了,JVM的默认内存分配有两种可能 1)、系统JVM默认分配,大小为物理内存的1/4
2)、在任务脚本执行时指定
map的执行脚本会被hadoop封装在taskjvm.sh中,文本文件可以直接查看
分配了200m,由于集群中没有修改mapred.child.java.opts这个参数,在1.0.4版本中该值为 -Xmx200m,io.sort.mb默认为100m,那么只剩100m供任务使用了,程序中的对象实例会用一部分,运行时临时分配的buffer会用一部分,例如LineRecordReader分配的读入缓冲区。这里只要修改mapred.child.java.opts这个参数就可以了
mapred-site.xml 添加:
这种办法并不通用,因为很多情况下内存过载是由于代码造成的,那种情况下就要具体分析了。
对于JVM内存的查看可以使用jconsole,这是个图形界面,能够远程连接JVM进程,分析JVM性能时可以使用这个工具
1、启动JVM时添加如下参数
2、在客户端连接上面端口
FATAL org.apache.hadoop.mapred.Child: Error running child : java.lang.OutOfMemoryError: Java heap space at org.apache.hadoop.io.Text.setCapacity(Text.java:240) at org.apache.hadoop.io.Text.append(Text.java:216) at org.apache.hadoop.util.LineReader.readLine(LineReader.java:159) at org.apache.hadoop.mapreduce.lib.input.LineRecordReader.nextKeyValue(LineRecordReader.java:97) at org.apache.hadoop.mapred.MapTask$NewTrackingRecordReader.nextKeyValue(MapTask.java:532) at org.apache.hadoop.mapreduce.MapContext.nextKeyValue(MapContext.java:67) at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:143) at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:764) at org.apache.hadoop.mapred.MapTask.run(MapTask.java:370) at org.apache.hadoop.mapred.Child$4.run(Child.java:255) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:416) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1121) at org.apache.hadoop.mapred.Child.main(Child.java:249)
根据错误信息初步判断是JVM堆内存不够用导致,有可能是单条数据过大,或JVM内存过小导致,首先验证了该错误并非数据导致,方法是把导致问题的那行数据导出来,单独运行了MR是没有问题的,检查了MR没有死循环分配内存的问题,那基本可以断定确实是JVM的内存太小了,JVM的默认内存分配有两种可能 1)、系统JVM默认分配,大小为物理内存的1/4
2)、在任务脚本执行时指定
map的执行脚本会被hadoop封装在taskjvm.sh中,文本文件可以直接查看
exec setsid '/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/bin/java' '-Djava.library.path=/opt/hadoop104/libexec/../lib /native/Linux-amd64-64:/data/tmp/mapred/local/taskTracker/hc/jobcache/job_201310281456_0718/attempt_201310281456_0718_m_0000 00_0/work' '-Xmx200m' '-Djava.net.preferIPv4Stack=true' .....
分配了200m,由于集群中没有修改mapred.child.java.opts这个参数,在1.0.4版本中该值为 -Xmx200m,io.sort.mb默认为100m,那么只剩100m供任务使用了,程序中的对象实例会用一部分,运行时临时分配的buffer会用一部分,例如LineRecordReader分配的读入缓冲区。这里只要修改mapred.child.java.opts这个参数就可以了
mapred-site.xml 添加:
<property> <name>mapred.child.java.opts</name> <value>-Xmx1024m</value> </property>
这种办法并不通用,因为很多情况下内存过载是由于代码造成的,那种情况下就要具体分析了。
对于JVM内存的查看可以使用jconsole,这是个图形界面,能够远程连接JVM进程,分析JVM性能时可以使用这个工具
1、启动JVM时添加如下参数
java -Djava.rmi.server.hostname=192.168.2.38 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8888 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false test
2、在客户端连接上面端口
相关文章推荐
- Hadoop 故障:java.lang.OutOfMemoryError: Java heap space
- hadoop :java.lang.OutOfMemoryError: Java heap space
- eclipse使用hadoop插件出现java.lang.OutOfMemoryError: Java heap space
- Hadoop运行Mapreduce作业时报错:java.lang.OutOfMemoryError: Java heap space
- Hadoop 运行作业java堆溢出:java.lang.outofmemoryerror: java heap space hadoop
- hadoop在执行时出现 Caused by: java.lang.OutOfMemoryError: Java heap space
- hadoop Job 运行错误 java.lang.OutOfMemoryError: Java heap space
- hadoop中java.lang.OutOfMemoryError: Java heap space
- Win7+Eclipse+Hadoop 运行WordCount报错:java.lang.OutOfMemoryError: Java heap space
- hadoop :java.lang.OutOfMemoryError: Java heap space
- [hadoop异常] eclipse中运行mapreduce 异常 --java.lang.OutOfMemoryError: Java heap space
- hadoop中java.lang.OutOfMemoryError: Java heap space
- java.lang.OutOfMemoryError: Java heap space
- java.lang.OutOfMemoryError: Java heap space
- Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
- java.lang.OutOfMemoryError: Java heap space解决方法
- java.lang.OutOfMemoryError: Java heap space
- 内存溢出 ava.lang.OutOfMemoryError: Java heap space
- java.lang.OutOfMemoryError: Java heap space
- java.lang.OutOfMemoryError: Java heap space + myeclipse中分配tomcat启动时所占内存大小