Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
hadoop映射减少二次排序_Hadoop_Mapreduce_Hadoop Partitioning - Fatal编程技术网

hadoop映射减少二次排序

hadoop映射减少二次排序,hadoop,mapreduce,hadoop-partitioning,Hadoop,Mapreduce,Hadoop Partitioning,有人能解释一下hadoop中的二次排序是如何工作的吗? 为什么必须使用GroupingComparator以及它在hadoop中是如何工作的 我正在浏览下面的链接,对groupcomapator的工作原理产生了疑问。 有人能解释一下分组比较器是如何工作的吗 分组比较器 一旦数据到达缩减器,所有数据都将按键分组。因为我们有一个复合键,所以我们需要确保记录仅按自然键分组。这是通过编写自定义GroupPartitioner来实现的。为了将记录分组在一起,我们有一个仅考虑TemperaturePair类

有人能解释一下hadoop中的二次排序是如何工作的吗?
为什么必须使用
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步骤概述


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

  • 映射输出应为(键+值,值)
  • 当我们加入Key&Value时。我们仍然需要一种机制来根据原始键和值进行排序,所以我们需要添加一个定制的比较器
  • 现在数据是按原始键排序的,但如果我们将此数据发送到reducer,就不能保证将给定键的所有值发送到一个reducer,因为我们使用Key+value作为键。为了确保这一点,我们将添加组比较器

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

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


    所以我们需要控制分组。因此,我们必须向框架指示根据密钥的自然部分而不是组合密钥进行分组。因此,分组比较器必须用于相同的目的。

    二次排序在内部如何工作?从映射器到减速机的实际流程是什么?要了解…请参阅此链接mapper->partitioner->sort based secondary value->group based natural key->reducer…我是正确的吗?非常好的图表,谢谢。有没有可能在不实现自己的groupingComparator的情况下使用这种方法?解释得很好。你有没有从书上借过这个?如果是的话,你能给我指一下那本书吗?谢谢,谢谢。是的,这是我的。第二版似乎有了相当大的变化。当调用reduce()时,键的第二部分包含了什么?我可以相信这是values arg中第一个值的辅助键吗?您的链接已断开。
    (a1, b11) -> <v1, v2, v3>