mapreduce job让一个文件只由一个map来处理

有一批数据用hadoop mapreduce job处理时,业务特点要求一个文件对应一个map来处理,如果两个或多个map处理了同一个文件,可能会有问题。开始想通过设置 dfs.blocksize 或者 mapreduce.input.fileinputformat.split.minsize/maxsize 参数来控制map的个数,后来想到其实不用这么复杂,在自定义的InputFormat里面直接让文件不要进行split就可以了。

public class CustemDocInputFormat extends TextInputFormat {

	@Override
	public RecordReader<LongWritable, Text> createRecordReader(InputSplit split, TaskAttemptContext context) {
		DocRecordReader reader = null;
		try {
			reader = new DocRecordReader(); // 自定义的reader
		} catch (IOException e) {
			e.printStackTrace();
		}
		return reader;
	}

	@Override
	protected boolean isSplitable(JobContext context, Path file) {
		return false;
	}
}

这样,输入文件有多少个,job就会启动多少个map了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注