hadoop map减少二次排序

时间:2013-08-23 06:14:56

标签: hadoop mapreduce bigdata hadoop-partitioning

任何人都可以解释一下二次排序在hadoop中是如何工作的吗? 为什么必须使用GroupingComparator以及它如何在hadoop中起作用?

我正在浏览下面给出的链接,并怀疑groupcomapator的工作原理 任何人都能解释一下分组比较器是如何工作的吗?

http://www.bigdataspeak.com/2013/02/hadoop-how-to-do-secondary-sort-on_25.html

5 个答案:

答案 0 :(得分:45)

我发现借助图表很容易理解某些概念,这肯定是其中之一。

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

Composite Key

使用复合键,现在让我们看看二级排序机制

Secondary Sorting Steps

分区器和组比较器仅使用自然键,分区器使用它将具有相同自然键的所有记录引导到单个reducer。 此分区在Map Map中发生,来自各种Map任务的数据由Reducer接收,它们分组,然后发送到reduce方法。这个分组是组比较器出现的情况,如果我们指定了自定义组比较器,那么Hadoop将使用默认实现,该实现将考虑整个组合密钥,这将导致结果不正确。

MR步骤概述

enter image description here

答案 1 :(得分:16)

分组比较器

数据到达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的内部工作原理。 请参阅此链接.. What is the use of grouping comparator in hadoop map reduce

答案 2 :(得分:16)

以下是分组的示例。考虑复合键(a, b)及其值v。我们假设在排序之后,您最终会使用以下一组(键,值)对:

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

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

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

请注意,仅使用第一个复合键,并且b12和b13“丢失”,即不传递给reducer。

在“Hadoop”一书中以年份计算最高温度的众所周知的例子中,a是年份,而b是温度按降序排序,因此b11是所需的最高温度,你不关心其他b。 reduce函数只是将收到的(a1,b11)写为当年的解决方案。

在“bigdataspeak.com”的示例中,reducer中需要所有b,但它们可作为相应值(对象)v的一部分使用。

通过这种方式,通过将您的价值或其中的一部分包含在密钥中,您可以使用Hadoop不仅对您的密钥进行排序,还可以对您的值进行排序。

希望这有帮助。

答案 3 :(得分:1)

分区程序只是确保一个reducer接收属于某个键的所有记录,但它不会改变reducer在分区中按键分组的事实。

在二级排序的情况下,我们形成复合键,如果我们让默认行为继续,分组逻辑将认为键是不同的。

所以我们需要控制分组。因此,我们必须向框架指出基于密钥的自然部分而不是复合密钥进行分组。因此,必须使用分组比较器。

答案 4 :(得分:0)

上面提到的例子有很好的解释,让我简化它。我们需要执行三个主要步骤。

  1. Mapout应为(Key + Value,Value)
  2. 当我们加入Key&amp; Value时。我们还需要有机制来对原始Key和值进行排序。所以我们会添加一个自定义比较器。
  3. 现在数据按原始密钥排序,但如果我们将此数据发送到reducer,它将无法保证将给定密钥的所有值发送到一个reducer,因为我们使用Key + Value作为密钥。为了确保我们会添加组比较器。