我想知道为什么分组比较器在第二类mapreduce中使用。
根据二次分拣的最终指导示例
我们希望关键字的排序顺序是按年份(升序),然后按温度(降序):
1900 35°C
1900 34°C
1900 34°C
...
1901 36°C
1901 35°C
通过将partitioner设置为按键的年份部分进行分区,我们可以保证同一年的记录转到同一个reducer。然而,这仍然不足以实现我们的目标。一个分区器确保只有一个减速机接收一年的所有记录;它不会改变这样一个事实,即reducer在分区内按键分组。
既然我们已经编写了自己的分区器,它将负责Map到特定减速机的输出键,那么为什么我们要对它进行分组呢。
提前谢谢
4条答案
按热度按时间hfyxw5xn1#
为了支持选定的答案,我补充说:
根据这个解释
分区器:将a-1和a-2键路由到同一个减速器,尽管键不同。它还将b-3路由到一个单独的减速器。
groupcomparator:一旦复合键\值到达reducer,而不是reducer得到
由于组合后的唯一键值,将发生上述情况。
组比较器将确保减速器获得:
分组值的键将是组中最先出现的键。这可以由键比较器控制。
wdebmtf22#
你需要引入一个由年份和温度组成的中间键;对自然密钥(年份)进行分区,并引入一个比较器,对整个复合密钥进行排序。你是对的,通过对一年的划分,你将得到同一个减速机中一年的所有数据,因此比较器将根据温度对每年的数据进行有效排序。
w51jfk4q3#
让我来改进这个说法“。。。注意Map输出键到“特定减速器”。
reducer示例vs reduce方法:每个reduce任务创建一个jvm,每个jvm都有reducer类的一个示例。这是reducer示例(我现在称它为reducer)。在每个reducer中,reduce方法根据“键分组”被多次调用。每次调用reduce时,“valuein”具有按您在“分组比较器”中定义的键分组的Map输出值列表。默认情况下,分组比较器使用整个Map输出键。
在本例中,map output键更改为'year and temperature'以实现排序。除非定义一个仅使用map output键的'year'部分的分组比较器,否则不能使同一年的所有记录都转到同一reduce方法调用。
kd3sttzy4#
默认分区器计算密钥的哈希值,具有相同哈希值的密钥将被发送到相同的缩减器。如果在Map器中发出了复合(自然+增强)键,并且希望将具有相同自然键的键发送到相同的reducer,则必须实现自定义分区器。
}
现在,如果希望将数据分区中的所有相关行发送到单个reducer,那么还必须实现一个分组比较器,该比较器只考虑自然键
}