1

我有一个从 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如何去阅读文件?

4

2 回答 2

2

如果我说得对 - 你将整个文件加载到内存中。与 hadoop 无关——你不能在 Java 上做到这一点,并确保你有足够的内存。
我建议定义一些合理的块并使其成为“记录”

于 2013-01-01T18:24:38.747 回答
1

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

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

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

于 2012-12-31T16:12:00.790 回答