gpt4 book ai didi

Hadoop 二次排序(setPartitioner 与 setOutputValueGroupingComparator)

转载 作者:可可西里 更新时间:2023-11-01 15:19:00 26 4
gpt4 key购买 nike

我正在尝试理解 setOutputValueGroupingComparator 方法对于二次排序的必要性 - setPartitioner 是否足够?

假设我的输入文件有以下字段:customerId、orderId、orderDate、orderAmount

预期输出是每个客户的最后订单

我使用 setOutputKeyComparatorClass() 设置了一个关键比较器,它将按 customerId asc,orderDate desc 进行比较

还有一个使用 setPartitioner() 的分区器,它将按 customerId % numPartition

进行分区

这里是如果 reducer 数量为 2 时将发送的示例 key :

key1: { customerId : 1, orderDate : 2012-01-31 } => reducer 1
key2: { customerId : 1, orderDate : 2011-12-31 } => reducer 1
key3: { customerId : 2, orderDate : 2011-12-01 } => reducer 2
key4: { customerId : 3, orderDate : 2012-02-01 } => reducer 1

我的问题是:

a) 仅使用上述分区器,是否可以按以下(错误的)顺序将键发送到 reducer 1?这里客户 3 与客户 1 交错

key1: { customerId : 1, orderDate : 2012-01-31 } => reducer 1
key4: { customerId : 3, orderDate : 2012-02-01 } => reducer 1
key2: { customerId : 1, orderDate : 2011-12-31 } => reducer 1

b) 如果是,是否设置一个 setOutputValueGroupingComparator(比较键中的 customerId)来解决这个问题并以正确的顺序将其发送到 reducer?

key1: { customerId : 1, orderDate : 2012-01-31 } => reducer 1
key2: { customerId : 1, orderDate : 2011-12-31 } => reducer 1
key4: { customerId : 3, orderDate : 2012-02-01 } => reducer 1

谢谢

阿杰

最佳答案

首先,请阅读:http://hadoop.apache.org/common/docs/r0.20.2/mapred_tutorial.html

分区器决定哪些键进入哪些缩减器。因此,如果您有键 A、B、C 和 D,以及缩减器 1 和 2,那么分区器会决定输出 A 和 C(例如)转到缩减器 1,而 B 和 D 转到缩减器 2。

OutputKeyComparatorClass 确定数据在归约之前是否以及如何对具有相同键的不同行进行排序。 Shuffle 阶段仅分组按键输出的 Map - 它不保证数据是排序的

在您的情况下,您似乎选择了错误的 key 。我认为您的键应该是 { customerId, orderDate } 并且您应该使用 getOutputValueGroupingComparator 来比较按 customerId 的键仅用于分组,并使用 setOutputKeyComparatorClass 来比较按 customerId 和 orderDate 递减的键以输入到 reducer。另请参阅 Owen O'Malley 关于同一主题的电子邮件:http://www.mail-archive.com/core-user@hadoop.apache.org/msg05677.html

关于Hadoop 二次排序(setPartitioner 与 setOutputValueGroupingComparator),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9204314/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com