您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關hadoop中系統執行排序的過程叫什么的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
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的輸出<key,value>作為Combiner的輸入<key,value>和輸出<key,value>,也就是說Combiner的輸入和輸出必須是一樣的。
可以通過job.setCombinerClass設置combiner的處理類,MapReduce框架不保證一定會調用該類的方法。
注意:如果reduce的輸入和輸出一樣,則可以直接用reduce類作為combiner
用戶自定義Partitioner
Partitioner是用于確定map輸出的<key,value>對應的處理reducer是那個節點。默認MapReduce任務reduce個數為1個,此時Partitioner其實沒有什么效果,但是當我們將reduce個數修改為多個的時候,partitioner就會決定key所對應reduce的節點序號(從0開始)。
可以通過job.setPartitionerClass方法指定Partitioner類,默認情況下使用HashPartitioner(默認調用key的hashCode方法)。
用戶自定義Group
GroupingComparator是用于將Map輸出的<key,value>進行分組組合成<key,List<value>>的關鍵類,直白來講就是用于確定key1和key2是否屬于同一組,如果是同一組,就將map的輸出value進行組合。
要求我們自定義的類實現自接口RawComparator,可以通過job.setGroupingComparatorClass方法指定比較類。默認情況下使用WritableComparator,但是最終調用key的compareTo方法進行比較。
用戶自定義Sort
SortComparator是用于將Map輸出的<key,value>進行key排序的關鍵類, 直白來講就是用于確定key1所屬組和key2所屬組那個在前,那個在后。
要求我們自定義的類實現自接口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。
感謝各位的閱讀!關于“hadoop中系統執行排序的過程叫什么”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。