2015-01-14 75 views

回答

0

這樣做有多種方式:

  1. 發射值用在「特殊」鍵的標準鍵/值輸出,這將保證你的價值會先匯入您減速器減速每一個。 (您可能需要設置自定義排序比較器和分區)
  2. 使用MultipleOutputs在映射器和FileSystem在減速設置讀取文本文件。我想你也可以在映射器中使用FileSystem來編寫。這不是最佳解決方案,因此在寫入和關閉文件之前,需要注意確保讀取數據的時間。
  3. 使用DistributedCache編輯:其實,我不認爲這將在同一工作的映射器和減速器之間工作。請忽略此選項。

對於選項#1,假設您有一個Text鍵和Text值從mapper傳遞到reducer。 而且你知道你的任何一把鑰匙都不能以空格「」開頭。所以你可以做的是構造一個特殊的鍵「」+#,其中#是一個reducer分區id(從0到N-1,其中N是你的reducer的總數)。然後在一個循環中輸入「01」,「02」,「03」......這樣的密鑰,並輸入你需要傳遞給每個reducer的值。 設置自定義partitioner,使其認識到「特殊」鍵和路線給對應分區:

int getPartition(Text key, Text value, int numPartitions) { 
    if (key.toString().startWith(" ") { 
     //special key 
     int partId = Integer.parseInt(key.toString().substring(1)); 
     return partId; 
    } else { 
     //regular key 
     return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks; 
    } 
} 

顯然,如果你有使用的密鑰其他數據類型,你仍然可以創造性地想出了一個類似的邏輯。

+0

謝謝您的回答。 :) –

相關問題