Hadoop入门(八)Mapreduce高级shuffle之Partitioner
一、Partitioner概述
Map階段總共五個步驟,2就是一個分區(qū)操作
?
哪個key到哪個Reducer的分配過程,是由Partitioner規(guī)定的。
?
二、Hadoop內(nèi)置Partitioner
MapReduce的使用者通常會指定Reduce任務(wù)和Reduce任務(wù)輸出文件的數(shù)量(R)。
用戶在中間key上使用分區(qū)函數(shù)來對數(shù)據(jù)進行分區(qū),之后在輸入到后續(xù)任務(wù)執(zhí)行進程。一個默認的分區(qū)函數(shù)式使用hash方法(比如常見的:hash(key) mod R)進行分區(qū)。hash方法能夠產(chǎn)生非常平衡的分區(qū)。
Hadoop中自帶了一個默認的分區(qū)類HashPartitioner,
它繼承了Partitioner類,提供了一個getPartition的方法
將key均勻布在Reduce Tasks上
(key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;?
如果Key為Text的話,Text的hashcode方法跟String的基本一致,都是采用的Horner公式計算,得到一個int整數(shù)。但是,如果string太大的話這個int整數(shù)值可能會溢出變成負數(shù),所以和整數(shù)的上限值Integer.MAX_VALUE(即0111111111111111)進行與運算,然后再對reduce任務(wù)個數(shù)取余,這樣就可以讓key均勻分布在reduce上?
?
三、自定制Partitioner
一般我們都會使用默認的分區(qū)函數(shù)HashPartitioner
自定義數(shù)據(jù)類型處理手機上網(wǎng)日志: 在第二列上并不是所有的數(shù)據(jù)都是手機號(84138413并不是一個手機號),任務(wù)就是在統(tǒng)計手機流量時,將手機號碼和非手機號輸出到不同的文件中
自定義MKPartitioner
?public static class MKPartitioner extends Partitioner<Text, KpiWritable> {@Overridepublic int getPartition(Text key, KpiWritable value, int numPartitions) {// 實現(xiàn)不同的長度不同的號碼分配到不同的reduce task中int numLength = key.toString().length();if (numLength == 11) return 0;else ? return 1;?}}設(shè)置為打包運行,設(shè)置Partitioner為MKPartitioner設(shè)置ReducerTask的個數(shù)為2
注意:分區(qū)的例子必須要設(shè)置為打成jar包運行!
打成jar包并在Hadoop中運行
通過Web接口驗證Partitioner的運行:
- 通過訪問http://hadoop01:50030 查看 是否有2個Reduce任務(wù)?
- Reduce輸出結(jié)果是否一致?
小結(jié):
- 分區(qū)Partitioner主要作用在于以下兩點 ?根據(jù)業(yè)務(wù)需要,產(chǎn)生多個輸出文件
- 多個reduce任務(wù)并發(fā)運行,提高整體job的運行效率
總結(jié)
以上是生活随笔為你收集整理的Hadoop入门(八)Mapreduce高级shuffle之Partitioner的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hadoop入门(九)Mapreduce
- 下一篇: Hadoop入门(七)Mapreduce