MapReduce的原理及執行過程

2021-08-29 04:06:29 字數 3540 閱讀 8618

hadoop mapreduce是乙個軟體框架,基於該框架能夠容易地編寫應用程式,這些應用程式能夠執行在由上千個商用機器組成的大集群上,並以一種可靠的,具有容錯能力的方式並行地處理上tb級別的海量資料集。

mapreduce是一種分布式計算模型,是google提出的,主要用於搜尋領域,解決海量資料的計算問題。

mr有兩個階段組成:map和reduce,使用者只需實現map()和reduce()兩個函式,即可實現分布式計算。

首先讓我們來重溫一下 hadoop 的四大元件:

hdfs:分布式儲存系統

mapreduce:分布式計算系統

yarn: hadoop 的資源排程系統

common: 以上三大元件的底層支撐元件,主要提供基礎工具包和 rpc 框架等

mapreduce 是乙個分布式運算程式的程式設計框架,是使用者開發「基於 hadoop 的資料分析 應用」的核心框架

mapreduce 核心功能是將使用者編寫的業務邏輯**和自帶預設元件整合成乙個完整的 分布式運算程式,併發執行在乙個 hadoop 集群上

主要思想:分而治之,分久必合

核心思想:相同的key為一組,呼叫一次reduce方法,方法內迭代這一組資料進行計算

一是資料或計算的規模相對原任務要大大縮小;

二是就近計算原則,即任務會分配到存放著所需資料的節點上進行計算;

三是這些小任務可以平行計算,彼此間幾乎沒有依賴關係。

(2)reducer負責對map階段的結果進行彙總。至於需要多少個reducer,使用者可以根據具體問題,通過在mapred-site.xml配置檔案裡設定引數mapred.reduce.tasks的值,預設值為1。

1,block ≈split切片=map task

預設buffer的大小是100m

2,map task將處理後每一條記錄打上標籤,上標籤的目的就是為了讓這一條知道將來被哪乙個reduce task處理

打標籤:分割槽

分割槽是由分割槽器來完成的

預設的分割槽器:hashpartitioner

分割槽策略:根據key的hashcode與reduce task num 取模

3,進入buffer之後的每一條記錄是由三部分組成的:

①分割槽號

②key

③value

4,溢寫過程:

portitions=combinner->sort->spill

即=小聚合+排序+歸併

map task 一條條的往buffer中去寫,一旦寫入到80m,此時他將會把這80m的記憶體進行封鎖,封鎖後會對記憶體中的資料進行combiner(小聚合)。

排序:分割槽號、key

將相同分割槽號的資料放在一起,並且對分區內的資料進行排序

以上的combiner以及排序完成後,就開始溢寫資料到磁碟上

此時的磁碟檔案就是根據分割槽號分好區的,並且是內部有序的檔案。

注意:沒進行一次溢寫就會產生乙個小的磁碟檔案。

5,歸併

map task計算完畢後,會將磁碟上的小檔案合併成乙個大檔案,在合併的時候會使用歸併排序的演算法,將各個小檔案合併成乙個有序的大檔案

每乙個map task都會經過剛才所說的一切,也就是每乙個map task都會產生乙個有分割槽的並且有序的大檔案。

去map端讀取相應的分割槽資料,將分割槽資料寫入到記憶體中,記憶體滿了就會溢位,溢位之前會排序,當把所有的資料取來之後,會將溢位產生的磁碟小檔案合併,排序成有序的大檔案。

why要合併產生乙個有序的大檔案?

原因:就是為了提高分組的分組效率

歸根來說,這四次排序都是為了提高分組的分組效率。

最後每一組資料再呼叫一次reduce函式,產生結果,此時reduce要處理的檔案,經過前三次的排序,內部都是有序的,且經過合併,檔案的數量也大大減少,所以極大地加快了最後reduce函式排序的過程。

jobtracker的作用:

1,負責資源排程 主節點 一旦故障 整個集群癱瘓了

2,負責任務排程,主節點

問題:1,負載過高,容易故障

2,與mr的耦合度太高,如果spark也要執行在這套框架上,需要自己去實現,這個集群就存在兩套資源排程器,就會出現資源隔離問題以及資源搶奪問題。

這種設計模式,jobtracker既做資源排程,又做任務排程,這樣就會造成job的壓力很大,一旦jobtracker節點掛掉,整個計算框架就掛了,歸根結底還是單點故障問題。

hadoop 2.0之後採用yarn集群來進行資源排程分配

優點:這種方式,把資源排程和任務排程分開,在不同節點上進行,這樣極大地減輕了單節點的負擔,故障發生的概率也相對的減少了。

還有就是為了解決資源排程器的單調故障問題,我們又採用zookeeper集群的形式,對其做監管和備份,一旦rm掛掉,就會立即啟動備份的rm.

良好的擴充套件性,即可以很容易的增加節點

適合pb級別的資料的離線處理

輸入資料的解析:inputformat

輸入分組:partitioner輸入分組:partitioner

本節點的規約:combiner ,本節點的規約:combiner ,

shuffling階段拉取資料

排序,溢寫

reducer資料規約:reducer

資料輸出格式: outputformat

將檔案進行分片,inputsplit方法,處理跨行問題

將分片資料解析成key/val 對,預設實現是textinputformat,其中key是控制代碼偏移量,value是行內容

預設情況下split就是hdfs中的乙個block,但是使用者可以自定義split與block的對應關係,split切片是邏輯

上的切,並沒有真正的去切割資料。

hash(key)mode r

r 是 reduce task 的數目

函式

輸入輸入

說明map

如:《行號,」a b c」>

list()

如:1.將小資料集進一步解析成一批對,輸入map函式中進行處理

2.每乙個輸入的會輸出一批。是計算的中間結果

reduce

如:>

輸入的中間結果中的list(v2)表示是一批屬於同乙個k2的value

由排程的資源決定的,也就是說啟動的yarnchild個數多少取決於資源的分配和free的資源量

map個數主要由任務切片spilt決定的,預設情況下乙個split的大小就是block由參與任務的檔案個數決定的。

分割槽與分組的概念

MapReduce執行原理

mapreduce是一種程式設計模型,用於大規模資料集 大於1tb 的並行運算。mapreduce採用 分而治之 的思想,把對大規模資料集的操作,分發給乙個主節點管理下的各個分節點共同完成,然後通過整合各個節點的中間結果,得到最終結果。簡單地說,mapreduce就是 任務的分解與結果的彙總 map...

MapReduce的執行原理

每個map上建立乙個split資料,預設和block大小相同,每乙個split都會由乙個map task進行處理,從block中讀取出每一行的資料會變成乙個個的鍵值對。接下來,讀取出來的資料都會進入記憶體緩衝區,在進入緩衝區之前,每一條資料都會被打上標籤,這個過程叫做分割槽,由分割槽器來完成,預設的...

MapReduce原理及程式設計

二.mapreduce程式設計模型 mapreduce是乙個分布式計算框架 適用於大規模資料處理場景 每個job包含map和reduce兩部分 分而治之 構建抽象模型 map和reduce 隱藏系統層細節 優點 實現 資料定義格式 mapreduce執行過程 必須可序列化 serializableh...