java.lang.OutOfMemoryError:java.util.Arrays.copyOf中的Java堆空间(Arrays.java:3236)

时间:2016-10-14 05:02:55

标签: java hadoop mapreduce hbase yarn

我在mapper类中收到此错误。我正在使用ZipFileInputFormat阅读大型zip文件,它将解压缩并使用ZipFileRecordReader我将其作为文件名和文件内容转换为密钥。我必须使用我的分隔符拆分内容并将其插入HBase表。 zip文件的大小非常巨大,并且不能分割。我的代码适用于较小的zip文件但是当我为巨大的zip文件运行它时会抛出此错误。 这就是问题发生的地方。

 // Read the file contents
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        byte[] temp = new byte[8192];
        while ( true )
        {
            int bytesRead = 0;
            try
            {
                bytesRead = zip.read( temp, 0, 8192 );
            }
            catch ( EOFException e )
            {
                if ( ZipFileInputFormat.getLenient() == false )
                    throw e;
                return false;
            }
            if ( bytesRead > 0 )
                bos.write( temp, 0, bytesRead );
            else
                break;
        }

我尝试将8192增加到一些大数字但是同样的错误。 这就是我运行mapreduce的方式。  hadoop jar bulkupload-1.0-jar-with-dependencies.jar -Dmapreduce.map.memory.mb=8192 -Dmapreduce.map.java.opts=Xmx7372m FinancialLineItem FinancialLineItem sudarshan/output3 9

在我的映射器代码中,我迭代文件的内容,然后将其拆分,然后插入HBase。

注意:文件大小非常大。

4 个答案:

答案 0 :(得分:1)

这只是意味着JVM内存不足。发生这种情况时,您基本上有两个选择:

- >允许JVM使用-Xmx VM参数使用更多内存。例如,允许JVM使用1 GB(1024 MB)的内存 - >改进/修复应用程序,以便它使用更少的内存

答案 1 :(得分:1)

好吧,你似乎正在将一个大文件读入内存。你会期望这会导致OOME。您需要立即停止将所有文件部分保留在内存中。

答案 2 :(得分:0)

根据错误,我认为它不是关于zip文件的大小,而是关于未压缩文件存储到内存中的事实。所有数据都写入,需要维护一个字节数组,并且在增长时,有时会耗尽内存。

不熟悉代码的目的,但我想最好的解决方案是将它存储到一些临时文件中,可能映射到内存中,然后对其进行一些操作。

答案 3 :(得分:0)

您的文件是否存储在hdfs中?如果没有,您可以将文件放在hdfs中,然后运行作业,只需将内容加载并存储到其他位置即可。然后,您可以在这个新位置上运行作业,旧的压缩位置可以被丢弃。您指定的文件大小是压缩文件,我想,在unzipp操作后会更大。