MapReduce的型別和格式

2021-08-14 22:55:02 字數 2313 閱讀 2556

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...