1. 程式人生 > 實用技巧 >新手指導:MapReduce中的分割槽方法Partitioner

新手指導:MapReduce中的分割槽方法Partitioner

>>> hot3.png

問題導讀:

1.Partitioner分割槽類的作用是什麼?
2.getPartition()三個引數分別是什麼?
3.numReduceTasks指的是設定的Reducer任務數量,預設值是是多少?
擴充套件:
如果不同型別的資料被分配到了同一個分割槽,輸出的資料是否還是有序的?





在進行MapReduce計算時,有時候需要把最終的輸出資料分到不同的檔案中,比如按照省份劃分的話,需要把同一省份的資料放到一個檔案中;按照性別劃分的話,需要把同一性別的資料放到一個檔案中。我們知道最終的輸出資料是來自於Reducer任務。那麼,如果要得到多個檔案,意味著有同樣數量的Reducer任務在執行。Reducer任務的資料來自於Mapper任務,也就說Mapper任務要劃分資料,對於不同的資料分配給不同的Reducer任務執行。Mapper任務劃分資料的過程就稱作Partition。負責實現劃分資料的類稱作Partitioner。
在我們前面講過的例子中,始終沒有提到分割槽,那是因為框架內建了分割槽類,稱作HashPartitioner。我們看一下原始碼,如圖6-6 26014442_icXC.jpg
圖6-6 在圖6-6中,HashPartitioner是處理Mapper任務輸出的,getPartition()方法有三個形參,key、value分別指的是Mapper任務的輸出,numReduceTasks指的是設定的Reducer任務數量,預設值是1。那麼任何整數與1相除的餘數肯定是0。也就是說getPartition(…)方法的返回值總是0。也就是Mapper任務的輸出總是送給一個Reducer任務,最終只能輸出到一個檔案中。 據此分析,如果想要最終輸出到多個檔案中,在Mapper任務中對資料應該劃分到多個區中。那麼,我們只需要按照一定的規則讓getPartition(…)方法的返回值是0,1,2,3…即可。 假設我們按照性別分割槽,那麼可以覆蓋Partitioner類的getpartition(…)方法,程式碼如圖6-7 26014442_8KH7.jpg

圖6-7 在圖6-7中,我們分別使用0、1、2與numPartitions相除。如果想把資料分到三個不同的輸出中,意味著numPartitions的值是3。這樣,0%3、1%3、2%3的值才是三個不同的。那麼,我們怎麼使用哪?只需要在驅動中進行兩個操作即可,如圖6-8 26014442_9z1E.jpg
圖6-8 在圖6-8中,我們使用了自定義的分割槽類,並且制定了numReduceTasks。這裡的numReduceTasks在內部就把值賦給了分割槽類中形式引數numPartitions。

轉載於:https://my.oschina.net/repine/blog/666157