将键值路由到Hadoop辅助排序中的正确Reducer

时间:2013-11-02 19:27:15

标签: hadoop partitioner

我有三个减速器,我需要每个减速器接收相同的键,如下:

GOOG - Reducer 0
AAPL - Reducer 1
VMW - Reducer 2

在分区器中,getPartition()方法应该返回一个int,表示reducer的索引(0,1,2)。

我所拥有的getPartition()的实现是:

return ((CompositeKey) key).getSymbol().hashCode() % numReduceTasks;

然而,这不是我的工作:

 int numReduceTasks = 3;
 System.out.println("GOOG".hashCode() % numReduceTasks);//output: 0
 System.out.println("AAPL".hashCode() % numReduceTasks);//output: 1
 System.out.println("VMW".hashCode() % numReduceTasks);//output:  1

所以在输出文件中我得到了

.../part-r-00000

GOOG

.../part-r-00001

AAPL
VMW

.../part-r-00002

<empty>

问题是我该如何解决这个问题?即如何编写分区函数,以保证相同的键转到同一个reducer。

1 个答案:

答案 0 :(得分:1)

代码的工作方式完全符合任何人的预期。您正在使用哈希代码,这是随机的,您无法保证当您为%3提供不同的值时。我认为这样做的唯一方法是使用一系列if语句作出确定性的决定:

if GOOG: return 0
if AAPL: return 1
if VMW: return 2

一些建议:在MapReduce中“开箱即用”是一个危险的游戏。使用MapReduce的最佳方法是遵守规则并继承好处。有时它并不总是可能,但你应该总是尝试!