Map reduce二次排序

2021-12-30 13:04:39 字數 1033 閱讀 4842

map-reduce的流程切面:

splitmapperpartitioncombinergroupreducer

這裡要解釋下 partition 和 group (它們都是shuffle的重要步驟)的區別.

他們的作用都是為了reducer分配記錄去處理.但區別是partition是把記錄分給不同的reducer去處理(每乙個partition就對應了輸出的乙個part). 而group是指同乙個reducer處理過程中會有批次又叫迭代的概念, group就是把乙個group的記錄放到同一批次裡去處理. 預設的分配函式是hash函式.

reducer的同乙個迭代會保留內部變數, 比如可以很方便來找最大值.

mapper的結果會自動根據key來排序.

因為mapper會對key進行排序, 我們可以利用這一點把要排序的列作為key傳入系統, 利用mapper的排序, 達成我們的排序, 但是這時reducer只能有乙個. 否則兩個reducer的結果可能交錯,? 比如第乙個reducer排序了13579, 第二個reducer排序了2468, 那就還需要一次複雜的合併.

怎麼避免?

奧妙就是充分利用上述的partition, 把12345 交給reducer a, 6789交給reducer b, 這樣出來的兩個結果part, 直接合併就行了.這需要過載partition函式.

標題中的二次排序, 又是另一種情況: 要對兩列進行排序, 比如一列是年份y, 一列是當年每天的最高溫度m, 現在要對這兩列排序, 優先排序y, y相同則再排序m. 怎麼做到, 其實很容易想到的是把y和m拼起來, 合併為乙個列ym, 過載comparator函式,過載partition函式. 確保不會因為多個reducers, 打亂輸出順序. 比如一年的資料對應乙個reducer.

再比如要從每一年找出溫度最高的一天, 這就進一步要用到group了, 把同一年的資料group在同一次reducer的迭代裡, 想象一下偽**:

if(newvalue > currentbiggestvalue)

因為同一次迭代, 有乙個公用的currentbiggestvalue ,方便找出最大值.

MapReduce二次排序

預設情況下,map輸出的結果會對key進行預設的排序,但個別需求要求對key排序的同時還需要對value進行排序 這時候就要用到二次排序了。本章以hadoop權威指南中計算每年最大氣溫值為例,原始資料雜亂無章 2008 33 2008 23 2008 43 2008 24 2008 25 2008 ...

mapreduce 二次排序

所謂二次排序,對第1個字段相同的資料,使用第2個字段進行排序。舉個例子,電商平台記錄了每一使用者的每一筆訂單的訂單金額,現在要求屬於同乙個使用者的所有訂單金額作排序,並且輸出的使用者名稱也要排序。賬戶訂單金額 hadoop apache 200hive apache 550yarn apache 5...

mapreduce二次排序案例

為什麼需要二次排序?在mapreduce操作時,我們知道傳遞的會按照key的大小進行排序,最後輸出的結果是按照key排過序的。有的時候我們在key排序的基礎上,對value也進行排序。這種需求就是二次排序 解決思路 我們可以把key和value聯合起來作為新的key,記作newkey。這時,newk...