【inputFormat】的源码解析:
1、inputFormat描述了mr程序的输入规则
MapReduce框架会为每一个job设置一个输入规则:
(1)校验输入规则:输入路径是否正确
(2)inputFormat会将输入文件进行逻辑切分成inputSplit,
每一个inputSplit由一个MapTask来运行。
(3)提供了RecordReader的实现,来从inputSplit中读取输入记录,提供给map函数进行处理
如果是基于文件进行处理,使用的通常是FileInputFormat的子类。
根据文件大小进行切分成逻辑的 inputSplit (默认情况下splitSize与块大小一致)
但是可以通过:mapreduce.input.fileinputformat.split.minsize来设置最小值
2.两个方法解析:
1)
List<InputSplit> getSplits(JobContext context)
说明:对输入文件进行逻辑切分成inputSplit,返回多个InputSplit对象
InputSplit对象封装的信息是:input-file-path,start,offset
实际上:InputSplit的子类型对象默认为FileSplit.
属性{
private Path file; //文件路径
private long start; //此分片要处理的数据的偏移量-相对于整个文件的偏移量
private long length; //此分片要处理的原始数据的长度
private String[] hosts; //存储的是要处理的原始数据所在的主机名
private SplitLocationInfo[] hostInfos;
}
2)
RecordReader<K,V> createRecordReader(InputSplit split,TaskAttemptContext context)
说明:为给定的分片创建一个记录读取器。
框架将调用RecordReader。
在使用拆分之前初始化RecordReader#initialize( InputSplit, TaskAttemptContext )
【FileInputFormat】源码解析:
--常量(configuration属性):
属性1:mapreduce.input.fileinputformat.split.maxsize
说明:分片的最大字节数
属性2:mapreduce.input.fileinputformat.split.minsize
说明:分片的最小字节数
属性3:mapreduce.input.fileinputformat.input.dir.recursive
说明:输入路径下是否递归,默认false
属性4:mapreduce.input.fileinputformat.list-status.num-threads
说明:统计线程数目,默认是1
属性5:SPLIT_SLOP=1.1
说明:分片(逻辑)相对于块大小的边界值