有一批数据用hadoop mapreduce job处理时,业务特点要求一个文件对应一个map来处理,如果两个或多个map处理了同一个文件,可能会有问题。开始想通过设置 dfs.blocksize 或者 mapreduce.input.fileinputformat.split.minsize/maxsize 参数来控制map的个数,后来想到其实不用这么复杂,在自定义的InputFormat里面直接让文件不要进行split就可以了。
public
class
CustemDocInputFormat
extends
TextInputFormat {
@Override
RecordReader<LongWritable, Text> createRecordReader(InputSplit split, TaskAttemptContext context) {
DocRecordReader reader =
null
;
try
{
reader =
new
DocRecordReader();
// 自定义的reader
}
catch
(IOException e) {
e.printStackTrace();
return
reader;
protected
boolean
isSplitable(JobContext context, Path file) {
false
这样,输入文件有多少个,job就会启动多少个map了。