hadoop的map函式<key,value>的來源之Inputformat
剛接觸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為一行句子