java.lang.OutOfMemoryError: Java heap space at java.util.Arr



我在映射器类中收到此错误。我正在使用将解压缩的 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 中。

注意:文件大小非常大。

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

-

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

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

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

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

你的文件存储在 hdfs 中吗?如果没有,您可以将文件放在hdfs中,然后运行作业以简单地加载内容并将其存储到其他位置。然后,您可以在此新位置上运行作业,并且可以丢弃旧的压缩位置。您指定的文件大小是压缩文件,我猜解压缩后会大得多。

相关内容

  • 没有找到相关文章

最新更新