hadoop 源码分析一
InputFormat:将输入的数据集切割成小数据集 InputSplits, 每一个 InputSplit 将由一个 Mapper 负责处理。此外 InputFormat 中还提供一个 RecordReader 的实现, 将一个 InputSplit 解析成 <key,value> 对提供给 map 函数。
InputSplit:继承自Writable接口,因此一个InputSplit实则包含了四个接口函数,读和写(readFields和write),getLength能够给出这个split中所记录的数据大小,getLocations能够得到这个split位于哪些主机之上(blkLocations[blkIndex].getHosts()),这里需要说明的是一个block要么对应一个split,要么对应多个split,因此每个split都可以从它所属的block中获取主机信息,而且我猜测block的大小应该是split的整数倍,否则有可能一个split跨越两个block。
RecordReader:其实这个接口主要就是为了维护一组<K,V>键值对,任何一个实现了该接口的类的构造函数都需要是“(Configuration conf, Class< ? extends InputSplit> split)”的形式,因为一个RecordReader是有针对性的,就是针对某种split来进行的,因此必须得与某种split绑定起来。这个接口中最重要的方法就是next,在利用next进行读取K和V时,需要先通过createKey和createValue来创建K和V的对象,然后再传给next作为参数,使得next对形参中的数据成员进行修改。