更新時(shí)間:2021-04-15 來(lái)源:黑馬程序員 瀏覽量:
MapReduce編程模型開(kāi)發(fā)簡(jiǎn)單且功能強(qiáng)大,專(zhuān)門(mén)為并行處理大規(guī)模數(shù)據(jù)量而設(shè)計(jì),接下來(lái),我們通過(guò)一張圖來(lái)描述MapReduce的工作過(guò)程,如圖1所示。
圖1 MapReduce工作過(guò)程
在圖1中,MapReduce的工作流程大致可以分為5步,具體如下:
1.分片、格式化數(shù)據(jù)源
輸入Map階段的數(shù)據(jù)源,必須經(jīng)過(guò)分片和格式化操作。其中:
分片操作:指的是將源文件劃分為大小相等的小數(shù)據(jù)塊(Hadoop2.x中默認(rèn)128M),也就是分片(split),Hadoop會(huì)為每一個(gè)分片構(gòu)建一個(gè)Map任務(wù),并由該任務(wù)運(yùn)行自定義的map()函數(shù),從而處理分片里的每一條記錄;格式化操作:將劃分好的分片(split)格式化為鍵值對(duì)<key,value>形式的數(shù)據(jù),其中,key代表偏移量,value代表每一行內(nèi)容。2.執(zhí)行MapTask
每個(gè)Map任務(wù)都有一個(gè)內(nèi)存緩沖區(qū)(緩沖區(qū)大小100M),輸入的分片(split)數(shù)據(jù)經(jīng)過(guò)Map任務(wù)處理后的中間結(jié)果,會(huì)寫(xiě)入內(nèi)存緩沖區(qū)中。如果寫(xiě)入的數(shù)據(jù)達(dá)到內(nèi)存緩沖的閥值(80M),會(huì)啟動(dòng)一個(gè)線程將內(nèi)存中的溢出數(shù)據(jù)寫(xiě)入磁盤(pán),同時(shí)不影響map中間結(jié)果繼續(xù)寫(xiě)入緩沖區(qū)。在溢寫(xiě)過(guò)程中,MapReduce框架會(huì)對(duì)Key進(jìn)行排序,如果中間結(jié)果比較大,會(huì)形成多個(gè)溢寫(xiě)文件,最后的緩沖區(qū)數(shù)據(jù)也會(huì)全部溢寫(xiě)入磁盤(pán)形成一個(gè)溢寫(xiě)文件,如果是多個(gè)溢寫(xiě)文件,則最后合并所有的溢寫(xiě)文件為一個(gè)文件。
3.執(zhí)行Shuffle過(guò)程
MapReduce工作過(guò)程中,map階段處理的數(shù)據(jù)如何傳遞給Reduce階段,這是MapReduce框架中關(guān)鍵的一個(gè)過(guò)程,這個(gè)過(guò)程叫做Shuffle。Shuffle會(huì)將MapTask輸出的處理結(jié)果數(shù)據(jù),分發(fā)給ReduceTask,并在分發(fā)的過(guò)程中,對(duì)數(shù)據(jù)按key進(jìn)行分區(qū)和排序。
4.執(zhí)行ReduceTask
輸入ReduceTask的數(shù)據(jù)流是<key,{value list}>形式,用戶可以自定義reduce()方法進(jìn)行邏輯處理,最終以<key,value>的形式輸出。
5.寫(xiě)入文件
MapReduce框架會(huì)自動(dòng)把ReduceTask生成的<key,value>傳入OutputFormat的write方法,實(shí)現(xiàn)文件的寫(xiě)入操作。
猜你喜歡: