刚接触mapreduce的编程时很是疑惑,map的<key,value>源源不断的到底是从哪里产生的,学习后才知道一切都源自main函数中的Inputformat函数,这个函数的目的就是将源数据切片,并将切片转变为<key,value>对,源源不断的供给给map,具体是Inputformat是一个抽象的接口,里面有两个函数,一个是 list<InputSplit>GetSplit()
public abstrct class Inputformat<K,V>
{
public abstract
list<InputSplit>GetSplit(,,,)
public abstract
ReacdorReader<K,V>createRecordReader(,,,)
}
这个函数的目的是将一个文件进行切片,切片的大小为一个block,这个block就对应一个map函数,所以有几个InputSplit就有几个map task,该函数并不是真的将Hdfs中的文件切片,而是逻辑切片,每个InputSplit记录的都是对应切片的长度和其实位置,等元数据信息,在看InputSplit,也是一个类,该类中有两个方法,getLength(),getLocation(),这两个函数的目的就是获取切片的长度和位置,
public abstract class InputSplit
{
public abstract long getlength(,,,)
public abstract string[] getlocation(,,)
}
Inputformat中的createRecordReader (,,)函数用来读取切片对应的数据,并将该数据转化为一个个的<key,value>源源不断的供给个map函数,
由此可见InputSplit只是逻辑切分文件,真正的访问文件内容是由ReacdorReader来完成,
,当然我们也可以根据自己的要求来定制inputformat,自己控制文件的切分规则,FileInputformat是Inputformat默认子类,该子类有中lineRecodrReader()函数,该函数的作用就是将切片转化<key,value>其中key为行偏移,value为一行句子。