有一批數據用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了。