在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中运行它。