hadoop映射减少二次排序
有人能解释一下hadoop中的二次排序是如何工作的吗?hadoop映射减少二次排序,hadoop,mapreduce,hadoop-partitioning,Hadoop,Mapreduce,Hadoop Partitioning,有人能解释一下hadoop中的二次排序是如何工作的吗? 为什么必须使用GroupingComparator以及它在hadoop中是如何工作的 我正在浏览下面的链接,对groupcomapator的工作原理产生了疑问。 有人能解释一下分组比较器是如何工作的吗 分组比较器 一旦数据到达缩减器,所有数据都将按键分组。因为我们有一个复合键,所以我们需要确保记录仅按自然键分组。这是通过编写自定义GroupPartitioner来实现的。为了将记录分组在一起,我们有一个仅考虑TemperaturePair类
为什么必须使用
GroupingComparator
以及它在hadoop中是如何工作的
我正在浏览下面的链接,对groupcomapator的工作原理产生了疑问。有人能解释一下分组比较器是如何工作的吗
分组比较器 一旦数据到达缩减器,所有数据都将按键分组。因为我们有一个复合键,所以我们需要确保记录仅按自然键分组。这是通过编写自定义GroupPartitioner来实现的。为了将记录分组在一起,我们有一个仅考虑TemperaturePair类的yearMonth字段的Comparator对象
public class YearMonthGroupingComparator extends WritableComparator {
public YearMonthGroupingComparator() {
super(TemperaturePair.class, true);
}
@Override
public int compare(WritableComparable tp1, WritableComparable tp2) {
TemperaturePair temperaturePair = (TemperaturePair) tp1;
TemperaturePair temperaturePair2 = (TemperaturePair) tp2;
return temperaturePair.getYearMonth().compareTo(temperaturePair2.getYearMonth());
}
}
以下是运行辅助排序作业的结果:
new-host-2:sbin bbejeck$ hdfs dfs -cat secondary-sort/part-r-00000
190101-206
190102-333
190103-272
190104-61
190105-33
190106 44
190107 72
190108 44
190109 17
190110-33
190111-217
190112-300
虽然按值排序数据可能不是常见的需要,但在需要时,它是一个很好的工具,可以放在您的后口袋中。此外,通过使用自定义分区器和组分区器,我们能够更深入地了解Hadoop的内部工作方式。
也请参考此链接。以下是分组示例。考虑复合键<代码>(a,b)< /代码>及其值<代码> v< /代码>。让我们假设在排序之后,您最终会得到以下一组(键、值)对: 使用默认的组比较器,框架将使用相应的(键、值)对调用
reduce
函数3次,因为所有键都不同。但是,如果您提供自己的自定义组比较器,并将其定义为仅依赖于a
,而忽略b
,则框架会得出结论,该组中的所有键都是相等的,并且仅使用以下键和值列表调用reduce函数一次:
(a1, b11) -> <v1, v2, v3>
(a1,b11)->
请注意,仅使用第一个组合键,且b12和b13“丢失”,即未传递到减速器
在“Hadoop”一书中计算年最高温度的著名例子中,a
是年,b
是按降序排序的温度,因此b11是所需的最高温度,而您不关心其他b
。reduce函数只是将接收到的数据(a1、b11)作为当年的解决方案写入
在“bigdataspeak.com”中的示例中,减速器中需要所有b
,但它们可以作为相应值(对象)v
的一部分提供
这样,通过将值或其部分包含在键中,您不仅可以使用Hadoop对键进行排序,还可以对值进行排序
希望这能有所帮助。我发现借助图表很容易理解某些概念,这当然是其中之一 让我们假设我们的二级排序是在一个由姓和名组成的复合键上 在不使用复合键的情况下,现在让我们看看辅助排序机制 分区器和组比较器仅使用自然键,分区器使用它将具有相同自然键的所有记录传送到单个缩减器。这种划分发生在映射阶段,来自不同映射任务的数据由reducer接收,在那里它们被分组,然后发送到reduce方法。这个分组就是组比较器出现的地方,如果我们不指定自定义组比较器,那么Hadoop将使用默认实现,该实现将考虑整个组合键,这将导致不正确的结果 MR步骤概述
上面提到的例子有很好的解释,让我简化一下。我们需要执行三个主要步骤
分区程序只确保一个reducer接收属于某个键的所有记录,但它不会改变reducer在分区内按键分组的事实
在二次排序的情况下,我们形成复合键,如果让默认行为继续,分组逻辑将考虑不同的键。
所以我们需要控制分组。因此,我们必须向框架指示根据密钥的自然部分而不是组合密钥进行分组。因此,分组比较器必须用于相同的目的。二次排序在内部如何工作?从映射器到减速机的实际流程是什么?要了解…请参阅此链接mapper->partitioner->sort based secondary value->group based natural key->reducer…我是正确的吗?非常好的图表,谢谢。有没有可能在不实现自己的groupingComparator的情况下使用这种方法?解释得很好。你有没有从书上借过这个?如果是的话,你能给我指一下那本书吗?谢谢,谢谢。是的,这是我的。第二版似乎有了相当大的变化。当调用reduce()时,键的第二部分包含了什么?我可以相信这是values arg中第一个值的辅助键吗?您的链接已断开。
(a1, b11) -> <v1, v2, v3>