MapReduce的型別與格式

2021-09-19 22:38:24 字數 3045 閱讀 2237

之前討論過,輸入資料的每個分片對應乙個map任務來處理

在mapreduce中輸入分片被表示為inputsplit類,原型如下:

public

abstract

class

inputsplit

開發者不用直接操作inputsplit,inputformat根據輸入的資料來建立計算的inputsplit並將其分割為一各個record該類的原型如下:

public

abstract

class

inputformat

正如mapreduce工作機制中討論到的一樣

客戶端執行作業的時候會對輸入的資料計算分片資訊,呼叫的就是inputformat的getsplits方法

並將分片分析交給am由此可以知道分片在集群上的儲存位置並申請資源

public

void

run(context context) throw ioexception,interruptedexception

cleanup(context);

}

fileinputformat是檔案類的inputformat的預設實現,其不能直接使用,但是提供了兩個功能:

1.指定輸入資料的路徑

2.輸入檔案生成分片的**實現,即實現了inputformat抽象類的getsplits方法

而如何把分片分割為記錄(即inputformat的createrecordreader方法)則由其具體的子類來完成

常見的有textinputformat等,類圖如下:

需要注意的是fileinputformat設定輸入路徑的時候,如果包含子路徑預設是當做檔案處理的

如果需要遞迴的讀取子目錄檔案,那麼需要設定mapreduce.input.fileinputformat.input.dir.recursive屬性為true

fileinputformat的getsplit方法是如何將資料切分成乙個個分片呢?

fileinputformat只切分大檔案,大檔案是指檔案超過hdfs塊的大小,因為通常分片大小是和hdfs塊大小相同的

但是輸入分片的大小是可以通過屬性來控制的,如下:

屬性名型別

預設值描述

mapreduce.input.fileinputformat.split.minsize

int1(位元組)

input split的最小值

mapreduce.input.fileinputformat.split.maxsize

long

long.max_value

input split的最大值

dfs.blocksize

long

128m

hdfs塊大小

通過這三個屬性來控制輸入分片的大小的同時也可以控制作業的map任務數,定義分片大小的時候要注意:

太大,會導致map讀取的資料可能跨越不同的節點,沒有了資料本地化的優勢

太小,會導致map數量過多,任務啟動和切換開銷太大,並行度過高

那麼分片的大小是如何從這三個屬性中得到的呢?計算公式如下:

max(minimumsize,min(maximumszie,blocksize))

首先從最大分片大小和block大小之間選出乙個比較小的,再和最小分片大小相比選出乙個較大的

由於預設情況下,minimumsize小於blocksize小於maximumszie,所以分片的預設大小和blocksize一致

在例項場景中介紹combinefileinputformat:自定義分片策略解決大量小檔案問題

hadoop提供了各個場景下使用的inputformat,具體介紹可以參考hadoop權威指南或者網上的資料~

和前一節講述的輸入格式一樣,hadoop也有一套輸出格式,如下圖:

textfileoutputformat是預設的輸出格式,其鍵值可以是任意的型別

將會呼叫鍵值的tostring方法,並以製表符分割,鍵值之間的分隔符可以通過mapreduce.output.textoutputformat.separator屬性來設定

可以將資料內容以sequencefile或者mapfile的形式儲存在hdfs中

預設情況下,乙個reducer會以特定的檔名產生乙個檔案,這個動作是自動完成的

有時候我們可能需要對輸出檔案的檔名和數量進行控制

所以hadoop為我們提供了multipleoutputs類

multipleoutputs的使用示例如下:

static class multipleoutputreducer

@override

protected

void

reduce(text key,iterablevalues,context context)ioexception,interruptedexception

}@override

protected

void

cleanup(context context)

}

如此一來,key相同的資料會被輸出到同乙個檔案中,並且以該key的值作為檔名的開頭

在這個過程中,我們設定可以設定多層的輸出路徑:

@override

protected

void

reduce(text key,iterablevalues,context context)ioexception,interruptedexception

}

fileoutputformat即使沒有資料也會產生乙個空檔案,有時候我們並不想這樣子

這時候就可以使用lazyoutputformat,該類只有在第一條資料真正輸出的時候才會建立檔案

mapreduce的型別與格式

1 預設的mapreduce作業 預設的輸入格式是textinputformat 預設的partitioner是hashpartitioner 預設的reducer是reducer 預設情況下,只有乙個reducer 沒有設定map任務的數量,原因是該數量等於輸入檔案被劃分成的分塊數,取決於輸入檔案...

MapReduce的型別和格式

context類物件用於輸出鍵 值對 map k1,v1 list k2,v2 combiner k2,list v2 list k2,v2 reduce k2,list v2 list k3,v3 partition函式對中間結果的鍵值對 k2 v2 進行處理,並返回乙個分割槽索引 partiti...

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