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不仅您的键,而且您的值。
希望这可以帮助。
上面提到的例子有很好的解释,让我简化它,我们需要执行三个主要步骤。
- Mapout应该是(Key + Value,Value)
- 当我们join关键和价值。 我们仍然需要有机制来对原始键和值进行sorting。因此,我们将添加一个自定义比较器。
- 现在数据按原始键sorting,但是如果我们将这个数据发送给reducer,那么我们不能保证将一个给定键的所有值发送给一个reducer,因为我们使用Key + Value作为键。 为了确保它,我们将添加组比较。