简单理解MapReudce的分区和分组
来源:互联网 发布:淘宝评论 复制这段文字 编辑:程序博客网 时间:2024/04/28 15:40
分区
简单的说,一组KV交给一组Reduce进行处理,分区就是制订其交付的对应规则。如下代码:
public class DoPartitioner extends HashPartitioner<MyKeyWritable, MyValueWritable>{ @Override public int getPartition(final MyKeyWritable key, final MyValueWritable value, final int numberPartions) { return (key.getFirst().hashCode() & Integer.MAX_VALUE) % numberPartions; }}这是Hash分区最常见的形式了,这里不再累赘。
使用上述分区方法时,发现有时候离散度不够,即有些reduce中总是分不到KV。修改为如下代码:
return (key.getFirst().hashCode() & Integer.MAX_VALUE * 127) % numberPartions;离散度明显提高了,但是发现修改127为121后,离散度更高。其中缘由暂没有时间研究,暂时作为经验值记录下来吧。
分组
简单地说,分组是指定一组KV只调用一次reduce方法。社区自带的二次排序例子(SecondarySort)中,使用了分组,如下代码:
public static class FirstGroupingComparator implements RawComparator<IntPair> {@Overridepublic int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2) {return WritableComparator.compareBytes(b1, s1, Integer.SIZE/8, b2, s2, Integer.SIZE/8);}@Overridepublic int compare(IntPair o1, IntPair o2) {int l = o1.getFirst();int r = o2.getFirst();return l == r ? 0 : (l < r ? -1 : 1);}}示例中key是自定义的IntPair对象,包括了两个成员变量(first和second),但是分组时都只参照第一个成员变量first。
此处注意一个细节问题,假设在reduce方法中有如下代码:
for(IntWritable value: values) {context.write(key, value);}假设输入数据为(1,2),(1,3),(1,4)。因为具有相同first,所以对这三组KV,reduce方法只被调用一次。但是for循环中,三次的key分别是(1,2),(1,3),(1,4),而不都是(1,2)。
如果不确定一组key是否对应一个分组,可以在分组实现代码中打上调试日志,然后在reduce日志中,应该能看到多个key调用一次reduce方法了......
0 0
- 简单理解MapReudce的分区和分组
- 6.mr中理解分区和分组
- MapReduce的自定义排序、分区和分组
- 分组分区和索引分区
- 表视图的分组分区和索引分区
- 表视图的分组分区和索引分区
- hadoop的分区、分组与排序的理解
- 谈Map/Reduce对分区与分组的理解
- Map/Reduce中分区和分组的问题
- lag和lead分组函数的理解
- Hadoop框架排序和分组的理解
- Hadoop框架排序和分组的理解
- MapReduce的分区 与 分组
- Java8 Stream的分组,分区
- Linux 挂载 和 分区 的理解
- 表空间和表分区的理解
- 十一、理解MapReduce的二次排序功能,包括自定义数据类型、分区、分组、排序
- 分组交换 的理解
- Android界面整体缩放
- 解题报告 之 POJ3463 ACM Computer Factory
- centos6.5下执行python文件,提示: 没有那个文件或目录
- Spring整合JMS(一)——基于ActiveMQ实现
- C#界面之TextBox多种用法合集
- 简单理解MapReudce的分区和分组
- 开发工具总结
- ARC和MRC 兼容的单例模式
- [WinForm] VS2010发布、打包安装程序(超全超详细)
- jQuery弹窗
- OC基础—数组和字典的遍历方法总结
- su与sudo命令
- myeclipse6.5中使用Alt+/不自动提示的修改
- 顺序结构与链式结构