2013-08-23 114 views

回答

15

分組比較

一旦數據到達減速機,所有的數據由關鍵分組。由於我們有一個組合鍵,我們需要確保記錄完全按照自然鍵組合。這是通過編寫自定義GroupPartitioner來完成的。我們有一個Comparator對象,只考慮TemperaturePair類的yearMonth字段,用於將記錄分組在一起。

public class YearMonthGroupingComparator extends WritableComparator { 

    public YearMonthGroupingComparator() { 
     super(TemperaturePair.class, true); 
    } 

    @Override 
    public int compare(WritableComparable tp1, WritableComparable tp2) { 
     TemperaturePair temperaturePair = (TemperaturePair) tp1; 
     TemperaturePair temperaturePair2 = (TemperaturePair) tp2; 
     return temperaturePair.getYearMonth().compareTo(temperaturePair2.getYearMonth()); 
    } 
} 

以下是運行我們的輔助排序作業的結果:

new-host-2:sbin bbejeck$ hdfs dfs -cat secondary-sort/part-r-00000 

190101 -206

190102 -333

190103 -272

190104 -61

190105 -33

190110 -33

190111 -217

190112 -300

按價值排序數據可能不是一個普遍的需求,它是一個很好的工具,需要在你的後面的口袋裏。此外,我們可以通過使用自定義分區程序和組分區來深入瞭解Hadoop的內部工作。 請參考這個鏈接.. What is the use of grouping comparator in hadoop map reduce

+2

有關進一步的參考.. http://codingjunkie.net/secondary-sort/ –

+0

內部二次排序的工作原理是什麼?從mapper到reducer的實際流程是什麼? – user1585111

+1

要了解...請參閱http://answers.oreilly.com/topic/457-introduction-to-mapreduce-workflows/ –

15

這裏是一個分組的例子。考慮一個複合鍵(a, b)及其值v。讓我們假設排序後,你最終,除其他外,與下面的一組(鍵,值)對:

(a1, b11) -> v1 
(a1, b12) -> v2 
(a1, b13) -> v3 

使用默認的組比較的框架將調用reduce功能3次相應的(關鍵,值)對,因爲所有密鑰都不同。但是,如果您提供自己的自定義組比較器,並將其定義爲僅取決於a,而忽略b,則框架得出結論認爲此組中的所有鍵均相同,並使用以下鍵僅調用一次reduce函數一次值的列表:

(a1, b11) -> <v1, v2, v3> 

注意,只有第一個複合鍵使用,而B12和B13被「丟失」,即,不傳遞到減速。

在衆所周知的例子中,「Hadoop」一書按年計算最高溫度,a是年份,而b是按降序排列的溫度,因此b11是期望的最高溫度,您不需要關心其他b的。 reduce函數只是將收到的(a1,b11)寫爲當年的解決方案。

在你的「bigdataspeak.com」的例子中,所有的b都需要在reducer中,但它們可以作爲各個值(對象)v的一部分提供。

通過這種方式,通過將您的值或其中的部分包含在鍵中,您可以使用Hadoop不僅對鍵排序,而且還對您的值進行排序。

希望這會有所幫助。

40

我發現很容易理解某些概念和圖表的幫助,這當然是其中之一。

讓我們假設我們的二級排序是在由姓氏和名字組成的組合鍵上。

Composite Key

隨着複合鍵的方式進行,現在讓我們看一下在次級分類機構

Secondary Sorting Steps

分區器和該組比較器僅使用自然鍵,所述分割使用它將具有相同自然鍵的所有記錄引導至單個縮減器。 此分區發生在Map階段,來自各個Map任務的數據由Reduce接收,它們是,分組爲,然後發送給reduce方法。這個分組就是組比較器進入畫面的地方,如果我們想要而不是已經指定了一個自定義的組比較器,那麼Hadoop會使用默認的實現來考慮整個組合鍵,這會導致錯誤的結果。

MR步驟概述

enter image description here

+0

偉大的圖表,謝謝。是否有可能使用此方法而不實現您自己的groupingComparator? –

+0

精美的解釋。你有沒有借用任何書?如果是的話,可否請你指點一下這本書?謝謝。 – maddie

+0

謝謝。是的,它來自[Hadoop in Practice](https://www.manning.com/books/hadoop-in-practice-second-edition)。第二版似乎已經發生了一些變化。 – Sudarshan

0

上面提到的例子有很好的解釋,讓我簡化it.we需要執行三個主要步驟。

  1. Mapout應該是(鍵+價值,價值)
  2. 當我們加入主要&價值。我們仍然需要有機制對原始鍵和值進行排序。因此我們將添加一個自定義比較器。
  3. 現在數據按照原始密鑰進行排序,但是如果我們將此數據發送給還原器,則不能保證將給定密鑰的所有值都發送給一個還原器,因爲我們使用Key + Value作爲密鑰。爲了確保我們會添加組比較器。
1

分區程序只是確保一個reducer接收屬於某個鍵的所有記錄,但不會更改reducer按分區中的鍵進行分組這一事實。

在二次排序的情況下,我們形成組合鍵,如果我們讓默認行爲繼續,分組邏輯將認爲鍵是不同的。

所以我們需要控制分組。因此,我們必須根據關鍵的自然部分而不是複合關鍵字來指示框架。因此,分組比較器必須用於相同的。