hadoop map减少二次排序

use*_*111 21 hadoop mapreduce bigdata hadoop-partitioning

谁能解释我在hadoop中如何进行二次排序?
为什么必须使用GroupingComparator它以及它在hadoop中如何工作?

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

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

Sud*_*han 46

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

让我们假设我们的辅助排序是做出来的姓氏和名字的组合键.

复合键

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

二级排序步骤

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

MR步骤概述

在此输入图像描述


Dee*_*C P 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());
    }
}
Run Code Online (Sandbox Code Playgroud)

以下是运行二级排序作业的结果:

new-host-2:sbin bbejeck$ hdfs dfs -cat secondary-sort/part-r-00000
Run Code Online (Sandbox Code Playgroud)

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中使用分组比较器有什么用

  • mapper-> partitioner->基于二次值排序 - >基于自然键的组 - > reducer ...我是正确的 (3认同)

小智 16

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

(a1, b11) -> v1
(a1, b12) -> v2
(a1, b13) -> v3
Run Code Online (Sandbox Code Playgroud)

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

(a1, b11) -> <v1, v2, v3> 
Run Code Online (Sandbox Code Playgroud)

请注意,仅使用第一个复合键,并且b12和b13"丢失",即未传递给reducer.

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

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

通过这种方式,通过在键中包含您的值或其部分,您可以使用Hadoop不仅对键进行排序,还可以对您的值进行排序.

希望这可以帮助.