您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關MapReduce中怎么實現排序和分組,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
Map 起始階段
在Map階段,使用 job.setInputFormatClass() 定義的 InputFormat ,將輸入的數據集分割成小數據塊 split,同時 InputFormat 提供一個 RecordReader的實現。本課程中使用的是 TextInputFormat,它提供的 RecordReader 會將文本的行號作為 Key,這一行的文本作為 Value。這就是自定義 Mapper 的輸入是 < LongWritable,Text> 的原因。 然后調用自定義 Mapper 的map方法,將一個個< LongWritable,Text>鍵值對輸入給 Mapper 的 map方法。
Map 最后階段
在 Map 階段的最后,會先調用 job.setPartitionerClass() 對這個 Mapper 的輸出結果進行分區,每個分區映射到一個Reducer。每個分區內又調用 job.setSortComparatorClass() 設置的 Key 比較函數類排序。 可以看到,這本身就是一個二次排序。如果沒有通過 job.setSortComparatorClass() 設置 Key 比較函數類,則使用 Key 實現的 compareTo() 方法。我們既可以使用 IntPair 實現的 compareTo() 方法,也可以專門定義 Key 比較函數類。
Reduce 階段
在 Reduce 階段,reduce() 方法接受所有映射到這個 Reduce 的 map 輸出后,也是會調用 job.setSortComparatorClass()方法設置的 Key 比較函數類,對所有數據進行排序。然后開始構造一個 Key 對應的 Value 迭代器。 這時就要用到分組,使用 job.setGroupingComparatorClass()方法設置分組函數類。只要這個比較器比較的兩個 Key 相同,它們就屬于同一組,它們的 Value 放在一個 Value 迭代器,而這個迭代器的 Key 使用屬于同一個組的所有Key的第一個Key。最后就是進入 Reducer 的 reduce() 方法,reduce() 方法的輸入是所有的 Key 和它的 Value 迭代器,同樣注意輸入與輸出的類型必須與自定義的 Reducer 中聲明的一致。
job.setPartitionerClass() 和job.setGroupingComparatorClass()的關系
reduce方法每次是讀一條記錄,讀到相應的key,但是處理value集合時,處理完當前記錄的values后,還會判斷下一條記錄是不是和當前的key是不是同一個組,如果是的話,會繼續讀取這些記錄的值,而這個記錄也會被認為已經處理了,直到記錄不是當前組,這次reduce調用才結束,這樣一次reduce調用就會處理掉一個組中的所有記錄,而不僅僅是一條了。這個有什么用呢?如果不用分組,那么同一組的記錄就要在多次reduce方法中獨立處理,那么有些狀態數據就要傳遞了,就會增加復雜度,在一次調用中處理的話,這些狀態只要用方法內的變量就可以的。比如查找最大值,只要讀第一個值就可以了。
看完上述內容,你們對MapReduce中怎么實現排序和分組有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。