http://www.rigongyizu.com/mapreduce-job-one-map-process-one-file/
有一批數據用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了。
相關文章
- 2014年8月19日 Hadoop : 一個目錄下的數據只由一個map處理
- 2014年6月27日 一個Hadoop程序的優化過程 – 根據文件實際大小實現CombineFileInputFormat
- 2013年9月23日 hadoop用MultipleInputs/MultiInputFormat實現一個mapreduce job中讀取不同格式的文件
- 2012年1月9日 hadoop mapreduce和hive中使用SequeceFile+lzo格式數據
- 2014年3月11日 hadoop集群DataNode起不來:“DiskChecker$DiskErrorException: Invalid volume failure config value: 1”