tft每日頭條

 > 圖文

 > mapreduce分為幾個階段

mapreduce分為幾個階段

圖文 更新时间:2025-02-05 10:48:13

今天抽時間又重新整體複習了下mapreduce在各個階段的執行過程,感覺每一次學習都會有更大的收獲,今天就把我學習到的東西全都和大家一起分享出來,方便自己梳理知識和記憶的同時,也希望能給其他小夥伴帶來收獲!每天進步一點點!

mapreduce分為幾個階段(各個階段做了什麼)1

一.什麼是MapReduce

MapReduce是一種編程模型,用于大規模數據集(大于1TB)的并行運算。概念"Map(映射)"和"Reduce(歸約)",是它們的主要思想,都是從函數式編程語言裡借來的,還有從矢量編程語言裡借來的特性。它極大地方便了編程人員在不會分布式并行編程的情況下,将自己的程序運行在分布式系統上。 當前的軟件實現是指定一個Map(映射)函數,用來把一組鍵值對映射成一組新的鍵值對,指定并發的Reduce(歸約)函數,用來保證所有映射的鍵值對中的每一個共享相同的鍵組。

MapReduce的核心思想是“分而治之,先分後合”,即将一個大的、複雜的工作或任務,拆分成多個小的任務,并行處理,最終進行合并==。适用于大量複雜的、時效性不高的任務處理場景(大規模離線數據處理場景)。其中Map階段就是分,Reduce階段是合。

map:以一條記錄為單位做映射~!主要做映射,變換,過濾,1進N出(進來1條記錄出去N條記錄)

reduce:以一組(相同Key數據為一組)為單位做計算~!主要做分解,縮小,歸納,一組進N出(進來一組記錄出去N條記錄)

map與reduce之間的銜接:鍵值對(Key,Value)

Key,Value):由map映射實現,鍵值對的鍵劃分數據分組

mapreduce分為幾個階段(各個階段做了什麼)2

mapreduce簡單的過程

二.MapReduce運行過程

1.MapReduce大緻運行過程

mapreduce分為幾個階段(各個階段做了什麼)3

MapReduce的大緻運行過程

MapReduce分為Map階段和Reduce階段,從上圖中可以看出所有Map任務完成後才可以進行Reduce階段,Reduce的輸入來自于Map的輸出,兩者之間是有依賴的,不是并行關系。

3個split(分片)是可以并行運行的,代表3個map任務,一個切片對應一個map計算,默認情況下,以HDFS的一個塊(block)的大小(默認128M)為一個分片。

那麼思考一下,為什麼不直接用一個block直接對應一個map計算?而是要在加一個split呢?

這就是在軟件工程學當中經常提到的加一層解耦,block塊的大小是固定的,split的大小默認情況下等于block塊的大小,當然我們也是可以根據自己的需求來設置split的大小,可以大于塊大小,也可以小于塊大小,這樣就可以滿足未來不同項目組的不同需求了,用起來相當靈活了。

可以看出,map的個數(并行度)是由split的數量決定的,每個split對應一個map計算,默認情況下,一個split就是一個塊,split是可以複用block偏移量,大小,location信息的,split可以根據block的location相關信息來找到對應副本的機器,然後map程序可以移動到相應的機器上進行計算,很好的實現了計算向數據移動的語義。

接下來介紹下分組和分區的概念:

分組:将相同key的value進行合并,key相等的話,将分到同一個組裡面

分區:決定當前的key交給哪個reduce進行處理,默認情況下,根據key的hash值,對reduce個數取餘

Reduce的階段也可以設置多個reduce任務來計算,一個分區由一個reduce任務處理,每個reduce任務可以計算同一分組或多組中的數據。也就是說一個分區包含一個組或多個組中的數據。相同組的數據是不可切割開的,如果切開了,計算結果是不準确的。如果一個reduce任務中有多個組,那麼需要開啟多個線程來處理不同組中的數據,

reduce的個數(并行度)由人來決定,可以根據不同需求自己手動設置。

2.MapReduce一個map,reduce階段的詳細過程

