九 hadoop mapreduce分割槽

2021-09-24 12:18:22 字數 1083 閱讀 6357

一、什麼時候分割槽?

(1)分割槽的實現

通過繼承partitioner類,實現getpartition方法。

public int getpartition(key key, value value, int reducetasknumber)
map結束後得到的每個key-value都呼叫該方法,並把key與value都傳進去。

第三個引數是當前job的reduce任務數。通過job.setnumreducetasks(7)指定,這裡設為7,則表示job會在yarn集群中啟動7個reducer。

7個reducer,每個reducer都會有編號,從0~6,和陣列索引一樣。getpartition方法的返回值就是返回reducer的編號,表示當前keyu-value會被分配到哪個reducer上進行reduce處理。

比如:

//分割槽相關

job.setpartitionerclass(flowareapartitioner.class);

job.setnumreducetasks(7);

private final hashmapareamap = new hashmap<>();

@override

public int getpartition(text key, flowdto value, int reducetasknumber)

以上面**為例,key為手機號,value為該手機號所使用的流量資訊。**會根據手機號的字首判斷,把當前key-value分配到不同的reducer上。

注意:

<1>當reducer任務數為1時,即job.setnumreducetasks(1);或者沒有進行設定時,不論getpartition方法返回什麼值,都只分配到同乙個reducer上,結果都輸出到同乙個檔案。

<2>除了<1>的情況外,getpartition方法返回值必須小於reducer任務數量。也就是說,當job.setnumreducetasks(7)時,getpartition返回值的範圍只能是0~6,如果超出該範圍則拋異常。

大資料技術之Hadoop(MapReduce)

mapreduce是乙個分布式運算程式的程式設計框架,是使用者開發 基於hadoop的資料分析應用 的核心框架 mapreduce核心功能是將使用者編寫的業務邏輯 和自帶預設元件整合成乙個完整的分布式運算程式,併發執行在乙個hadoop集群上。1 海量資料在單機上處理因為硬體資源限制,無法勝任 2 ...

從分治演算法到 Hadoop MapReduce

要說 hadoop mapreduce 就不得不說分治演算法,而分治演算法其實說白了,就是四個字分而治之。其實就是將乙個複雜的問題分解成多組相同或類似的子問題,對這些子問題再分,然後再分。直到最後的子問題可以簡單得求解。要具體介紹分治演算法,那就不得不說乙個很經典的排序演算法 歸併排序。這裡不說它的...

29 九行九列02

內迴圈的迴圈變數不能是外迴圈的迴圈變數 include stdio.h void main printf n printf n n 隔開兩個三角形之用 for r 1 r 9 r 控制的是行數 printf n printf n n 隔開兩個三角形之用 for r 9 r 1 r 控制的是行數 pr...