原來我碰到了一個衆所周知的Hadoop bug here。這裏的問題是用於編寫Protobuf文件的BytesWritable
類。在自定義RecordReader
我以前做過
@Override
public boolean nextKeyValue() throws IOException, InterruptedException {
if(!processed){
byte[] contents = new byte[(int) fileSplit.getLength()];
Path file = fileSplit.getPath();
log.debug("Path file:" + file);
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);
}catch(Exception e){
log.error(e);
}finally{
IOUtils.closeQuietly(in);
}
processed = true;
return true;
}
return false;
}
默認情況下,錯誤設定的最大內容大小INTEGER.MAX_SIZE/3是〜680MB。爲了解決這個問題,我做
value.setCapacity(my_ideal_max_size)
我做value.set()
之前必須手動setCapacity(my_max_size)。
希望這可以幫助別人!