Hadoop辅助排序(setPartitioner与setOutputValueGroupingComparator)



我正在尝试为辅助排序确定setOutputValueGroupingComparator方法的必要性-setPartitioner是否足够?

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

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

我使用setOutputKeyComparatorClass()设置了一个密钥比较器,它将通过customerId asc,orderDate desc进行比较

和一个使用setPartitioner()的分区器,该分区器将按customerId%numPartition进行分区

如果减速器数量为2:,将发送以下示例密钥

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

感谢

Ajai

首先,请阅读以下内容: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输出进行分组-它不能保证数据被排序

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

相关内容

  • 没有找到相关文章

最新更新