hadoopmapreduce中分组比较器的用途是什么

9bfwbjaz  于 2021-06-04  发布在  Hadoop
关注(0)|答案(4)|浏览(351)

我想知道为什么分组比较器在第二类mapreduce中使用。
根据二次分拣的最终指导示例
我们希望关键字的排序顺序是按年份(升序),然后按温度(降序):

1900 35°C
1900 34°C
1900 34°C
...
1901 36°C
1901 35°C

通过将partitioner设置为按键的年份部分进行分区,我们可以保证同一年的记录转到同一个reducer。然而,这仍然不足以实现我们的目标。一个分区器确保只有一个减速机接收一年的所有记录;它不会改变这样一个事实,即reducer在分区内按键分组。
既然我们已经编写了自己的分区器,它将负责Map到特定减速机的输出键,那么为什么我们要对它进行分组呢。
提前谢谢

hfyxw5xn

hfyxw5xn1#

为了支持选定的答案,我补充说:
根据这个解释


**Input**:

    symbol time price
    a      1    10
    a      2    20
    b      3    30

**Map output**: create composite key\values like so:

> symbol-time time-price
>
>**a-1**         1-10
>
>**a-2**         2-20
>
>**b-3**         3-30

分区器:将a-1和a-2键路由到同一个减速器,尽管键不同。它还将b-3路由到一个单独的减速器。
groupcomparator:一旦复合键\值到达reducer,而不是reducer得到

>(**a-1**,{1-10})
>
>(**a-2**,{2-20})

由于组合后的唯一键值,将发生上述情况。
组比较器将确保减速器获得:

(a-1,{**1-10,2-20**})

分组值的键将是组中最先出现的键。这可以由键比较器控制。


**[[In a single reduce method call.]]**
wdebmtf2

wdebmtf22#

你需要引入一个由年份和温度组成的中间键;对自然密钥(年份)进行分区,并引入一个比较器,对整个复合密钥进行排序。你是对的,通过对一年的划分,你将得到同一个减速机中一年的所有数据,因此比较器将根据温度对每年的数据进行有效排序。

w51jfk4q

w51jfk4q3#

让我来改进这个说法“。。。注意Map输出键到“特定减速器”。
reducer示例vs reduce方法:每个reduce任务创建一个jvm,每个jvm都有reducer类的一个示例。这是reducer示例(我现在称它为reducer)。在每个reducer中,reduce方法根据“键分组”被多次调用。每次调用reduce时,“valuein”具有按您在“分组比较器”中定义的键分组的Map输出值列表。默认情况下,分组比较器使用整个Map输出键。
在本例中,map output键更改为'year and temperature'以实现排序。除非定义一个仅使用map output键的'year'部分的分组比较器,否则不能使同一年的所有记录都转到同一reduce方法调用。

kd3sttzy

kd3sttzy4#

默认分区器计算密钥的哈希值,具有相同哈希值的密钥将被发送到相同的缩减器。如果在Map器中发出了复合(自然+增强)键,并且希望将具有相同自然键的键发送到相同的reducer,则必须实现自定义分区器。

public class SimplePartitioner implements Partitioner {
@Override
public int getPartition(Text compositeKey, LongWritable value, int numReduceTasks) {
    //Split the key into natural and augment
    String naturalKey = compositeKey.toString().split("separator")

    return naturalKey.hashCode();
}

}
现在,如果希望将数据分区中的所有相关行发送到单个reducer,那么还必须实现一个分组比较器,该比较器只考虑自然键

public class SimpleGroupingComparator extends WritableComparator {

@Override
public int compare(Text compositeKey1, Text compositeKey2) {

return compare(compositeKey1.getNaturalKey(),compositeKey2.getNaturalKey());
}

}

相关问题