Hadoop学习笔记 Partitioner与自定义Partitioner

一、初识Partitioner

        在认识Partitioner之前我们先来回顾一下MapReduce流程中,Map阶段的五个步骤。如下图所示:


map流程图

        我们可以通过上图看到step1.3就是一个Partition操作。其主要作用是计算应该将哪些Key放到同一个Reduce中去。其次从图上我们可以得知Partition的操作是基于map的输出结果的,而且分区操作的对象是key。

        接下来让我们一起看看官方文档对这个Partition的解读吧。


Apache官方文档

        该文档主要描述了:Partition的主类名为Class Partitioner<KEY,VALUE>其直属子类有BinaryPartitionerHashPartitionerKeyFieldBasedPartitionerTotalOrderPartitioner这几个类。

        并且说明了Partitioner直接采用了map的输出,其中分区的典型方式是使用hash函数进行分区将key相同的数据分为一组。上述的其子类 HashPartitioner就实现了这个功能。

/** Partition keys by their {@link Object#hashCode()}. */

public class HashPartitioner<K, V> extends Partitioner<K, V> {

/** Use {@link Object#hashCode()} to partition. */

public int getPartition(K key, V value, int numReduceTasks){

return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;

}

}//其中key和value为map输出,numReduceTasks是reduce的数量。

        我们可以看到上面的代码中最关键的一行为:key.hashCode() & Integer.MAX_VALUE) % numReduceTasks。那么为什么要用hashcode与上最大整形呢?这是因为如果Key为Text的话,Text的hashcode方法跟String的基本一致,都是采用的Horner公式计算,得到一个int整数。但是,如果string太大的话这个int整数值可能会溢出变成负数,所以和整数的上限值Integer.MAX_VALUE(即0111111111111111)进行与运算,然后再对reduce任务个数取余,这样就可以让key均匀分布在reduce上。 

二、自定义Partitioner

现在我们有一下天气数据,我们需要按要求将每年的最高气温找出来。

1949-10-01 14:21:02 34C

1949-10-02 14:21:12 36C

1950-02-02 11:21:12 32C

1950-05-02 11:31:12 37C

1951-12-02 11:31:12 23C

1950-12-02 11:31:12 47C

1950-12-02 11:31:12 27C

1951-06-02 11:31:12 48C

1951-07-02 11:31:12 45C

如果需要将每年的最高气温找出,那我们就必然需要将气温数据按年分组。

public class wdPartitioner extends Partitioner<Text, Text>{

@Override public int getPartition(Text key, Text value, int numReduceTasks) {

 String str = key.toString().split("-")[0];

int num = Integer.parseInt(str);

if(num == 1949){ return 1%numReduceTasks; }

else if(num == 1950) { return 2%numReduceTasks; }

else if(num == 1951){ return 3%numReduceTasks; }

return 1%numReduceTasks; }

}

可以看到这里由于年份只有这三年所以就按照年份来进行判断了,如果年份较多需要分成很多组那么就可以写成return (num.hashCode() & Integer.MAX_VALUE) % numReduceTasks;在处理不同的数据的时候我们可以继承不同的子类以方便我们运算。其子类用法请参考


Hadoop Partition用法

总结:分区Partitioner主要作用在于以下两点

(1)根据业务需要,产生多个输出文件;

(2)多个reduce任务并发运行,提高整体job的运行效率;

(3)好的Partition可以有效的避免数据倾斜;

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容