有些程序可能不希望文件被切分,而是用一个mapper完整处理每一个输入文件。例如,检查一个文件中所有记录是否有序,一个简单的方法是顺序扫描第一条记录并并比较后一条记录是否比前一条要小。如果将它实现为一个map任务,那么只有一个map操作整个文件时,这个算法才可行。
有二种办法可以保证输入文件不被切分。第一种(最简单但不怎么漂亮的)方法就是增加最小分片大小,将它设置成大于要处理的最大文件大小。把它设置为最大值long.MAX_VALUE即可。每二种方法就是使用FileInputFormat具体子类,并且重载isSplitable()方法把返回值设置为false。例如,以下就是一个不可分割的TextInputFormat:
import org.apache.hadoop.fs.*; import org.apache.hadoop.mapred.TextInputFormat; import org.apache.hadoop.mapreduce.JobContext; public class DontSplitMap { //老的版本 public class NonSplittableTextInputFormat4Old extends TextInputFormat{ @Override protected boolean isSplitable(FileSystem fs , Path file) { return false; } } //较新的版本 public class NonSplittableTextInputFormat4New extends org.apache.hadoop.mapreduce.lib.input.TextInputFormat{ @Override protected boolean isSplitable(JobContext context, Path file) { return false; } } }