hadoop map减less二次sorting

任何人都可以解释我在hadoop中如何进行二级分类吗?
为什么必须使用GroupingComparator ,它在hadoop中是如何工作的?

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

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

分组比较器

一旦数据到达还原器,所有的数据按键分组。 由于我们有一个组合键,所以我们需要确保logging完全由自然键组合。 这是通过编写一个自定义GroupPartitioner来完成的。 我们有一个比较对象只考虑TemperaturePair类的yearMonth字段,用于将logging分组在一起。

 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

虽然按价值sorting数据可能不是一个普遍的需求,但在需要的时候,这是一个很好的工具。 另外,通过使用自定义分区程序和组分区程序,我们可以深入了解Hadoop的内部工作原理。 请参考这个链接.. 在hadoop map reduce中分组比较器的用途是什么?

我发现在图表的帮助下很容易理解某些概念,这当然是其中之一。

让我们假设我们的二级sorting是在一个由姓氏和名字组成的复合键上。

复合键

现在让我们看看二级sorting机制

二级分类步骤

分区程序和组比较程序只使用自然键 ,分区程序使用它将具有相同自然键的所有logging传送到单个还原程序。 这种分区发生在Map阶段中,来自各个Map任务的数据由reducer接收,并在那里被分组 ,然后发送到reduce方法 。 这个分组就是组比较器进入画面的地方,如果我们没有指定一个自定义的组比较器,那么Hadoop会使用默认的实现来考虑整个组合键,这会导致错误的结果。

MR步骤概述

在这里输入图像描述

这里是一个分组的例子。 考虑一个组合键(a, b)及其值v 。 让我们假设在sorting之后,您最终将使用以下一组(键,值)对:

 (a1, b11) -> v1 (a1, b12) -> v2 (a1, b13) -> v3 

使用默认的组比较器,框架将使用相应的(键,值)对来调用reduce函数3次,因为所有的键都是不同的。 但是,如果您提供自己的自定义组比较器,并定义它只依赖于a ,忽略b ,则框架得出结论:该组中的所有键都是相等的,并使用以下键和值列表:

 (a1, b11) -> <v1, v2, v3> 

请注意,只有第一个组合键被使用,而b12和b13是“丢失”,即没有传递给减速器。

在从“Hadoop”书中计算每年最高温度的着名示例中, a是年份, b是按降序排列的温度,因此b11是期望的最高温度,您不关心其他b的。 reduce函数只是将收到的(a1,b11)作为当年的解决scheme。

在你的“bigdataspeak.com”的例子中,所有的b都是在reducer中需要的,但是它们可以作为各个值(对象) v

通过这种方式,通过在键中包含您的值或其部分,您可以使用Hadoop来sorting不仅您的键,而且您的值。

希望这可以帮助。

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

  1. Mapout应该是(Key + Value,Value)
  2. 当我们join关键和价值。 我们仍然需要有机制来对原始键和值进行sorting。因此,我们将添加一个自定义比较器。
  3. 现在数据按原始键sorting,但是如果我们将这个数据发送给reducer,那么我们不能保证将一个给定键的所有值发送给一个reducer,因为我们使用Key + Value作为键。 为了确保它,我们将添加组比较。