1. 程式人生 > 其它 >MapReduce處理大(小)檔案的方式

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
); } }