context類物件用於輸出鍵-值對
map: (k1, v1) -> list(k2, v2)
combiner: (k2, list(v2)) -> list(k2, v2)
reduce: (k2, list(v2)) -> list(k3, v3)
partition函式對中間結果的鍵值對 (k2 , v2)進行處理,並返回乙個分割槽索引 partition index
partition: (k2 , v2) - integer
輸入資料型別由輸入格式進行設定:
textinputformat 的鍵型別是 longwritable(行偏移量) ,值是 text
其他型別通過job類的方法顯式進行設定,如果 k2,k3相同,則不需要呼叫setmapoutputkeyclass(),
如果v2,v3相同,只需要使用setoutputvalueclass()
預設的partitioner 是 hashpartitioner,它對每條記錄的鍵進行雜湊操作以決定記錄應該屬於哪個分割槽,
每個分割槽有乙個reduce任務處理,所以分割槽數等於作業的reduce任務個數
map的任務數量等於輸入檔案被劃分的分塊數
reduce 增加數量可縮短reduce過程,一條法則:目標reducer保持在每個執行5分鐘左右,且產生至少乙個hdfs塊的輸出比較合適
public class stationpartitioner extends partitioner
private int getpartition(string stationid)
乙個輸入分片就是由單個map操作來處理的輸入塊,分片不包含資料本身,而是指向資料的引用
mapreduce不必直接處理inputsplit,它是由inputformat建立的(inputformat負責建立輸入分片並將他們分隔成記錄)
public abstract class inputformat
fileinputformat類
fileinputformat是所有檔案作為其資料來源的inputformat實現的基類
有兩個功能:
用於支出作業的輸入檔案位置
為輸入檔案生成分片的**實現
fileinputformat輸入路徑:
四中靜態方法設定job輸入路徑:
addinputpath
addinputpaths
setinputpaths
setinputpaths
fileinputformat輸入分片
fileinputformat只分隔大檔案。大指的是檔案超過hdfs塊的大小,分片通常與hdfs塊大小一樣,可設定
小檔案與combinefileinputformat
相對於大批量的小檔案,hadoop更適合處理少量的大檔案
如果乙個把1gb檔案按100kb劃分,10000個檔案
避免切分
如果不希望檔案被切分:
增加最小分片大小
使用fileinputformat具體子類,重寫issplitable(),把返回值設定為false
public class nonsplittabletextinputformat extends textinputformat
}
把整個檔案作為一條記錄處理
public class wholefileinputformat
extends fileinputformat
@override
public recordreadercreaterecordreader(
inputsplit split, taskattemptcontext context) throws ioexception,
interruptedexception
}
class wholefilerecordreader extends recordreader
@override
public boolean nextkeyvalue() throws ioexception, interruptedexception finally
processed = true;
return true;
}return false;
} @override
public nullwritable getcurrentkey() throws ioexception, interruptedexception
mapreduce的型別與格式
1 預設的mapreduce作業 預設的輸入格式是textinputformat 預設的partitioner是hashpartitioner 預設的reducer是reducer 預設情況下,只有乙個reducer 沒有設定map任務的數量,原因是該數量等於輸入檔案被劃分成的分塊數,取決於輸入檔案...
MapReduce的型別與格式
之前討論過,輸入資料的每個分片對應乙個map任務來處理 在mapreduce中輸入分片被表示為inputsplit類,原型如下 public abstract class inputsplit 開發者不用直接操作inputsplit,inputformat根據輸入的資料來建立計算的inputspli...
Mapreduce的輸入格式
map k1,v1 list k2,v2 reduce k2,list v2 list k3,v3 reduce的輸入型別必須與map函式的輸出型別相同 combine的輸入輸出鍵值型別必須相同,也就是k2,v2 static class reducer extends reudcer partio...