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

java.lang.OutOfMemoryError:java.util.Arrays.copyOf(Arrays.java:3236)处的java堆空间,java,hadoop,mapreduce,hbase,yarn,Java,Hadoop,Mapreduce,Hbase,Yarn,我在mapper类中遇到此错误。我正在使用ZipFileInputFormat读取大的zip文件,ZipFileInputFormat将解压,并使用ZipFileRecordReader将其以键形式转换为文件名,将文件内容转换为值。我必须使用分隔符拆分内容并将其插入HBase表中。zip文件的大小非常大,无法拆分。我的代码适用于较小的zip文件,但当我为较大的zip文件运行此代码时,会抛出此错误。 这就是问题发生的地方 // Read the file contents Byt

我在mapper类中遇到此错误。我正在使用ZipFileInputFormat读取大的zip文件,ZipFileInputFormat将解压,并使用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

在我的mapper代码中,我迭代了文件的内容,然后将其拆分,然后插入到HBase中


注意:文件大小非常大。

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


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

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

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

嗯,您似乎正在将一个大文件读入内存。你会以为那会让我恶心。您需要立即停止将文件的所有部分存储在内存中。

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

我尝试从参数行运行1024 MB。但问题相同。压缩格式的文件大小为1.2gb@SUDARSHAN如果文件压缩为1.2GB,压缩比为1:5,则需要至少6GB的堆(可能更多,因为堆中还有其他内容,并且ByteArrayOutputStream在增长时也会将内部字节数组翻一番——最好正确调整大小以避免这种情况)。参考此内容并从命令行更改mapred-site.xmlfrom。它不是递增的。我尝试了-Dmapreduce.map.memory.mb=8192,但我的文件仍在HDFS中。我正在将内容加载到临时位置。这里的问题是它无法将一个1.2 gb的文件未压缩到临时内存中。此外,我还在co的每一行上运行for循环因此,这也可能是问题所在。但如何克服呢?@SUDARSHAN:首先,你需要停止将其写入字节数组。文件是否有可以处理和写入的块单元?例如,如果是文本文件,一行,或者如果是二进制格式,一条记录等。@SUDARSHAN:在这种情况下,使用缓冲输入流或一行一行地读,一行一行地处理,然后在读下一行之前把它写下来。