今天來談一談, shuffle過程, shuffle中文翻譯是洗牌, 是在map 和reduce之間的一套可編寫程式,就像可插拔的元件一樣,我們可以編寫一些程式來替換它們,以達到我們的需求目的。以下是詳細的shuffle過程。
partition 是實現對檔案的分類輸出,如下圖,實現按年份不同將結果輸出到不同檔案中。
接下來看段**:
public static class yearpartitioner extends partitioner
}
其實我們主要需要重寫的類就是這個partitioner類, 然後實現它的getpartition函式就ok了。注意在getpartition的引數中,key 和value是從map端傳送過來的,numpartitions 是我們設定的reducer數量,也就是輸出檔案數量。 然後在這個函式中按照我們的邏輯編寫我們的分類標準, 比如我的分類標準就是判斷value中儲存的字元是以2015、2016還是其他字元為首,然後返回對於的reducer編號(可以認為返回對應的分割槽),最後注意要在main函式中完成對應的partition配置,具體如下:
job.setpartitionerclass(yearpartitioner.class); //自定義分割槽方法
job.setnumreducetasks(10); //設定reduce任務的數量,該值傳遞給partitioner.getpartition()方法的numpartitions引數
想要實現自定義的排序, 我們必須先了解到,shuffle過程中實現了對資料自動按key值公升序排列。因此要想實現按照我們需求的排序,我們必須自定義自己的key 型別,由於寫入到hdfs過程中需要序列化,key必須要用到writable型別,同時需要按照我們設想的方式排序,必須要用到comparable型別, 綜上,我們自定的key值型別需要是writablecomparable型別,以下是乙個例子:
public static class mykey implements writablecomparable
public void setdate(string date)
public int getnum()
public void setnum(int num)
public mykey()
public mykey(string date, int num)
@override
public void write(dataoutput out) throws ioexception
@override
public void readfields(datainput in) throws ioexception
@override
public int compareto(mykey o)
} public void map(object key, text value, context context )
throws ioexception, interruptedexception
}
一般我們都採用預設的分組, 也就是按key值分組, 把key值相同的資料組和起來,形成類似:
summer <1,2,5>
jerry <2,6>
rick <1,2,3,4>
morty <2>
現在我們也可以自定義自己的 group類(繼承自writablecomparator)
public static class mygroup extends writablecomparator
@suppresswarnings("rawtypes")
@override
public int compare(writablecomparable a, writablecomparable b)
}
在這個例子中, 我們的分組標準是年份是否相同(key的前4個字元是否相同),相同的歸到同一組。同樣要注意main函式中要加入group的配置
job.setgroupingcomparatorclass(mygroup.class); //設定自定義分組類
MapReduce學習筆記
mapreduce是一種程式設計模式,用於大規模資料的並行運算。map reduce 是它們的主要思想。使用者用map 對映 函式把一組鍵值對對映成另一組鍵值對,指定併發的reduce 歸納 函式,來保證所有對映的鍵值對中的每乙個共享共同的鍵組。工作原理 如上圖 右圖是 裡給出的流程圖。一切都是從最...
MapReduce學習筆記 2
同樣,hadoop預定義了一些非常有用的reducer類 預設的做法是對key進行雜湊來確定reducer,hadoop通過hashpartitioner類強制執行這個策略。但是有時我們想通過key值中的某個屬性進行排序,而不是key的整體,使用hashpartitioner就會出錯。所以我們需要自...
MapReduce學習筆記之Reduce任務(四)
reduce任務是乙個資料聚合的步驟。數量預設為1,而使用過多的reduce任務則意味著複雜的shuffle,並使輸出檔案的數量激增。mapreduce.job.reduces屬性設定reduce數量,也可以通過程式設計的方式,呼叫job物件的setnumreducetasks 方法來設定。乙個節點...