2013-11-02 47 views
1

我有三個減速,我需要他們每個人獲得相同的密鑰,像這樣正確的減速機:路由鍵值在Hadoop的輔助排序

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> 

問題是我該如何解決這個問題?即如何編寫一個分區程序功能,以確保相同的密鑰到達同一個縮減程序。

回答

1

該代碼正如任何人所期望的那樣工作。你正在使用一個哈希碼,它是隨機的,你不能保證,當你%3時,他們給出不同的值。我想看到的一種方式只有這樣,才能做到這一點是有if語句的一系列作出確定性決定:

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

幾點建議:去「框外」中的MapReduce是一個危險的遊戲。使用MapReduce的最佳方式是按規則進行遊戲,並繼承優勢。有時並不總是可能的,但你應該總是嘗試!

+0

謝謝@Donald,但在這種情況下,我不能在LocalJobRunner中運行它。 – jakstack