Sorting 在MapReduce中使用分区器进行二次排序有什么意义?

Sorting 在MapReduce中使用分区器进行二次排序有什么意义?,sorting,hadoop,mapreduce,Sorting,Hadoop,Mapreduce,如果在传递到reduce阶段时需要对给定键的值进行排序,例如移动平均值,或者要模仿SQL中的滞后/超前分析函数,则需要在MapReduce中实现二次排序 在谷歌上搜索后,普遍的建议是: A) 在映射阶段发出包含的复合关键点 B) 创建一个“composite key comparator”类,用于二次排序,在比较键之后比较要排序的值,以便对传递给reducer的Iterable进行排序。 C) 创建一个“natural key grouping comparator”类,该类用于主排序,只比较要

如果在传递到reduce阶段时需要对给定键的值进行排序,例如移动平均值,或者要模仿SQL中的滞后/超前分析函数,则需要在MapReduce中实现二次排序

在谷歌上搜索后,普遍的建议是:

A) 在映射阶段发出包含的复合关键点 B) 创建一个“composite key comparator”类,用于二次排序,在比较键之后比较要排序的值,以便对传递给reducer的Iterable进行排序。 C) 创建一个“natural key grouping comparator”类,该类用于主排序,只比较要排序的键,以便传递给reducer的Iterable包含属于给定键的所有值。 D) 创建一个“natural key partitioner类”,我不知道它的目的,这也是我的问题的目的

发件人:

自然密钥分区器使用自然密钥将数据分区到减速器。再次注意,这里,我们只考虑“自然”键。 自然键指的当然是实际键,而不是复合键+值

发件人:

默认分区将计算整个密钥上的哈希值,从而产生不同的哈希值,并将记录发送到不同的还原器。为了确保两个记录都发送到同一个reducer,让我们实现一个客户分区器

发件人:

在一个真正的Hadoop集群中,在不同的节点上运行着许多简化程序。如果相同区域和日期的数据在地图减少洗牌后没有落在相同的减少器中,我们就有麻烦了。确保这一点的方法是负责定义我们自己的分区逻辑

我介绍的每个源代码,加上我看到的所有其他源代码,都建议根据以下伪代码编写partioner类:

naturalKey = compositeKey.getNaturalKey()
return naturalKey.hashCode() % NUMBER_OF_REDUCERS
现在,我的印象是Hadoop保证对于给定的键,与该键对应的所有值都将指向同一个减缩器

我们创建自定义分区器的原因是否与我们为其创建“自然键分组比较器”类的原因相同,以防止MapReduce发送复合键而不是reducer键



这个问题几乎和答案一样好:),你上面提到的一切都是正确的,我想用不同的方式解释这个概念应该会有所帮助

所以让我来试一试

让我们假设我们的二级排序是在一个由姓和名组成的复合键上

在不使用复合键的情况下,现在让我们看看辅助排序机制

分区器和组比较器仅使用自然键,分区器使用它将具有相同自然键的所有记录传送到单个缩减器。这种划分发生在映射阶段,来自不同映射任务的数据由reducer接收,在那里它们被分组,然后发送到reduce方法。这个分组就是组比较器出现的地方,如果我们不指定自定义组比较器,那么Hadoop将使用默认实现,该实现将考虑整个组合键,这将导致不正确的结果


嘿,苏达珊,谢谢你的图表。这是哪本书?