我有一个从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
如何阅读文件?
答案 0 :(得分:2)
如果我说得对 - 你将整个文件加载到内存中。与hadoop无关 - 您无法在Java上执行此操作并确保您有足够的内存。
我建议定义一些合理的块并使其成为“记录”
答案 1 :(得分:1)
当Map函数运行时,hadoop在名为MapOutputBuffer的内存缓冲区中收集输出记录。
此内存缓冲区的总大小由io.sort.mb属性设置,默认为100 MB。
尝试在mapred-site.xml中增加此属性值