MapReduce中的分區方法Partitioner


在進行MapReduce計算時,有時候需要把最終的輸出數據分到不同的文件中,比如按照省份划分的話,需要把同一省份的數據放到一個文件中;按照性別划分的話,需要把同一性別的數據放到一個文件中。我們知道最終的輸出數據是來自於Reducer任務。那么,如果要得到多個文件,意味着有同樣數量的Reducer任務在運行。Reducer任務的數據來自於Mapper任務,也就說Mapper任務要划分數據,對於不同的數據分配給不同的Reducer任務運行。Mapper任務划分數據的過程就稱作Partition。負責實現划分數據的類稱作Partitioner

在我們前面講過的例子中,始終沒有提到分區,那是因為框架內置了分區類,稱作HashPartitioner。我們看一下源碼,如圖6-6
<ignore_js_op> 1.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
<ignore_js_op> clip_image004_thumb2.jpg 
圖6-7
在圖6-7中,我們分別使用0、1、2與numPartitions相除。如果想把數據分到三個不同的輸出中,意味着numPartitions的值是3。這樣,0%3、1%3、2%3的值才是三個不同的。那么,我們怎么使用哪?只需要在驅動中進行兩個操作即可,如圖6-8
<ignore_js_op> 3.jpg 
圖6-8
在圖6-8中,我們使用了自定義的分區類,並且制定了numReduceTasks。這里的numReduceTasks在內部就把值賦給了分區類中形式參數numPartitions。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM