Java 在hadoop中使用mapreduce读取大文件
我有一个从FTP服务器读取文件并将其写入Java 在hadoop中使用mapreduce读取大文件,java,hadoop,mapreduce,elastic-map-reduce,amazon-emr,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(
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堆空间错误
而不拆分输入文件?或者,如果我使isSplitable
为true
如何读取文件?当Map函数运行时,hadoop会在名为MapOutputBuffer的内存缓冲区中收集输出记录。此内存缓冲区的总大小由io.sort.mb属性设置,默认为100 mb
如果我没有弄错,请尝试在mapred site.xml中增加此属性值-将整个文件加载到内存中。与hadoop无关-您不能在Java上这样做,并且必须确保您有足够的内存
我建议定义一些合理的块并使其成为“记录”不起作用。。我尝试通过我的代码使用'conf.set'设置它。。它确实将该值设置为我指定的值,但仍会遇到堆空间错误。不起作用。。我尝试通过我的代码使用'conf.set'设置它。。它确实将该值设置为我指定的值,但是它仍然会运行到堆空间错误中,我知道您在说什么。我甚至试着编码它。但我开始在关闭从源读取的输入流时遇到问题。每次将一个输入块作为记录读写到映射器中时,都不可能返回读取剩余的。我将读取1024个数据块,并将其设置为记录的值<代码>while(totalBytes