mapreduce分為幾個階段(各個階段做了什麼)4

一個MapReduce的詳細過程

如上圖所示,MapReduce整體分為Map端任務和Reduce端任務,整個MapReduce程序又分為如下5個階段。

input

首先讀取HDFS上的文件,分出若幹個分片(split),split會将文件内容格式化為記錄,以記錄為單位調用map方法,每一條記錄都會調用一次map方法。

map

經過map方法後,map的輸出映射為key,value,key,value會參與分區計算,拿着key算出分區号(根據key的hash值,對reduce個數取餘),最終map輸出key,value,分區(partition)。

shuffle:即為洗牌(包括Map端shuffle和Reduce端shuffle)***重要階段****

maptask的輸出是一個文件(中間數據集),存在本地的文件系統中,也就是說中間數據集并不是存放到HDFS中的。假設這個文件中有50000條記錄,那麼如何将這50000條記錄放到本地文件系統中呢?是要每産出一條就寫一條嗎?内存進程和磁盤多次進行切換,這樣速度會很慢,此時就會出現一個環形内存緩沖區(默認大小為100M)

1.map端的shuffle

(1)溢寫(spill

每個map處理之後的結果将會進入環形緩沖區。内存緩沖區是有大小限制的,默認是100MB。當map task的輸出結果很多時,就可能會撐爆内存,所以需要在一定條件下将緩沖區中的數據臨時寫入磁盤,然後重新利用這塊緩沖區。這個從内存往磁盤寫數據的過程被稱為spill,中文可理解為溢寫。溢寫是由單獨線程來完成,不影響往緩沖區寫map結果的線程。溢寫線程啟動時不應該阻止map的結果輸出,所以整個緩沖區有個溢寫的比例spill.percent。比例默認是0.8,也就是當緩沖區的數據值已經達到阈值(buffer size * spill percent = 100MB * 0.8 = 80MB),溢寫線程啟動,鎖定這80MB的内存,執行溢寫過程。map task的輸出結果還可以往剩下的20MB内存中寫,互不影響。

(2)排序

當溢寫線程啟動後,需要對這80MB空間内的分區,key做排序(sort)。需要做一個2次排序,分區有序,且分區内key有序,保證未來相同一組key會相鄰的排在一起。

(3)往磁盤溢寫數據

當環形緩沖區達到阈值80%,開始将分區排序後的數據溢寫磁盤變成文件,每次溢寫會在磁盤上生成一個溢寫文件,如果map的輸出結果真的很大,有多次這樣的溢寫發生,磁盤上相應的就會有多個溢寫文件存在。最終會産生多個小文件。

(4)merge合并

将spill生成的小文件進行合并,将多個溢寫文件合并到一個文件,上面的每個小文件都是内部有序,外部無序的,所以在合并時做一個歸并排序來達到合并後的文件是有序的。

map task結束,通過appmaster,appmaster通過reduce過來拉取數據。

2.reduce的shuffle:

(1)copy過程

簡單地拉取數據。Reduce進程啟動一些數據copy線程(Fetcher),通過http方式請求map task所在的TaskTracker獲取map task的輸出文件。因為map task早已結束,這些文件就歸TaskTracker管理在本地磁盤中

(2)merge合并

将每個map task的結果中屬于自己分區的數據進行合并,同樣做歸并排序,使得相同分區的數據的key是有序的copy過來的數據會先放入内存緩沖區中,這裡的緩沖區大小要比map端更為靈活,它基于JVM的heap size設置,因為Shuffle階段Reducer不運行,所以應該把絕大部分的内存都給Shuffle使用

reduce

将合并後的數據f直接輸入到reduce函數,進行相關計算,産出最終結果。

output

将最終結果存放到HDFS上。

分析了MapReduce的運行過程,可以發現MapReduce都是反複地執行排序,合并操作,現在終于明白了有些人為什麼會說:排序是hadoop的靈魂

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关圖文资讯推荐

热门圖文资讯推荐

网友关注

Copyright 2023-2025 - www.tftnews.com All Rights Reserved