有人能解释一下hadoop中二次排序是如何工作的吗?
为什么一定要用 GroupingComparator
它在hadoop中是如何工作的?
我正在浏览下面的链接,对groupcomapator的工作原理产生了疑问。
谁能解释一下分组比较器是如何工作的?
http://www.bigdataspeak.com/2013/02/hadoop-how-to-do-secondary-sort-on_25.html
有人能解释一下hadoop中二次排序是如何工作的吗?
为什么一定要用 GroupingComparator
它在hadoop中是如何工作的?
我正在浏览下面的链接,对groupcomapator的工作原理产生了疑问。
谁能解释一下分组比较器是如何工作的?
http://www.bigdataspeak.com/2013/02/hadoop-how-to-do-secondary-sort-on_25.html
5条答案
按热度按时间iaqfqrcu1#
上面提到的例子有很好的解释,让我简化一下。我们需要执行三个主要步骤。
mapout应该是(key+value,value)
当我们加入key&value。我们仍然需要一种机制来对原始键和值进行排序,所以我们需要添加一个定制的比较器。
现在数据是按原始键排序的,但如果我们将此数据发送到reducer,就不能保证将给定键的所有值发送到一个reducer,因为我们使用key+value作为键。为了确保这一点,我们将添加组比较器。
1tu0hz3e2#
我发现借助图表很容易理解某些概念,这当然是其中之一。
假设我们的二次排序是在由姓和名组成的复合键上。
现在让我们看看二级排序机制
分区器和组比较器仅使用自然密钥,分区器使用它将具有相同自然密钥的所有记录传送到单个缩减器。这种划分发生在map阶段,来自不同map任务的数据由reducer接收,在那里它们被分组,然后被发送到reduce方法。这个分组就是组比较器出现的地方,如果我们没有指定一个自定义的组比较器,那么hadoop将使用默认的实现,该实现将考虑整个复合键,这将导致不正确的结果。
mr步骤概述
wfauudbj3#
分组比较器
一旦数据到达一个reducer,所有数据就按键分组。因为我们有一个复合密钥,所以我们需要确保记录只按自然密钥分组。这是通过编写一个定制的grouppartitioner来实现的。我们有一个comparator对象,它只考虑temperaturepair类的yearmonth字段,以便将记录分组在一起。
下面是运行二次排序作业的结果:
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中使用分组比较器有什么用
u1ehiz5o4#
下面是一个分组示例。考虑一个复合键
(a, b)
以及它的价值v
. 我们假设在排序之后,您会得到以下一组(键、值)对:使用默认的组比较器,框架将调用
reduce
使用相应的(键、值)对功能3次,因为所有键都不同。但是,如果您提供自己的自定义组比较器,并将其定义为仅依赖于a
,忽略b
,则框架得出结论,该组中的所有键都相等,并且仅使用以下键和值列表调用reduce函数一次:注意,只使用第一个复合键,b12和b13是“丢失的”,即没有传递到减速器。
在“hadoop”一书中的著名例子中,计算了一年中的最高温度,
a
是一年,而且b
's是按降序排列的温度,因此b11是所需的最高温度,而您不关心其他温度b
的。reduce函数只是将接收到的(a1,b11)作为当年的解决方案写入。在“bigdataspeak.com”的示例中
b
在reducer中需要,但它们可以作为相应值(对象)的一部分使用v
.这样,通过将值或其部分包含在键中,您可以使用hadoop不仅对键进行排序,还可以对值进行排序。
希望这有帮助。
e4eetjau5#
分区器只确保一个reducer接收属于某个键的所有记录,但它不会改变reducer在分区内按键分组的事实。
在二次排序的情况下,我们形成复合键,如果我们让默认行为继续,分组逻辑将认为键是不同的。
所以我们需要控制分组。因此,我们必须向框架指出,要根据密钥的自然部分而不是复合密钥进行分组。因此,分组比较器必须用于相同的。