1. 程式人生 > >MapReduce執行過程分析【問題】

MapReduce執行過程分析【問題】

這個是個問題貼,由about雲會員提問。會員答疑。提問和回答都比較有水平,分享出來。

1. MapReduce輸入的時候,會對HDFS上面的檔案進行split,切分的原則是什麼樣子的?假如HDFS預設檔案儲存塊大小是64MB。如果一個129MB的檔案存在HDFS上面,會有三個檔案塊,分別是64MB/64MB/1MB。那麼此時進行切分的時候,是split為幾分?

Hadoop 2.x預設的block大小是128MB,Hadoop 1.x預設的block大小是64MB,可以在hdfs-site.xml中設定dfs.block.size,注意單位是byte。

分片大小範圍可以在mapred-site.xml中設定,mapred.min.split.size mapred.max.split.size,minSplitSize大小預設為1B,maxSplitSize大小預設為Long.MAX_VALUE = 9223372036854775807。【額外說明這裡由於版本更新hadoop2.x後面版本及hadoop3.x mapred.min.split.size更改為mapreduce.input.fileinputformat.split.minsize

     maxSplitSize更改為: mapreduce.job.split.metainfo.maxsize          】

那麼分片到底是多大呢?

minSize=max{minSplitSize,mapred.min.split.size}

maxSize=mapred.max.split.size

splitSize=max{minSize,min{maxSize,blockSize}}

從上面我們看出分片原則:

split分片其實是綜合得來的,並不是固定的,而且他和blocksize是有關係的。

首先還是自己的配置,也就是你配置的分片大小。然後最後得出結果。比如你的

我們再來看一下原始碼

640?wx_fmt=jpeg

所以在我們沒有設定分片的範圍的時候,分片大小是由block塊大小決定的,和它的大小一樣。比如把一個258MB的檔案上傳到HDFS上,假設block塊大小是128MB,那麼它就會被分成三個block塊,與之對應產生三個split,所以最終會產生三個map task。我又發現了另一個問題,第三個block塊裡存的檔案大小隻有2MB,而它的block塊大小是128MB,那它實際佔用Linux file system的多大空間?

答案是實際的檔案大小,而非一個塊的大小。

這裡更加簡潔的總結:
Split的最大值為:max_split

Split的最小值為:min_split

Block的大小:block

切分規則:max(min_split,min(max_split,block)),主要是為了減少網路頻寬。


咱們套用上面的公式:
min_split=1b
max_split=Long.MAX_VALUE = 9223372036854775807

max(1,min(9223372036854775807,64M))
這裡顯然split為64M
既然為64M,那麼64MB/64MB/1MB。那麼此時進行切分的時候,是split為幾分?
應該且分為3份

2. 切分後,是否每一個切分檔案對應一個map任務?

第二個問題,這個比較簡單了

640?wx_fmt=png 

如上圖每一個split,都對應一個map任務


3. 基於1和2兩個問題,是否可以認為:每一個檔案塊對應一個split的檔案,並且對應一個map任務?

第三個問題我們同樣看上圖,一個檔案有很多split,對應多個map任務

4. 每一個MapReduce任務對應幾個map,由什麼決定的某一個MR任務有幾個map任務?

同樣第四個問題:我們還是看上圖,map任務的個數由分片來決定,也就是split決定。當然也可以通過配置JobConf.setNumMapTasks(n),但是如果小於split,不會生效的。大於split才會生效

5. 如果一個MR job有5個map,那麼這5個map是每一個結算節點上一個map任務嗎?還是可以多個map在同一個計算節點上?還是根據hadoop的移動計算的原理而來,資料塊檔案在哪裡,map任務就在哪裡?

這裡針對第五個問題:
首先需要了解yarn整個的流程:
步驟1 使用者向YARN中提交應用程式,其中包括ApplicationMaster程式、啟動ApplicationMaster的命令、使用者程式等。

步驟2 ResourceManager為該應用程式分配第一個Container,並與對應的Node-Manager通訊,要求它在這個Container中啟動應用程式的ApplicationMaster。

步驟3 ApplicationMaster首先向ResourceManager註冊,這樣使用者可以直接通過ResourceManager檢視應用程式的執行狀態,然後它將為各個任務申請資源,並監控它的執行狀態,直到執行結束,即重複步驟4~7。

步驟4 ApplicationMaster採用輪詢的方式通過RPC協議向ResourceManager申請和領取資源。

步驟5 一旦ApplicationMaster申請到資源後,便與對應的NodeManager通訊,要求它啟動任務。

