设为首页 收藏本站
查看: 518|回复: 0

[经验分享] Partitioner, SortComparator and GroupingComparator in Hadoop

[复制链接]

尚未签到

发表于 2016-12-10 09:18:19 | 显示全部楼层 |阅读模式
  hadoop 0.20.2 api里面,作业被重新定义到了类 org.apache.hadoop.mapreduce.Job。
  它有3个特别的方法:
job.setPartitionerClass(Partitioner p);
job.setSortComparatorClass(RawComparator c);

job.setGroupingComparatorClass(RawComparator c);
 
  数据在被map处理过之后,会根据 Partitioner 定义的规则,把中间结果分发到特定的reduce。
  Partitioner<Key, Value> 包含一个方法:public int getPartition(Key k, Value v, int parts)

public static class P extends Partitioner<IdWithTimestamp, Value> {
@Override
public int getPartition(IdWithTimestamp  k, Value v, int parts) {
int hash = k.getId().hashCode();
return (hash & Integer.MAX_VALUE) % parts;
}
}
  接下来,可以做一些控制,使得不同 Key的中间数据,可以打包成一组,在一次reduce()调用中处理,setGroupingComparatorClass提供分组规则。
  补充:默认实现是以整个key作为分组标识的。但是,一个比较典型的情况是,如果你在key中加入了额外的字段,用于排序,就需要手工调整group了。顺序很重要!
  例如,key可能是[id, timestamp],这样可以使相同的id(String)能按时间戳(long)排序,现在拆出包含在key里的相同id,分到相同的组。

public class IdComparator extends TextComparator {
@Override
public int compare(IdWithTimestamp o1, IdWithTimestamp o2) {
return o1.getId().compareTo(o2.getId());
}
}
  然后,中间数据在被reduce处理之前,会先被集中排序,setSortComparatorClass提供排序规则。

public class TimestampComparator extends TextComparator {
@Override
public int compare(IdWithTimestamp o1, IdWithTimestamp o2) {
return o1.getTimestamp() - o2.getTimestamp();
}
}
  如果不提供这些东西,默认使用的是 Key类型的 compareTo方法,而不是 hashCode和 equals。
  可以自定义 WritableComparable类型,提供优化比较方法,以提高执行效率。。。字节比较,那是个挺麻烦的事情,我都是很偷懒地一直用Text,拼接、拆分字符串做比较。
  Partitioner,SortComparator 和 GroupingComparator 配合即可实现某些对顺序有要求的计算。如果数据集很大的话(reduce输入超过HDFS块儿大小),为保证之前任务的顺序输出,就需要在再次m/r处理的时候控制map对输入的分割

public class NoSplitInputFormat extends TextInputFormat {
@Override
protected boolean isSplitable(JobContext context, Path file) {
return false;
}
}
  排序 + 计算 两个任务,不等于一个完整任务里的 按顺序计算。
  实践证明,使用外部的RawComparator 更具灵活性,可以提供不同的排序和分组策略。
  附例子程序,测试数据,测试结果
  Join的时候也用得着它们
  enjoy it!

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-312176-1-1.html 上篇帖子: hadoop+zookeeper+hbase完全分布式集群配置整理 下篇帖子: hadoop 0.21.0集群搭建
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表