MapReduce处理大(小)文件的方式

1.输入大文件时

conf.setLong(FileInputFormat.SPLIT_MINSIZE,1024*1024*256L); //小于这个数据时进行合并
conf.setLong(FileInputFormat.SPLIT_MAXSIZE,1024*1024*1024); //大于这个数据时进行切分

2.输入大量小文件时

方式一:小文件先进行Merge操作再使用MapReduce

方式二:使用FileInputFormat子类CombineFileInputFormat重写RecordReader()将多个input path合并成一个InputSplit

/*
 * 实现CombineFilelnputFormat,合并小文件。
 */
public class MCombineInputFormat extends CombineFileInputFormat<ImmutableBytesWritable,KeyValue>{

    @Override
    protected boolean isSplitable(JobContext context, Path filename) {
        //return false;
        //FileInputFormat用isSplitable方法来指定对应的文件是否支持数据的切分,默认情况下都是支持的,也就是true
        return true;
    }

    @Override
    public RecordReader<ImmutableBytesWritable, KeyValue> createRecordReader(
            InputSplit split, TaskAttemptContext context) throws IOException {
        return new CombineFileRecordReader<ImmutableBytesWritable, KeyValue>((CombineFileSplit)split,context,HFileRecordReader.class);
    }

}
原文地址:https://www.cnblogs.com/zyanrong/p/14914866.html