步驟6 NodeManager為任務設定好執行環境(包括環境變數、JAR包、二進位制程式等)後,將任務啟動命令寫到一個指令碼中,並通過執行該指令碼啟動任務。

步驟7 各個任務通過某個RPC協議向ApplicationMaster彙報自己的狀態和進度,以讓ApplicationMaster隨時掌握各個任務的執行狀態,從而可以在任務失敗時重新啟動任務。

     在應用程式執行過程中,使用者可隨時通過RPC向ApplicationMaster查詢應用程式的當前執行狀態。

步驟8 應用程式執行完成後,ApplicationMaster向ResourceManager登出並關閉自己。


##################

我們可以從步驟3和步驟4得知,任務的分配,是由ResourceManager來決定的,由ApplicationMaster申請的。ResourceManager並不是根據舒俱來分配任務,而是根據整體的資源來分配。那麼它分配的原則是什麼?


首先我們需要知道有三種排程策略FIFO、CapacityScheduler、FairScheduler,每個排程策略又是不同的。因為任務分配也是不同的。但是有一個共同特性:計算本地性

本地性有3個級別:NODE_LOCAL、RACK_LOCAL、OFF_SWITCH,分別代表同節點、同機架、跨機架。計算效率會依次遞減。

因為HDFS的多副本,任務應該儘量在選擇block所在的機器上執行,可以減少網路傳輸的消耗。如果開啟了Short-Circuit Read特性,還可以直接讀本地檔案,提高效率。

scheduler能做的只是儘量滿足NODE_LOCAL,儘量避免OFF_SWITCH。計算本地性更多的要AM端配合,當AM拿到資源後,優先分配給NODE_LOCAL的任務。

更多參考
http://jxy.me/2015/04/30/yarn-resource-scheduler/

6. 在每一個map任務中,都對應一個緩衝區,如果緩衝區大於80%,那麼既要將緩衝區的資料,spill溢寫到本地磁碟中。我知道這個本地磁碟不是指HDFS,那麼請問這個本地磁碟是在哪裡?需要在何處配置嗎?

這個其實是shuffle階段,map輸出中間結果,而這個結果需要輸入到reduce。這個80%是中間結果的時候,先放到快取,然後整個緩衝區有個溢寫的比例spill.percent(可以通過屬性Io.sort.spill.percent配置【新版本hadoop3.1已經更新為:mapreduce.map.sort.spill.percent】),這個比例預設是0.8,
640?wx_fmt=png 
地址:
http://hadoop.apache.org/docs/r3 ... /mapred-default.xml

也就是當緩衝區的資料已經達到閾值(buffer size * spill percent = 100MB * 0.8 = 80MB),溢寫執行緒啟動,鎖定這80MB的記憶體,執行溢寫過程。溢寫到哪裡?樓主認為是本地磁碟??個人認為這個是一般來講是寫到hdfs檔案。在哪配置?如上圖,需要在mapred-site.xml檔案中配置

7. 基於6的基礎上,每一個map任務,當它的緩衝區的資料大於80%的時候就溢寫到本地磁碟,如果資料量比較大,那麼這個map任務有可能會發生很多次的溢寫,那麼最後這個map任務執行結束後,會生成N多個溢寫檔案。這些溢寫檔案會最後合併,是合併為一個溢位寫檔案?還是多個?如果多個是由什麼決定的?需要在哪裡配置嗎?

這些溢寫檔案最終會合併為一個檔案。這個過程就叫做Merge。Merge是怎樣的?如前面的例子,“aaa”從某個map task讀取過來時值是5,從另外一個map 讀取時值是8,因為它們有相同的key,所以得merge成group。什麼是group。對於“aaa”就是像這樣的:{“aaa”, [5, 8, 2, …]},陣列中的值就是從不同溢寫檔案中讀取出來的,然後再把這些值加起來。請注意,因為merge是將多個溢寫檔案合併到一個檔案,所以可能也有相同的key存在,在這個過程中如果client設定過Combiner,也會使用Combiner來合併相同的key。 

關注:

長按/掃描二維碼 ,後臺回覆關鍵詞:獲取各種最新技術,和資源

640?wx_fmt=jpeg

about雲新上課程:歡迎加微信w3aboutyun諮詢,保證大家學會

大資料日誌實時分析

http://www.aboutyun.com/forum.php?mod=viewthread&tid=22431

轉載註明本文連結

http://www.aboutyun.com/forum.php?mod=viewthread&tid=24379