Apache Hadoop是一個開源軟件框架,可安裝在一個商用機器集群中,使機器可彼此通信并協(xié)同工作,以高度分布式的方式共同存儲和處理大量數(shù)據(jù)。最初,Hadoop 包含以下兩個主要組件: Hadoop Distributed File System (HDFS) 和一個分布式計算引擎,該引擎支持以 MapReduce 作業(yè)的形式實現(xiàn)和運行程序。 MapReduce 是 Google 推廣的一個簡單的編程模型,它對以高度并行和可擴展的方式處理大數(shù)據(jù)集很有用。MapReduce 的靈感來源于函數(shù)式編程,用戶可將他們的計算表達為 Map和 Reduce 函數(shù),將數(shù)據(jù)作為鍵值對來處理。Hadoop 提供了一個高級 API 來在各種語言中實現(xiàn)自定義的 Map和 Reduce 函數(shù)。 Hadoop 還提供了軟件基礎(chǔ)架構(gòu),以一系列Map和 Reduce 任務(wù)的形式運行 MapReduce 作業(yè)。Map任務(wù) 在輸入數(shù)據(jù)的子集上調(diào)用 Map函數(shù)。在完成這些調(diào)用后,Reduce任務(wù) 開始在 map 函數(shù)所生成的中間數(shù)據(jù)上調(diào)用 Reduce 任務(wù),生成最終的輸出。Map和Reduce 任務(wù)彼此單獨運行,這支持并行和容錯的計算。 最重要的是,Hadoop 基礎(chǔ)架構(gòu)負責(zé)處理分布式處理的所有復(fù)雜方面:并行化、調(diào)度、資源管理、機器間通信、軟件和硬件故障處理,等等。得益于這種干凈的抽象,實現(xiàn)處理數(shù)百(或者甚至數(shù)千)個機器上的數(shù) TB 數(shù)據(jù)的分布式應(yīng)用程序從未像現(xiàn)在這么容易過,甚至對于之前沒有使用分布式系統(tǒng)的經(jīng)驗的開發(fā)人員也是如此。 MR 架構(gòu) Map Reduce 過程圖 將任務(wù)分割為Map端和Reduce 端,下圖是JobClient、JobTracker和TaskTracker架構(gòu)。
Shuffle Combine 整體的 Shuffle 過程包含以下幾個部分: Map端Shuffle、Sort階段、Reduce端 Shuffle。即是說: Shuffle過程橫跨 Map 和 Reduce兩端,中間包含 Sort 階段,就是數(shù)據(jù)從 map task 輸出到 Reduce task 輸入的這段過程。Sort、Combine是在 Map端的,Combine是提前的Reduce,需要自己設(shè)置。 Hadoop集群中,大部分Map Task 與 Reduce Task 的執(zhí)行是在不同的節(jié)點上。當(dāng)然很多情況下 Reduce 執(zhí)行時需要跨節(jié)點去拉取其它節(jié)點上的 Map Task 結(jié)果。如果集群正在運行的Job 有很多,那么Task 的正常執(zhí)行對集群內(nèi)部的網(wǎng)絡(luò)資源消耗會很嚴(yán)重。而對于必要的網(wǎng)絡(luò)資源消耗,最終的目的就是最大化地減少不必要的消耗。還有在節(jié)點內(nèi),相比于內(nèi)存,磁盤IO對Job完成時間的影響也是可觀的。從最基本的要求來說,對于MapReduce的Job性能調(diào)優(yōu)的Shuffle 過程,目標(biāo)期望可以有: 完整地從Map Task 端拉取數(shù)據(jù)到Reduce 端。在跨節(jié)點拉取數(shù)據(jù)時,盡可能地減少對帶寬的不必要消耗。減少磁盤IO對Task 執(zhí)行的影響。 總體來講這段Shuffle 過程,能優(yōu)化的地方主要在于減少拉取數(shù)據(jù)的量及盡量使用內(nèi)存而不是磁盤。 Map Shuffle 1、輸入 在Map Task執(zhí)行時,其輸入來源HDFS 的Block,Map Task只讀取Split。Split 與Block 的對應(yīng)關(guān)系可能是多對一,默認為一對一。 2、切分 然后將數(shù)據(jù)寫入內(nèi)存緩沖區(qū)中,緩沖區(qū)的作用是批量收集Map 結(jié)果,減少磁盤 IO 的影響。Key/Value 對以及Partition 的結(jié)果都會被寫入緩沖區(qū)。寫入之前,Key與Value 值都會被序列化成字節(jié)數(shù)組。 3、溢寫 這個溢寫是由另外單獨線程來完成,不影響往緩沖區(qū)寫Map結(jié)果的線程。整個緩沖區(qū)有個溢寫的比例spill.percent。這個比例默認是0.8, Combiner 將有相同Key的Key/Value對加起來,減少溢寫 spill 到磁盤的數(shù)據(jù)量。Combiner 的適用場景: 由于Combiner的輸出是Reducer的輸入,Combiner 絕不能改變最終的計算結(jié)果。故大多數(shù)情況下,Combiner 適用于輸入輸出的 key/value 類型完全一致,且不影響最終結(jié)果的場景(比如累加、最大值等)。 Merge Map很大時,每次溢寫會產(chǎn)生一個spill_file,這樣會有多個spill_file,而最終的輸出只有一個文件,在最終輸出之前會對多個中間過程多次產(chǎn)生的溢寫文件 spill_file 進行合并,此過程就是Merge。 Merge 就是把相同Key 的結(jié)果加起來(當(dāng)然,如果設(shè)置過Combiner,也會使用 combiner 來合并相同的Key)。 Reduce Shuffle 在Reduce Task 之前,不斷拉取當(dāng)前Job 里每個Maptask的最終結(jié)果,然后對從不同地方拉取過來的數(shù)據(jù)不斷地做Merge ,也最終形成一個文件作為Reduce Task 的輸入文件。 1、Copy Reduce進程啟動一些數(shù)據(jù)copy 線程 (Fetcher),通過HTTP方式請求map task 所在的 TaskTracker 獲取map task 的輸出文件。因為 maptask 早已結(jié)束,這些文件就歸 TaskTracker 管理在本地磁盤中。 2、Merge Copy 過來的數(shù)據(jù)會先放入內(nèi)存緩沖區(qū)中,這里的緩沖區(qū)大小要比 map 端的更為靈活,它基于JVM的 heap size設(shè)置,因為Shuffle 階段 Reducer不運行,所以應(yīng)該把絕大部分的內(nèi)存都給 Shuffle 用。這里需要強調(diào)的是,Merge有三種形式:
默認情況下第一種形式不啟用,讓人比較困惑,是吧。當(dāng)內(nèi)存中的數(shù)據(jù)量到達一定閾值,就啟動內(nèi)存到磁盤的Merge 。與Map端類似,這也是溢寫的過程,這個過程中如果你設(shè)置有Combiner,也是會啟用的,然后在磁盤中生成了眾多的溢寫文件。第二種Merge 方式一直在運行,直到?jīng)]有Map 端的數(shù)據(jù)時才結(jié)束,然后啟動第三種磁盤到磁盤的Merge 方式生成最終的那個文件。 3、Reducer的輸入 Merge 的最后會生成一個文件,大多數(shù)情況下存在于磁盤中,但是需要將其放入內(nèi)存中。當(dāng)Reducer輸入文件已定,整個Shuffle 階段才算結(jié)束。然后就是 Reducer 執(zhí)行,把結(jié)果放到 HDFS 上。 YARN YARN(Yet Another Resource Negotiator)是下一代 MapReduce框架的名稱,為了容易記憶,一般稱為MR v2。該框架已經(jīng)不再是一個傳統(tǒng)的MapReduce 框架,甚至與 MapReduce 無關(guān),她是一個通用的運行時框架,用戶可以編寫自己的計算框架,在該運行環(huán)境中運行。用于自己編寫的框架作為客戶端的一個lib,在運用提交作業(yè)時打包即可。 MR的缺點(YARN取代MR) 經(jīng)典 MapReduce 的最嚴(yán)重的限制主要關(guān)系到可伸縮性、資源利用和對與 MapReduce 不同的工作負載的支持。在 MapReduce 框架中,作業(yè)執(zhí)行受兩種類型的進程控制: 一個稱為JobTracker 的主要進程,它協(xié)調(diào)在集群上運行的所有作業(yè),分配要在 TaskTracker上運行的Map和Reduce 任務(wù)。 許多稱為TaskTracker 的下級進程,它們運行分配的任務(wù)并定期向 JobTracker報告進度。 大型的Hadoop 集群顯現(xiàn)出了由單個JobTracker 導(dǎo)致的可伸縮性瓶頸。
MapReduce框架的不足 JobTracker是集群事務(wù)的集中處理點,存在單點故障。JobTracker 需要完成的任務(wù)太多,既要維護 job 的狀態(tài)又要維護 job 的 task 的狀態(tài),造成過多的資源消耗。 在TaskTracker 端,用Map/Reduce Task 作為資源的表示過于簡單,沒有考慮到 CPU、內(nèi)存等資源情況,當(dāng)把兩個需要消耗大內(nèi)存的 task 調(diào)度到一起,很容易出現(xiàn)OOM。 把資源強制劃分為Map/Reduce Slot, 當(dāng)只有Map Task 時,Reduce Slot不能用;當(dāng)只有Reduce Task 時,Map Slot 不能用,容易造成資源利用不足。 解決可伸縮性問題 在 Hadoop MapReduce中,JobTracker具有兩種不同的職責(zé)。管理集群中的計算資源,這涉及到維護活動節(jié)點列表、可用和占用的Map 和Reduce Slots 列表,以及依據(jù)所選的調(diào)度策略將可用 slots 分配給合適的作業(yè)和任務(wù) 協(xié)調(diào)在集群上運行的所有任務(wù),這涉及到指導(dǎo)TaskTracker 啟動Map和 Reduce 任務(wù),監(jiān)視任務(wù)的執(zhí)行,重新啟動失敗的任務(wù),推測性地運行緩慢的任務(wù),計算作業(yè)計數(shù)器值的總和等等。 為單個進程安排大量職責(zé)會導(dǎo)致重大的可伸縮性問題,尤其是在較大的集群上,JobTracker 必須不斷跟蹤數(shù)千個 TaskTracker、數(shù)百個作業(yè),以及數(shù)萬個 map 和 reduce 任務(wù)。相反,TaskTracker 通常近運行十來個任務(wù),這些任務(wù)由勤勉的JobTracker 分配給它們。 為了解決可伸縮性問題,一個簡單而又絕妙的想法應(yīng)運而生: 我們減少了單個 JobTracker 的職責(zé),將部分職責(zé)委派給TaskTracker,因為集群中有許多 TaskTracker。在新設(shè)計中,這個概念通過將 JobTracker 的雙重職責(zé)(集群資源管理和任務(wù)協(xié)調(diào))分開為兩種不同類型的進程來反映。 YARN的優(yōu)點
一個全局 ResourceManager以主要后臺進程的形式運行,它通常在專用機器上運行,在各種競爭的應(yīng)用程序之間仲裁可用的集群資源。
作者: HarperKoo |
|
來自: 快讀書館 > 《信息技術(shù)》