千家信息网

shuffle中关键阶段sort的示例分析

发表于:2024-12-01 作者:千家信息网编辑
千家信息网最后更新 2024年12月01日,这篇文章主要介绍了shuffle中关键阶段sort的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。源码中有这样一段代码1. M
千家信息网最后更新 2024年12月01日shuffle中关键阶段sort的示例分析

这篇文章主要介绍了shuffle中关键阶段sort的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

源码中有这样一段代码

1. Map端排序获取的比较器

public RawComparator getOutputKeyComparator() {  // 获取mapreduce.job.output.key.comparator.class,必须是RawComparator类型,如果没设置,是null  Class theClass = getClass(   JobContext.KEY_COMPARATOR, null, RawComparator.class);  // 如果用户自定义了这个参数,那么实例化用户自定义的比较器  if (theClass != null)   return ReflectionUtils.newInstance(theClass, this);  // 默认情况,用户是没用自定义这个参数  // 判断Map输出的key,是否是WritableComparable的子类 //  如果是,调用当前类的内部的Comparator!  return WritableComparator.get(getMapOutputKeyClass().asSubclass(WritableComparable.class), this); }

总结: 如何对感兴趣的数据进行排序?

① 数据必须作为key

② 排序是框架自动排序,我们提供基于key的比较器,也就是Comparator,必须是RawComparator类型

a) 自定义类,实现RawComparator,重写compare()

指定mapreduce.job.output.key.comparator.class为自定义的比较器类型

b)key实现WritableComparable(推荐)

③ 实质都是调用相关的comparaTo()方法,进行比较

2. Reduce端进行分组的比较器

RawComparator comparator = job.getOutputValueGroupingComparator();// 获取mapreduce.job.output.group.comparator.class,必须是RawComparator类型// 如果没用设置,直接获取MapTask排序使用的比较器// 也是比较keypublic RawComparator getOutputValueGroupingComparator() {  Class theClass = getClass(   JobContext.GROUP_COMPARATOR_CLASS, null, RawComparator.class);  if (theClass == null) {   return getOutputKeyComparator();  }  // 如果设置了,就使用设置的比较器  return ReflectionUtils.newInstance(theClass, this); }

感谢你能够认真阅读完这篇文章,希望小编分享的"shuffle中关键阶段sort的示例分析"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

0