今天就跟大家聊聊有關(guān)MapReduce中怎么實(shí)現(xiàn)排序和分組,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
創(chuàng)新互聯(lián)建站專注于澤庫企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè),成都做商城網(wǎng)站。澤庫網(wǎng)站建設(shè)公司,為澤庫等地區(qū)提供建站服務(wù)。全流程按需網(wǎng)站開發(fā),專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)建站專業(yè)和態(tài)度為您提供的服務(wù)
Map 起始階段
在Map階段,使用 job.setInputFormatClass() 定義的 InputFormat ,將輸入的數(shù)據(jù)集分割成小數(shù)據(jù)塊 split,同時(shí) InputFormat 提供一個(gè) RecordReader的實(shí)現(xiàn)。本課程中使用的是 TextInputFormat,它提供的 RecordReader 會(huì)將文本的行號作為 Key,這一行的文本作為 Value。這就是自定義 Mapper 的輸入是 < LongWritable,Text> 的原因。 然后調(diào)用自定義 Mapper 的map方法,將一個(gè)個(gè)< LongWritable,Text>鍵值對輸入給 Mapper 的 map方法。
Map 最后階段
在 Map 階段的最后,會(huì)先調(diào)用 job.setPartitionerClass() 對這個(gè) Mapper 的輸出結(jié)果進(jìn)行分區(qū),每個(gè)分區(qū)映射到一個(gè)Reducer。每個(gè)分區(qū)內(nèi)又調(diào)用 job.setSortComparatorClass() 設(shè)置的 Key 比較函數(shù)類排序。 可以看到,這本身就是一個(gè)二次排序。如果沒有通過 job.setSortComparatorClass() 設(shè)置 Key 比較函數(shù)類,則使用 Key 實(shí)現(xiàn)的 compareTo() 方法。我們既可以使用 IntPair 實(shí)現(xiàn)的 compareTo() 方法,也可以專門定義 Key 比較函數(shù)類。
Reduce 階段
在 Reduce 階段,reduce() 方法接受所有映射到這個(gè) Reduce 的 map 輸出后,也是會(huì)調(diào)用 job.setSortComparatorClass()方法設(shè)置的 Key 比較函數(shù)類,對所有數(shù)據(jù)進(jìn)行排序。然后開始構(gòu)造一個(gè) Key 對應(yīng)的 Value 迭代器。 這時(shí)就要用到分組,使用 job.setGroupingComparatorClass()方法設(shè)置分組函數(shù)類。只要這個(gè)比較器比較的兩個(gè) Key 相同,它們就屬于同一組,它們的 Value 放在一個(gè) Value 迭代器,而這個(gè)迭代器的 Key 使用屬于同一個(gè)組的所有Key的第一個(gè)Key。最后就是進(jìn)入 Reducer 的 reduce() 方法,reduce() 方法的輸入是所有的 Key 和它的 Value 迭代器,同樣注意輸入與輸出的類型必須與自定義的 Reducer 中聲明的一致。
job.setPartitionerClass() 和job.setGroupingComparatorClass()的關(guān)系
reduce方法每次是讀一條記錄,讀到相應(yīng)的key,但是處理value集合時(shí),處理完當(dāng)前記錄的values后,還會(huì)判斷下一條記錄是不是和當(dāng)前的key是不是同一個(gè)組,如果是的話,會(huì)繼續(xù)讀取這些記錄的值,而這個(gè)記錄也會(huì)被認(rèn)為已經(jīng)處理了,直到記錄不是當(dāng)前組,這次reduce調(diào)用才結(jié)束,這樣一次reduce調(diào)用就會(huì)處理掉一個(gè)組中的所有記錄,而不僅僅是一條了。這個(gè)有什么用呢?如果不用分組,那么同一組的記錄就要在多次reduce方法中獨(dú)立處理,那么有些狀態(tài)數(shù)據(jù)就要傳遞了,就會(huì)增加復(fù)雜度,在一次調(diào)用中處理的話,這些狀態(tài)只要用方法內(nèi)的變量就可以的。比如查找最大值,只要讀第一個(gè)值就可以了。
看完上述內(nèi)容,你們對MapReduce中怎么實(shí)現(xiàn)排序和分組有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。