2012-06-25 28 views
2

我瞭解在鍵進入reducer之前排序特定鍵的值的方法。我瞭解到,可以通過編寫三種方法即keycomparator,partitioner和valuegrouping來完成。Map-Reduce中的二級排序

現在,當valuegrouping運行時,它基本上將所有與自然鍵相關的值分組,對嗎?因此,當它將自然鍵的所有值分組時,與減速器的一組排序值一起發送的實際鍵將是什麼?自然鍵可能與多種類型的實體(組合鍵的第二部分)相關聯。發送給減速機的組合密鑰是什麼?

AP

回答

4

這可能是令人驚訝的知道,但值的每一次迭代的Iterable實際更新的主要參考太:

protected void reduce(K key, Iterable<V> values, Context context) { 
    for (V value : values) { 
     // key object contents will update for each iteration of this loop 
    } 
} 

我知道這個工程的新的MapReduce API,我的天堂」跟蹤它的舊mapred API。

因此,在回答您的問題時,所有密鑰都將可用,第一個密鑰將與該組的第一個排序密鑰相關。

編輯:如何以及爲什麼這個工程一些額外的信息:

有跡象表明,減速機用來處理輸出的鍵/值對由地圖階段兩個比較:

  • 按鍵排序比較器 - 此比較器先應用並命令所有KV對。從概念上講,你現在仍然在處理序列化的字節。
  • 的鍵組比較 - 該比較器是負責確定當先前和當前鍵「不同」,表示引擎蓋下一個組KV對和另一

之間的邊界中,參考到密鑰並且值永遠不會改變,每次調用Iterable.Iterator.next()都會將底層字節流中的指針前進到下一個KV對。如果關鍵的石斑魚確定當前的一組關鍵字字節和先前的集合是相同的關鍵字,則值Iterable.iterator()的hasNext方法將返回true,否則返回false。如果返回true,則將字節反序列化爲Key和Value實例,以便在reduce方法中使用。

+0

太棒了!謝謝。精彩的想法。 –

+0

@ChrisWhite你能解釋一下他的答案嗎?我與你有同樣的問題,但我發現很難理解它是如何工作的。 – fanbondi

+2

@Chris對此行爲的任何引用? –