1

我有三个减速器,我需要它们每个都接收相同的密钥,如下所示:

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

在分区器中,getPartition() 方法应返回一个 int,指示缩减器的索引(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。

4

1 回答 1

1

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

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

一些建议:在 MapReduce 中“跳出框框”是一种危险的游戏。使用 MapReduce 的最佳方式是遵守规则并继承其优势。有时它并不总是可能的,但你应该总是尝试!

于 2013-11-02T19:35:33.477 回答