《LINUX學習:MapReduce運行流程分析》要點:
本文介紹了LINUX學習:MapReduce運行流程分析,希望對您有用。如果有疑問,可以聯系我們。
研究MapReduce已經有一段時間了.起初是從分析WordCount程序開始,后來開始閱讀Hadoop源碼,自認為已經看清MapReduce的運行流程.現在把本身的理解貼出來,與大家分享,歡迎糾錯.
還是以最經典的WordCount程序作為基礎,來闡發map階段、reduce階段和最復雜的shuffle階段.
? ? 文本1:hello world? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 文本2:map reduce
? ? ? ? ? ? ? hello hadoop? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? java interface
? ? ? ? ? ? ? abc qaz? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? java hdfs
java jvm? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? spark storm
這樣的2個小文本文件(不敷64M),肯定會產生2個map任務,reduce任務默認是1個.當然,map任務和reduce任務的個數都可以在程序中或者配置文件中人為設置.為了說明partition的過程,我們把reduce任務的個數設為2.
1、map階段
? ? ? ? ? ? ? ? ? ? map1? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? map2
輸入:<xxxx, hello world>? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <xxxx, map reduce>
? ? ? ? <xxxx, hello hadoop>? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <xxxx, java interface>
<xxxx, abc qaz>? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <xxxx, java hdfs>
<xxxx, java jvm>? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <xxxx, spark storm>
切分:<hello, 1>? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <map, 1>
? ? ? ? <word, 1>? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <reduce, 1>
<hello, 1>? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <java, 1>? ? ? ? ? ? ? ? ?
<hadoop, 1>? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <interface, 1>
<abc, 1>? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <java, 1>
<qaz, 1>? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <hdfs, 1>
<java, 1>? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <spark, 1>
<jvm, 1>? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <storm, 1>
?
2、shuffle階段
? ? 切分完畢后,每一組<key, value>都會賡續地被collect到一個內存緩沖區中,對應代碼中的數據結構MapOutputBuffer.
partition過程:每一組<key, value>在被收集的時候,就已經確定了分區(partition),即在這個時候就已經確定了要交給哪個reduce任務處置.分區會給<key, value>加上一個索引標識.假設分區后(分區算法可以設定,默認是hash值模運算),數據如下:reduce1的標識是0,reduce2的標識是1? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <hello, 1>? ? ? ? ? ? ? ? 0? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <map, 1>? ? ? ? ? ? ? ? ? ? ? ? 0
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <word, 1>? ? ? ? ? ? ? ? 1? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <reduce, 1>? ? ? ? ? ? ? ? ? ? ? 1
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <hello, 1>? ? ? ? ? ? ? ? 0? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <java, 1>? ? ? ? ? ? ? ? ? ? ? ? ? 0?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <hadoop, 1>? ? ? ? ? ? 1? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <interface, 1>? ? ? ? ? ? ? ? ? 1
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <abc, 1>? ? ? ? ? ? ? ? ? 0? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <java, 1>? ? ? ? ? ? ? ? ? ? ? ? 0
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <qaz, 1>? ? ? ? ? ? ? ? ? 1? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <hdfs, 1>? ? ? ? ? ? ? ? ? ? ? ? 1
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <java, 1>? ? ? ? ? ? ? ? 0? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <spark, 1>? ? ? ? ? ? ? ? ? ? ? ? 0
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <jvm, 1>? ? ? ? ? ? ? ? ? 1? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <storm, 1>? ? ? ? ? ? ? ? ? ? ? 1
?
spill過程:緩沖區默認是100M,每當里面的數據達到80M(比例80%,這個比例也可以人為設置),就會另起一個線程SpillThread往磁盤溢寫,每次溢寫都會發生一個數據文件和對應的索引文件.
sort過程:在溢寫的過程中一直在排序,比擬算法可以定制,默認排序算法是快速排序(可以人為設定),排序的過程就是一些位置的索引在不斷的變化.
? ? ? ? ? ? ? 排序之后的數據:? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <abc, 1>? ? ? ? ? ? ? ? 0? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <hdfs, 1>? ? ? ? ? ? ? ? ? ? ? ? 1
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <hello, 1>? ? ? ? ? ? ? ? 0? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <interface, 1>? ? ? ? ? ? ? ? ? 1
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <hello, 1>? ? ? ? ? ? ? ? 0? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <java, 1>? ? ? ? ? ? ? ? ? ? ? ? ? 0?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <hadoop, 1>? ? ? ? ? ? 1? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <java, 1>? ? ? ? ? ? ? ? ? ? ? ? 0
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <java, 1>? ? ? ? ? ? ? ? 0? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <map, 1>? ? ? ? ? ? ? ? ? ? ? ? 0
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <jvm, 1>? ? ? ? ? ? ? ? ? 1? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <reduce, 1>? ? ? ? ? ? ? ? ? ? ? 1
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <qaz, 1>? ? ? ? ? ? ? ? ? 1? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <spark, 1>? ? ? ? ? ? ? ? ? ? ? ? 0
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <word, 1>? ? ? ? ? ? ? ? 1? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <storm, 1>? ? ? ? ? ? ? ? ? ? ? 1
?
combine過程:這個過程默認是沒有的,需要明確指定combiner.combiner其實就是一個reducer,可以讓數據交給reduce任務之前,進行一些計算、合并.它的意義在于,使數據進一步減少,減輕了? ? ? ? ? ? ? ? ? ? ? reduce任務通過網絡獲取數據的壓力和reduce處理數據的壓力.combiner也可以本身定制,每個溢寫文件都會combine.
? ? ? ? ? ? ? ? ? ? ? combiner會通過一個比擬器對key進行比擬,相同的key(比擬結果為0,比擬算法可以定制),會被放到一個集合的迭代器中,然后迭代進行一次reduce運算,產生一個輸出.
? ? ? ? ? ? ? ? ? ? ? combine之后的數據:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <abc, 1>? ? ? ? ? ? ? ? 0? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <hdfs, 1>? ? ? ? ? ? ? ? ? ? ? ? 1
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <hello, 1+1>? ? ? ? ? ? 0? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <interface, 1>? ? ? ? ? ? ? ? ? 1?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <hadoop, 1>? ? ? ? ? ? 1? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <java, 1+1>? ? ? ? ? ? ? ? ? ? 0
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <java, 1>? ? ? ? ? ? ? ? 0? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <map, 1>? ? ? ? ? ? ? ? ? ? ? ? 0
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <jvm, 1>? ? ? ? ? ? ? ? ? 1? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <reduce, 1>? ? ? ? ? ? ? ? ? ? ? 1
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <qaz, 1>? ? ? ? ? ? ? ? ? 1? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <spark, 1>? ? ? ? ? ? ? ? ? ? ? ? 0
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <word, 1>? ? ? ? ? ? ? ? 1? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <storm, 1>? ? ? ? ? ? ? ? ? ? ? 1
merge過程:一個map所有的溢寫文件都會進行合并,產生一個最終的溢寫文件和一個索引文件.合并是針對于分歧的溢寫文件中相同分區的數據.在這個合并的過程中,也會進行combine操作(如果設置了的話),此處的combine過程同上,不再細說.
copy數據過程:每個reduce任務會遠程copy屬于自己的多個map輸出數據文件,通過http傳輸,在當地會合并.另外,這個過程也會進行combine,此次不過多說明.
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 成果如下:? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? reduce0? ? ? ? ? ? ? ? ? ? ? ? reduce1
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <abc, 1>? ? ? ? ? ? ? ? ? ? <hadoop, 1>
? <hello, 2>? ? ? ? ? ? ? ? ? ? <jvm, 1>
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <java, 1>? ? ? ? ? ? ? ? ? ? <qaz, 1>
<java, 2>? ? ? ? ? ? ? ? ? ? <word, 1>
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <map, 1>? ? ? ? ? ? ? ? ? ? <hdfs, 1>
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <spark, 1>? ? ? ? ? ? ? ? ? <interface, 1>
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <reduce, 1>
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <storm, 1>
sort過程:對上述成果進行排序,成果如下:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? reduce0? ? ? ? ? ? ? ? ? ? ? ? reduce1
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <abc, 1>? ? ? ? ? ? ? ? ? ? <hadoop, 1>
? <hello, 2>? ? ? ? ? ? ? ? ? ? <hdfs, 1>
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <java, 1>? ? ? ? ? ? ? ? ? ? <interface, 1>
<java, 2>? ? ? ? ? ? ? ? ? ? <jvm, 1>
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <map, 1>? ? ? ? ? ? ? ? ? ? <qaz, 1>
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <spark, 1>? ? ? ? ? ? ? ? ? <reduce, 1>
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <storm, 1>
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <word, 1>
?
3、reduce階段
? ? 通過一個GroupComparator對key進行比擬,相同的key(比擬結果為0,比擬算法可以定制),會被放到一個集合的迭代器中,然后迭代進行一次reduce運算,產生一個輸出.類似combine過程.
? ? ? ? ? ? ? ? ? ? ? ? ? ? 最終的輸出:? ? ? ? ? ? ? ? ? ? reduce0? ? ? ? ? ? ? ? ? ? ? ? reduce1
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <abc, 1>? ? ? ? ? ? ? ? ? ? <hadoop, 1>
? <hello, 2>? ? ? ? ? ? ? ? ? ? <hdfs, 1>
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <java, 3>? ? ? ? ? ? ? ? ? ? <interface, 1>
? <map, 1>? ? ? ? ? ? ? ? ? ? <jvm, 1>
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <spark, 1>? ? ? ? ? ? ? ? ? <qaz, 1>
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <reduce, 1>
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <storm, 1>
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <word, 1>
從上述過程的闡發可以看出,合并和排序是核心!!!
PS:其實每個階段沒有這么分明,只不過是為了分析和理解的需要,才進行這樣詳細的劃分,而且劃分的還不必定正確,請大家及時糾錯.另外,上述流程中涉及到好多的細節,沒有一一說明.
本文永遠更新鏈接地址:
歡迎參與《LINUX學習:MapReduce運行流程分析》討論,分享您的想法,維易PHP學院為您提供專業教程。