在hadoop中使用mapreduce读取大文件

时间:2012-12-31 09:56:55

标签: java hadoop mapreduce elastic-map-reduce amazon-emr

我有一个从FTP服务器读取文件并将其写入HDFS的代码。我已经实现了一个自定义的InputFormatReader,它将输入的isSplitable属性设置为false。但是这会给我以下错误。

INFO mapred.MapTask: Record too large for in-memory buffer

我用来读取数据的代码是

Path file = fileSplit.getPath();
                FileSystem fs = file.getFileSystem(conf);
                FSDataInputStream in = null;
                try {
                    in = fs.open(file);


                    IOUtils.readFully(in, contents, 0, contents.length);

                    value.set(contents, 0, contents.length);

                }

如何在不拆分输入文件的情况下避免java heap space error的任何想法?或者,如果我isSplitable true如何阅读文件?

2 个答案:

答案 0 :(得分:2)

如果我说得对 - 你将整个文件加载到内存中。与hadoop无关 - 您无法在Java上执行此操作并确保您有足够的内存。
我建议定义一些合理的块并使其成为“记录”

答案 1 :(得分:1)

当Map函数运行时,hadoop在名为MapOutputBuffer的内存缓冲区中收集输出记录。

此内存缓冲区的总大小由io.sort.mb属性设置,默认为100 MB。

尝试在mapred-site.xml中增加此属性值