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