MapReduce確保每個reducer的輸入都是按鍵排序的,系統執行排序的過程稱為shuffle。 shuffle階段主要包括map階段的combine、group、sort、partition以及reducer階段的合併排序。
本教學操作環境:windows7系統,Dell G3電腦。
MapReduce確保每個reducer的輸入都是按鍵排序的,系統執行排序的過程稱為shuffle。 我們可以理解為map產生輸出到reduce的消化輸入的整個工程。
Map端:每個mapperTask有一個環形記憶體緩衝區,用於儲存map任務的輸出,一旦達到閾值,一個後台執行緒把內容寫到磁碟的指定目錄下的新建的一個溢出寫文件,寫磁碟前要經過partition、sort、Combiner。等最後記錄寫完,合併全部溢出寫檔案為一個分區且排序的檔案。
Reduce端:可以分為複製階段、排序階段、reduce階段
複製階段:map輸出檔位於執行map任務的tasktracker的本機磁碟上,reduce透過http的方式取得輸出檔案的分區,tasktracker為分區檔案執行reduce任務,只要有一個map任務完成,reduce任務就開始複製輸出。
排序階段:更恰當的說法是合併階段,因為排序是在map端進行的。這個階段將合併map輸出,維持其順序排序,循環進行。
最後階段就是reduce階段,對已排序輸出中的每個鍵呼叫reduce函數,此階段的輸出直接寫到輸出檔系統,一般為hdfs。 、
Shuffle階段說明
shuffle階段主要包含map階段的combine、group、sort、partition以及reducer階段的合併排序。 Map階段通過shuffle後會將輸出資料依照reduce的分區分檔案的保存,檔案內容是依照定義的sort進行排序好的。 Map階段完成後會通知ApplicationMaster,然後AM會通知Reduce進行資料的拉取,在拉取過程中進行reduce端的shuffle過程。
注意:Map階段的輸出資料是存在運行Map節點的磁碟上,是個臨時文件,不是存在HDFS上,在Reduce拉取資料後,那個臨時文件會刪除,若是存在hdfs上,會造成儲存空間的浪費(會產生三個副本)。
用戶自訂Combiner
Combiner可以減少Map階段的中間輸出結果數,降低網路開銷。預設是沒有Combiner的。使用者自訂的Combiner要求是Reducer的子類,以Map的輸出
可以透過job.setCombinerClass設定combiner的處理類,MapReduce框架不保證一定會呼叫該類別的方法。
注意:如果reduce的輸入和輸出一樣,則可以直接用reduce類別作為combiner
用戶自訂Partitioner
Partitioner是用於確定map輸出的
可以透過job.setPartitionerClass方法指定Partitioner類,預設使用HashPartitioner(預設呼叫key的hashCode方法)。
使用者自訂Group
GroupingComparator是用來將Map輸出的
要求我們自訂的類別實作自介面RawComparator,可以透過job.setGroupingComparatorClass方法指定比較類別。預設使用WritableComparator,但最終呼叫key的compareTo方法進行比較。
用戶自訂Sort
SortComparator是用於將Map輸出的
要求我們自訂的類別實作自介面RawComparator,可以透過job.setSortComparatorClass方法指定比較類別。預設使用WritableComparator,但最終呼叫key的compareTo方法進行比較。
用戶自訂Reducer的Shuffle
在reduce端拉取map的輸出資料的時候,會進行shuffle(合併排序),MapReduce框架以插件模式提供了一個自訂的方式,我們可以透過實作介面ShuffleConsumerPlugin,並指定參數mapreduce.job.reduce.shuffle.consumer.plugin.class來指定自訂的shuffle規則,但是一般情況下,直接採用預設的類別org. apache.hadoop.mapreduce.task.reduce.Shuffle。
更多程式相關知識,請造訪:程式設計影片! !
以上是系統執行排序的過程稱為什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!