淺析Hadoop(二)之MapReduce

淺析Hadoop(二)之MapReduce


1.經典的mapreduce工作原理
1)提交作業,job提交時,client向jobtracker請求一個新的作業id,檢查作業的輸出目錄,如果沒有指定或者已經存在,就會拋出異常。如果檢查通過,開始計算作業的輸入分片,將運行作業所需要資源複製到一個以作業id命名的目錄下jobtracker的文件系統中,然後告知jobtracker作業準備執行。
2)當jobtracker接收到client對其submit方法的調用後,會將此調用放入一個內部隊列中,由調度器進行調度,並對其進行初始化。初始化作業就是創建一個作業的對象用來封裝任務和記錄信息,以便跟蹤任務的狀態和進程。作業調度器首先從共享文件系統中獲取client已經計算好的輸入分片,併爲每個分片創建一個map任務,並根據job配置的reduce個數來創建reduce任務。
3)由調度器分配任務給tasktracker之後,tasktracker通過從共享文件系統把作業的jar文件複製到本地,同時,tasktracker將應用程序所需要的全部文件從分佈式緩存複製到本地磁盤,tasktracker爲任務新建一個本地工作目錄,並把jar文件中的內容解釋到這個目錄下,最後tasktracker新建一個taskRunner實例來運行該任務。
4)作業在執行過程中,Tasktracker每隔幾秒向jobtracker發送一次“心跳”,tasktracker會將當前任務執行的狀態發送給jobtracker,jobtracker將所有tasktracker發送的狀態合併起來,產生一個表明所有運行作業及其所含任務狀態的全局視圖。Client通過查詢jobtracker就可以看到當前作業執行的進度。

5)當jobtracker收到作業的最後一個任務執行結束的信息後,將作業狀態設置爲成功,然後從waitForCompletion方法返回,最後jobtracker清空作業的工作狀態,並指示tasktracker清空所有的中間結果。


2.YARN的工作原理
     1)作業的提交和mapreduce1的機制是相同的
2)當ResourceManager接收到job的提交請求後,將請求發送給調度器,調度器會分配一個container容器,然後在ResourceManager和 NodeManager的管理下在容器中啓動master進程。Application master是一個java應用程序,主類爲MRAppMaster,由master對作業進行初始化。
3)Master爲map和reduce任務向ResourceManager請求容器,請求信息中包括了map任務的數據本地化信息,輸入分片所在的主機和相應的機架信息。調度器通過這些信息調度任務。
4)一旦ResourceManager爲任務分配了容器,master就通過與nodemanager的通信來啓動容器,在執行任務之前,先將任務所需要的jar文件,配置文件等等資源加載到本地。

5)任務每隔3秒向master彙報進度和狀態,知道作業完成,application master清空作業的中間結果。


3.MapReduce框架和YARN框架的區別
1)mapreduce框架是爲hadoop1.x的mapreduce作業量身定製的,其上只能運行mapreduce任務,而hadoop2.x中的YARN框架比經典的mapreduce框架更加具有一般性,mapreduce作業只是yarn應用的一種,比如spark也可以在yarn框架上運行

2)mapreduce1的jobtracker負責作業調度和任務進度監視,追蹤任務,重啓失敗任務等等,因此主節點的配置就會成爲集羣的瓶頸。Yarn框架將這些職能劃分爲多個獨立的實體,分別由ResourceManager中的調度器來負責作業的調度,由MRAppMaster負責爲map和reduce任務向resource manager申請資源(container),並監控任務的進度和狀態。


4.YARN框架各個實體的作用
       1)resource manager RM,負責所有應用程序計算資源的分配(container)
2)application master AM,負責相應的任務調度和協調
3)containers,每一個任務對應一個container,並且只能在container中執行
4)nodemanager,管理每個節點上的資源和任務,定期向RM彙報該節點的資源佔用情況和各個container的狀 態,接收和處理AM的任務自動和停止請求。



5.mapreduce任務的核心shuffle機制
      首先說一下什麼叫做shuffle,將map端的輸出作爲輸入傳給reduce端稱爲shuffle。
下面說一下shuffle是如何工作的:
Map端:
Map任務接收輸入分片,調用map方法,每個map任務都有一個環形內存緩衝區用於存儲map的輸出,默認 大小是100M,可以通過io.sort.mb屬性來配置,一旦緩衝區的內容達到閾值,默認0.8 。一個後臺線程便開始把 內容溢寫到磁盤,在寫磁盤之前,線程首先根據數據最終要傳的reduce把數據進行分區,默認按照key的hash算 法。在溢寫磁盤的過程中,map輸出還是繼續寫入緩衝區,但如果溢寫期間,緩衝區被寫滿,map會被阻塞直到 寫磁盤過程完成。每次內存緩衝區達到閾值就會新建一個溢出文件。在任務完成之前將所有的溢出文件合併爲一 個以分區且已排序的輸出文件。
Reduce端:

Map任務的輸出保存在nodemanager的本地磁盤,reduce任務需要集羣上若干個map任務的輸出結果,每 個map任務的完成時間不同,所以只要有一個map任務執行結束,reduce端就開始複製其輸出文件,這就是r educe端的複製階段。複製完所有的map輸出結果文件之後,reduce任務進入merge階段,這個階段合併map輸 出,維持其順序排序,最後將數據輸入到reduce函數中進行處理,輸出結果寫入hdfs中。


6.reduce是如何取得map的輸出的?

只要有一個map任務執行結束,任務直接通知master,master就可以請求nodemanager啓動reduce任務,reduce任務定期詢問master,map輸出結果與其節點位置的映射關係,從而得知map輸出結果的位置,進而執行reduce任務。


7.對於shuffle過程的調優思路和配置方法。

在map端,通過避免多次溢出寫磁盤過程來提高性能,一次是最佳性能,因爲磁盤io對於性能的影響非常大,如果多次進行磁盤io操作,那麼對於性能的影響顯而易見。合理的設置io.sort.mb屬性儘可能的減少溢寫次數。該屬性是配置map任務之後的環形內存緩衝區的大小,只要改緩衝區的大小足夠存儲map的輸出結果,那麼只進行一次溢寫操作,就能獲取最佳性能。
在reduce端,中間數據存入內存可以獲取最佳的性能,默認是不可能的,因爲所有的內存都是預留給reduce函數的,如果reduce函數的內存需求不大,設置將map輸出結果全部存在內存中,就可以提升性能,具體配置查詢官方文檔。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章