Mapreduce學習筆記(二)

2021-09-08 20:09:40 字數 2299 閱讀 3110

今天來談一談, 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 方法來設定。乙個節點...