在hadoop map reduce中使用分组比较器有什么用

Pra*_*mod 23 hadoop mapreduce hadoop-partitioning

我想知道为什么分组比较器用于二级mapreduce.

根据二级分类的权威指南示例

我们希望键的排序顺序是年份(升序),然后是温度(降序):

1900 35°C
1900 34°C
1900 34°C
...
1901 36°C
1901 35°C
Run Code Online (Sandbox Code Playgroud)

通过将分区器设置为按键的年份部分进行分区,我们可以保证同一年的记录转到同一个reducer.然而,这仍然不足以实现我们的目标.分区程序仅确保一个reducer接收一年的所有记录; 它不会改变reducer在分区内按键分组的事实.

既然我们已经编写了自己的分区器来处理特定reducer的map输出键,那么我们为什么要对它进行分组呢.

提前致谢

jak*_*ack 35

为了支持我选择的答案,我补充说:

继续这个解释

**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
Run Code Online (Sandbox Code Playgroud)

分区程序:将a-1和a-2键路由到同一个减速器,尽管键不同.它还将b-3路由到一个单独的减速器.

GroupComparator:一旦复合键\ value到达reducer而不是reducer得到

>(**a-1**,{1-10})
>
>(**a-2**,{2-20})
Run Code Online (Sandbox Code Playgroud)

由于组成后的唯一键值,将发生上述情况.

组比较器将确保减速器得到:

(a-1,{**1-10,2-20**})
Run Code Online (Sandbox Code Playgroud)

分组值的关键字将是组中第一个出现的值.这可以通过Key比较器控制.

**[[In a single reduce method call.]]**
Run Code Online (Sandbox Code Playgroud)


Esw*_*apa 24

让我改进声明"......照顾到特定减速器的地图输出键".

Reducer Instance vs reduce方法:每个Reduce任务创建一个JVM,每个都有一个Reducer类的实例.这是Reducer实例(我从现在起称它为Reducer).在每个Reducer中,reduce方法被调用多次,具体取决于在'key grouping'上.每次调用时间减少,'valuein'有一个地图输出值列表,按照你在'分组比较器'中定义的键分组.默认情况下,分组比较器使用整个地图输出键.

在示例中,地图输出键被更改为"年份和温度"以实现排序.除非您定义仅使用地图输出键的"年"部分的分组比较器,否则您无法制作同一年的所有记录转到相同的reduce方法调用.