一、什麼時候分割槽?
(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...