我有三个减速器,我需要每个减速器接收相同的键,如下:
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。
答案 0 :(得分:1)
代码的工作方式完全符合任何人的预期。您正在使用哈希代码,这是随机的,您无法保证当您为%3提供不同的值时。我认为这样做的唯一方法是使用一系列if语句作出确定性的决定:
if GOOG: return 0
if AAPL: return 1
if VMW: return 2
一些建议:在MapReduce中“开箱即用”是一个危险的游戏。使用MapReduce的最佳方法是遵守规则并继承好处。有时它并不总是可能,但你应该总是尝试!