在Hadoop二级排序中将键值路由到正确的缩减器

在Hadoop二级排序中将键值路由到正确的缩减器,hadoop,partitioner,Hadoop,Partitioner,我有三个减速机,我需要每个减速机接收相同的密钥,如下所示: GOOG - Reducer 0 AAPL - Reducer 1 VMW - Reducer 2 在分区程序中,getPartition()方法应返回一个int,指示(0,1,2)之一的减速机的索引 我拥有的getPartition()的实现是: return ((CompositeKey) key).getSymbol().hashCode() % numReduceTasks; 但是,这不起作用,这是我得到的: int nu

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

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>
../part-r-00000
谷歌
…/第r-00001部分
AAPL
VMW
…/第r-00002部分

问题是如何解决这个问题?i、 e.如何编写一个分区器函数,以保证相同的键进入同一个减速机。

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

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


一些建议:在MapReduce中“跳出盒子”是一个危险的游戏。使用MapReduce的最佳方法是遵守规则,并继承其优点。有时候这并不总是可能的,但你应该一直尝试

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

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


一些建议:在MapReduce中“跳出盒子”是一个危险的游戏。使用MapReduce的最佳方法是遵守规则,并继承其优点。有时候这并不总是可能的,但你应该一直尝试

谢谢@Donald,但在本例中,我无法在LocalJobRunner中运行它。谢谢@Donald,但在本例中,我无法在LocalJobRunner中运行它。