Hadoop MapReduce中Mapper的最大输入文件大小(没有拆分)是多少?

时间:2016-12-14 19:43:01

标签: hadoop mapreduce hdfs google-cloud-storage

我编写了一个MapReduce作业,可以将一些Protobuf文件作为输入。由于文件的性质(不可分割),每个文件由一个映射器处理(实现自定义FileInputFormatisSplitable设置为false)。该应用程序适用于小于~680MB的输入文件大小并生成结果文件,但是,一旦输入文件大小超过该限制,应用程序就会成功完成但会生成一个空文件。

我想知道我是否达到Mapper的文件大小限制?如果重要,则文件存储在Google Storage(GFS)上,而不是HDFS。

谢谢!

1 个答案:

答案 0 :(得分:0)

原来我遇到了一个着名的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。为了解决这个问题,我不得不通过执行

手动设置容量(my_max_size)
value.setCapacity(my_ideal_max_size)

之前value.set()

希望这有助于其他人!