Java GZIPInputStream OutOfMemoryError

       记录一个集群中用户提交任务失败的情况,用户的任务一直没有问题,但是某天的日志过来后,在集群中报错,报的是GZipInputStream 的OutOfMemory问题。刚开始认为是数据过大,将内存设置大一些就好了,但是设置内存不管作用,在单机给他的日志做测试的时候依然报错,错误堆栈信息为:

2014-11-10 09:52:54,743 FATAL [main] org.apache.hadoop.mapred.YarnChild: Error running child : java.lang.OutOfMemoryError

        at java.util.zip.Inflater.inflateBytes(Native Method)

        at java.util.zip.Inflater.inflate(Inflater.java:238)

        at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:135)

        at java.util.zip.GZIPInputStream.read(GZIPInputStream.java:90)

        at com.sina.suda.mr.util.BinaryDecoder.unGZip(BinaryDecoder.java:21)

        at com.sina.suda.mr.util.BinaryDecoder.decodePostStr(BinaryDecoder.java:67)

       根据堆栈查看了一下jdk source code的路径,发现最后的native 代码报错。Google该问题,发现时jdk6的问题,由于日志传输过程中gzip文件corrrupt掉了,这样导致了OutOfMemory。解决方法比较暴力,在外层catch OutOfMemoryError,然后返回一个空结果。

Print Friendly

jiang yu

Leave a Reply