hadoop map reduce辅助排序

yhqotfr8  于 2021-06-03  发布在  Hadoop
关注(0)|答案(5)|浏览(677)

有人能解释一下hadoop中二次排序是如何工作的吗?
为什么一定要用 GroupingComparator 它在hadoop中是如何工作的?
我正在浏览下面的链接,对groupcomapator的工作原理产生了疑问。
谁能解释一下分组比较器是如何工作的?
http://www.bigdataspeak.com/2013/02/hadoop-how-to-do-secondary-sort-on_25.html

iaqfqrcu

iaqfqrcu1#

上面提到的例子有很好的解释,让我简化一下。我们需要执行三个主要步骤。
mapout应该是(key+value,value)
当我们加入key&value。我们仍然需要一种机制来对原始键和值进行排序,所以我们需要添加一个定制的比较器。
现在数据是按原始键排序的,但如果我们将此数据发送到reducer,就不能保证将给定键的所有值发送到一个reducer,因为我们使用key+value作为键。为了确保这一点,我们将添加组比较器。

1tu0hz3e

1tu0hz3e2#

我发现借助图表很容易理解某些概念,这当然是其中之一。
假设我们的二次排序是在由姓和名组成的复合键上。

现在让我们看看二级排序机制

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

wfauudbj

wfauudbj3#

分组比较器
一旦数据到达一个reducer,所有数据就按键分组。因为我们有一个复合密钥,所以我们需要确保记录只按自然密钥分组。这是通过编写一个定制的grouppartitioner来实现的。我们有一个comparator对象,它只考虑temperaturepair类的yearmonth字段,以便将记录分组在一起。

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的内部工作方式。请参阅此链接..在hadoop map reduce中使用分组比较器有什么用

u1ehiz5o

u1ehiz5o4#

下面是一个分组示例。考虑一个复合键 (a, b) 以及它的价值 v . 我们假设在排序之后,您会得到以下一组(键、值)对:

(a1, b11) -> v1
(a1, b12) -> v2
(a1, b13) -> v3

使用默认的组比较器,框架将调用 reduce 使用相应的(键、值)对功能3次,因为所有键都不同。但是,如果您提供自己的自定义组比较器,并将其定义为仅依赖于 a ,忽略 b ,则框架得出结论,该组中的所有键都相等,并且仅使用以下键和值列表调用reduce函数一次:

(a1, b11) -> <v1, v2, v3>

注意,只使用第一个复合键,b12和b13是“丢失的”,即没有传递到减速器。
在“hadoop”一书中的著名例子中,计算了一年中的最高温度, a 是一年,而且 b 's是按降序排列的温度,因此b11是所需的最高温度,而您不关心其他温度 b 的。reduce函数只是将接收到的(a1,b11)作为当年的解决方案写入。
在“bigdataspeak.com”的示例中 b 在reducer中需要,但它们可以作为相应值(对象)的一部分使用 v .
这样,通过将值或其部分包含在键中,您可以使用hadoop不仅对键进行排序,还可以对值进行排序。
希望这有帮助。

e4eetjau

e4eetjau5#

分区器只确保一个reducer接收属于某个键的所有记录,但它不会改变reducer在分区内按键分组的事实。
在二次排序的情况下,我们形成复合键,如果我们让默认行为继续,分组逻辑将认为键是不同的。
所以我们需要控制分组。因此,我们必须向框架指出,要根据密钥的自然部分而不是复合密钥进行分组。因此,分组比较器必须用于相同的。

相关问题