YARN:下一代 Hadoop計(jì)算平臺(tái)
Apache Hadoop 是最流行的大數(shù)據(jù)處理工具之一。它多年來被許多公司成功部署在生產(chǎn)中。盡管 Hadoop 被視為可靠的、可擴(kuò)展的、富有成本效益的解決方案,但大型開發(fā)人員社區(qū)仍在不斷改進(jìn)它。最終,2.0 版提供了多項(xiàng)革命性功能,其中包括 Yet Another Resource Negotiator (YARN)、HDFS Federation 和一個(gè)高度可用的 NameNode,它使得 Hadoop 集群更加高效、強(qiáng)大和可靠。在本文中,將對 YARN 與 Hadoop 中的分布式處理層的以前版本進(jìn)行比較,了解 YARN 所帶來的優(yōu)勢。
簡介
Apache Hadoop 2.0 包含 YARN,它將資源管理和處理組件分開?;?YARN 的架構(gòu)不受 MapReduce 約束。本文將介紹 YARN,以及它相對于 Hadoop 中以前的分布式處理層的一些優(yōu)勢。本文將了解如何使用 YARN 的可伸縮性、效率和靈活性增強(qiáng)您的集群。
Apache Hadoop 簡介
Apache Hadoop 是一個(gè)開源軟件框架,可安裝在一個(gè)商用機(jī)器集群中,使機(jī)器可彼此通信并協(xié)同工作,以高度分布式的方式共同存儲(chǔ)和處理大量數(shù)據(jù)。最初,Hadoop 包含以下兩個(gè)主要組件:Hadoop Distributed File System (HDFS) 和一個(gè)分布式計(jì)算引擎,該引擎支持以 MapReduce 作業(yè)的形式實(shí)現(xiàn)和運(yùn)行程序。
MapReduce 是 Google 推廣的一個(gè)簡單的編程模型,它對以高度并行和可擴(kuò)展的方式處理大數(shù)據(jù)集很有用。MapReduce 的靈感來源于函數(shù)式編程,用戶可將他們的計(jì)算表達(dá)為 map 和 reduce 函數(shù),將數(shù)據(jù)作為鍵值對來處理。Hadoop 提供了一個(gè)高級 API 來在各種語言中實(shí)現(xiàn)自定義的 map 和 reduce 函數(shù)。
Hadoop 還提供了軟件基礎(chǔ)架構(gòu),以一系列 map 和 reduce 任務(wù)的形式運(yùn)行 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ù)彼此單獨(dú)運(yùn)行,這支持并行和容錯(cuò)的計(jì)算。
最重要的是,Hadoop 基礎(chǔ)架構(gòu)負(fù)責(zé)處理分布式處理的所有復(fù)雜方面:并行化、調(diào)度、資源管理、機(jī)器間通信、軟件和硬件故障處理,等等。得益于這種干凈的抽象,實(shí)現(xiàn)處理數(shù)百(或者甚至數(shù)千)個(gè)機(jī)器上的數(shù) TB 數(shù)據(jù)的分布式應(yīng)用程序從未像現(xiàn)在這么容易過,甚至對于之前沒有使用分布式系統(tǒng)的經(jīng)驗(yàn)的開發(fā)人員也是如此。
Hadoop 的黃金時(shí)代
盡管 MapReduce 模型存在著多種開源實(shí)現(xiàn),但 Hadoop MapReduce 很快就變得非常流行。Hadoop 也是全球最令人興奮的開源項(xiàng)目之一,它提供了多項(xiàng)出色的功能:高級 API、近線性的可伸縮性、開源許可、在商用硬件上運(yùn)行的能力,以及容錯(cuò)。它已獲得數(shù)百(或許已達(dá)數(shù)千)個(gè)公司的成功部署,是大規(guī)模分布式存儲(chǔ)和處理的最新標(biāo)準(zhǔn)。
一些早期的 Hadoop 采用者,比如 Yahoo! 和 Facebook,構(gòu)建了包含 4,000 個(gè)節(jié)點(diǎn)的大型集群,以滿足不斷增長和變化的數(shù)據(jù)處理需求。但是,在構(gòu)建自己的集群后,他們開始注意到了 Hadoop MapReduce 框架的一些局限性。
經(jīng)典 MapReduce 的局限性
經(jīng)典 MapReduce 的最嚴(yán)重的限制主要關(guān)系到可伸縮性、資源利用和對與 MapReduce 不同的工作負(fù)載的支持。在 MapReduce 框架中,作業(yè)執(zhí)行受兩種類型的進(jìn)程控制:
一個(gè)稱為 JobTracker 的主要進(jìn)程,它協(xié)調(diào)在集群上運(yùn)行的所有作業(yè),分配要在 TaskTracker 上運(yùn)行的 map 和 reduce 任務(wù)。
許多稱為 TaskTracker 的下級進(jìn)程,它們運(yùn)行分配的任務(wù)并定期向 JobTracker 報(bào)告進(jìn)度。
Apache Hadoop 的經(jīng)典版本 (MRv1)
該圖顯示了 Apache Hadoop 的經(jīng)典版本 (MRv1)
大型的 Hadoop 集群顯現(xiàn)出了由單個(gè) JobTracker 導(dǎo)致的可伸縮性瓶頸。依據(jù) Yahoo!,在集群中有 5,000 個(gè)節(jié)點(diǎn)和 40,000 個(gè)任務(wù)同時(shí)運(yùn)行時(shí),這樣一種設(shè)計(jì)實(shí)際上就會(huì)受到限制。由于此限制,必須創(chuàng)建和維護(hù)更小的、功能更差的集群。
此外,較小和較大的 Hadoop 集群都從未最高效地使用他們的計(jì)算資源。在 Hadoop MapReduce 中,每個(gè)從屬節(jié)點(diǎn)上的計(jì)算資源由集群管理員分解為固定數(shù)量的 map 和 reduce slot,這些 slot 不可替代。設(shè)定 map slot 和 reduce slot 的數(shù)量后,節(jié)點(diǎn)在任何時(shí)刻都不能運(yùn)行比 map slot 更多的 map 任務(wù),即使沒有 reduce 任務(wù)在運(yùn)行。這影響了集群的利用率,因?yàn)樵谒?map slot 都被使用(而且我們還需要更多)時(shí),我們無法使用任何 reduce slot,即使它們可用,反之亦然。
最后但同樣重要的是,Hadoop 設(shè)計(jì)為僅運(yùn)行 MapReduce 作業(yè)。隨著替代性的編程模型(比如 Apache Giraph 所提供的圖形處理)的到來,除 MapReduce 外,越來越需要為可通過高效的、公平的方式在同一個(gè)集群上運(yùn)行并共享資源的其他編程模型提供支持。
2010 年,Yahoo! 的工程師開始研究一種全新的 Hadoop 架構(gòu),用這種架構(gòu)來解決上述所有限制并增加多種附加功能。
解決可伸縮性問題
在 Hadoop MapReduce 中,JobTracker 具有兩種不同的職責(zé):
- 管理集群中的計(jì)算資源,這涉及到維護(hù)活動(dòng)節(jié)點(diǎn)列表、可用和占用的 map 和 reduce slots 列表,以及依據(jù)所選的調(diào)度策略將可用 slots 分配給合適的作業(yè)和任務(wù)
- 協(xié)調(diào)在集群上運(yùn)行的所有任務(wù),這涉及到指導(dǎo) TaskTracker 啟動(dòng) map 和 reduce 任務(wù),監(jiān)視任務(wù)的執(zhí)行,重新啟動(dòng)失敗的任務(wù),推測性地運(yùn)行緩慢的任務(wù),計(jì)算作業(yè)計(jì)數(shù)器值的總和,等等
為單個(gè)進(jìn)程安排大量職責(zé)會(huì)導(dǎo)致重大的可伸縮性問題,尤其是在較大的集群上,JobTracker 必須不斷跟蹤數(shù)千個(gè) TaskTracker、數(shù)百個(gè)作業(yè),以及數(shù)萬個(gè) map 和 reduce 任務(wù)。下圖演示了這一問題。相反,TaskTracker 通常近運(yùn)行十來個(gè)任務(wù),這些任務(wù)由勤勉的 JobTracker 分配給它們。
大型 Apache Hadoop 集群 (MRv1) 上繁忙的 JobTracker
該圖顯示了大型 Apache Hadoop 集群 (MRv1) 上繁忙的 JobTracker
為了解決可伸縮性問題,一個(gè)簡單而又絕妙的想法應(yīng)運(yùn)而生:我們減少了單個(gè) JobTracker 的職責(zé),將部分職責(zé)委派給 TaskTracker,因?yàn)榧褐杏性S多 TaskTracker。在新設(shè)計(jì)中,這個(gè)概念通過將 JobTracker 的雙重職責(zé)(集群資源管理和任務(wù)協(xié)調(diào))分開為兩種不同類型的進(jìn)程來反映。
不再擁有單個(gè) JobTracker,一種新方法引入了一個(gè)集群管理器,它惟一的職責(zé)就是跟蹤集群中的活動(dòng)節(jié)點(diǎn)和可用資源,并將它們分配給任務(wù)。對于提交給集群的每個(gè)作業(yè),會(huì)啟動(dòng)一個(gè)專用的、短暫的 JobTracker 來控制該作業(yè)中的任務(wù)的執(zhí)行。有趣的是,短暫的 JobTracker 由在從屬節(jié)點(diǎn)上運(yùn)行的 TaskTracker 啟動(dòng)。因此,作業(yè)的生命周期的協(xié)調(diào)工作分散在集群中所有可用的機(jī)器上。得益于這種行為,更多工作可并行運(yùn)行,可伸縮性得到了顯著提高。
ARN:下一代 Hadoop 計(jì)算平臺(tái)
我們現(xiàn)在稍微改變一下用辭。以下名稱的改動(dòng)有助于更好地了解 YARN 的設(shè)計(jì):
- ResourceManager 代替集群管理器
- ApplicationMaster 代替一個(gè)專用且短暫的 JobTracker
- NodeManager 代替 TaskTracker
- 一個(gè)分布式應(yīng)用程序代替一個(gè) MapReduce 作業(yè)
YARN 是下一代 Hadoop 計(jì)算平臺(tái),如下所示。
該圖顯示了 YARN 的架構(gòu)
在 YARN 架構(gòu)中,一個(gè)全局 ResourceManager 以主要后臺(tái)進(jìn)程的形式運(yùn)行,它通常在專用機(jī)器上運(yùn)行,在各種競爭的應(yīng)用程序之間仲裁可用的集群資源。ResourceManager 會(huì)追蹤集群中有多少可用的活動(dòng)節(jié)點(diǎn)和資源,協(xié)調(diào)用戶提交的哪些應(yīng)用程序應(yīng)該在何時(shí)獲取這些資源。ResourceManager 是惟一擁有此信息的進(jìn)程,所以它可通過某種共享的、安全的、多租戶的方式制定分配(或者調(diào)度)決策(例如,依據(jù)應(yīng)用程序優(yōu)先級、隊(duì)列容量、ACLs、數(shù)據(jù)位置等)。
在用戶提交一個(gè)應(yīng)用程序時(shí),一個(gè)稱為 ApplicationMaster 的輕量型進(jìn)程實(shí)例會(huì)啟動(dòng)來協(xié)調(diào)應(yīng)用程序內(nèi)的所有任務(wù)的執(zhí)行。這包括監(jiān)視任務(wù),重新啟動(dòng)失敗的任務(wù),推測性地運(yùn)行緩慢的任務(wù),以及計(jì)算應(yīng)用程序計(jì)數(shù)器值的總和。這些職責(zé)以前分配給所有作業(yè)的單個(gè) JobTracker。ApplicationMaster 和屬于它的應(yīng)用程序的任務(wù),在受 NodeManager 控制的資源容器中運(yùn)行。
NodeManager 是 TaskTracker 的一種更加普通和高效的版本。沒有固定數(shù)量的 map 和 reduce slots,NodeManager 擁有許多動(dòng)態(tài)創(chuàng)建的資源容器。容器的大小取決于它所包含的資源量,比如內(nèi)存、CPU、磁盤和網(wǎng)絡(luò) IO。目前,僅支持內(nèi)存和 CPU (YARN-3)。未來可使用 cgroups 來控制磁盤和網(wǎng)絡(luò) IO。一個(gè)節(jié)點(diǎn)上的容器數(shù)量,由配置參數(shù)與專用于從屬后臺(tái)進(jìn)程和操作系統(tǒng)的資源以外的節(jié)點(diǎn)資源總量(比如總 CPU 數(shù)和總內(nèi)存)共同決定。
有趣的是,ApplicationMaster 可在容器內(nèi)運(yùn)行任何類型的任務(wù)。例如,MapReduce ApplicationMaster 請求一個(gè)容器來啟動(dòng) map 或 reduce 任務(wù),而 Giraph ApplicationMaster 請求一個(gè)容器來運(yùn)行 Giraph 任務(wù)。您還可以實(shí)現(xiàn)一個(gè)自定義的 ApplicationMaster 來運(yùn)行特定的任務(wù),進(jìn)而發(fā)明出一種全新的分布式應(yīng)用程序框架,改變大數(shù)據(jù)世界的格局。您可以查閱 Apache Twill,它旨在簡化 YARN 之上的分布式應(yīng)用程序的編寫。
在 YARN 中,MapReduce 降級為一個(gè)分布式應(yīng)用程序的一個(gè)角色(但仍是一個(gè)非常流行且有用的角色),現(xiàn)在稱為 MRv2。MRv2 是經(jīng)典 MapReduce 引擎(現(xiàn)在稱為 MRv1)的重現(xiàn),運(yùn)行在 YARN 之上。
一個(gè)可運(yùn)行任何分布式應(yīng)用程序的集群
ResourceManager、NodeManager 和容器都不關(guān)心應(yīng)用程序或任務(wù)的類型。所有特定于應(yīng)用程序框架的代碼都轉(zhuǎn)移到它的 ApplicationMaster,以便任何分布式框架都可以受 YARN 支持 — 只要有人為它實(shí)現(xiàn)了相應(yīng)的 ApplicationMaster。
得益于這個(gè)一般性的方法,Hadoop YARN 集群運(yùn)行許多不同工作負(fù)載的夢想才得以實(shí)現(xiàn)。想像一下:您數(shù)據(jù)中心中的一個(gè) Hadoop 集群可運(yùn)行 MapReduce、Giraph、Storm、Spark、Tez/Impala、MPI 等。
單一集群方法明顯提供了大量優(yōu)勢,其中包括:
- 更高的集群利用率,一個(gè)框架未使用的資源可由另一個(gè)框架使用
- 更低的操作成本,因?yàn)橹挥幸粋€(gè) “包辦一切的” 集群需要管理和調(diào)節(jié)
- 更少的數(shù)據(jù)移動(dòng),無需在 Hadoop YARN 與在不同機(jī)器集群上運(yùn)行的系統(tǒng)之間移動(dòng)數(shù)據(jù)
管理單個(gè)集群還會(huì)得到一個(gè)更環(huán)保的數(shù)據(jù)處理解決方案。使用的數(shù)據(jù)中心空間更少,浪費(fèi)的硅片更少,使用的電源更少,排放的碳更少,這只是因?yàn)槲覀冊诟〉咝У?Hadoop 集群上運(yùn)行同樣的計(jì)算。
YARN 中的應(yīng)用程序提交
本節(jié)討論在應(yīng)用程序提交到 YARN 集群時(shí),ResourceManager、ApplicationMaster、NodeManagers 和容器如何相互交互。下圖顯示了一個(gè)例子。
YARN 中的應(yīng)用程序提交
假設(shè)用戶采用與 MRv1 中相同的方式鍵入 hadoop jar 命令,將應(yīng)用程序提交到 ResourceManager。ResourceManager 維護(hù)在集群上運(yùn)行的應(yīng)用程序列表,以及每個(gè)活動(dòng)的 NodeManager 上的可用資源列表。ResourceManager 需要確定哪個(gè)應(yīng)用程序接下來應(yīng)該獲得一部分集群資源。該決策受到許多限制,比如隊(duì)列容量、ACL 和公平性。ResourceManager 使用一個(gè)可插拔的 Scheduler。Scheduler 僅執(zhí)行調(diào)度;它管理誰在何時(shí)獲取集群資源(以容器的形式),但不會(huì)對應(yīng)用程序內(nèi)的任務(wù)執(zhí)行任何監(jiān)視,所以它不會(huì)嘗試重新啟動(dòng)失敗的任務(wù)。
在 ResourceManager 接受一個(gè)新應(yīng)用程序提交時(shí),Scheduler 制定的第一個(gè)決策是選擇將用來運(yùn)行 ApplicationMaster 的容器。在 ApplicationMaster 啟動(dòng)后,它將負(fù)責(zé)此應(yīng)用程序的整個(gè)生命周期。首先也是最重要的是,它將資源請求發(fā)送到 ResourceManager,請求運(yùn)行應(yīng)用程序的任務(wù)所需的容器。資源請求是對一些容器的請求,用以滿足一些資源需求,比如:
- 一定量的資源,目前使用 MB 內(nèi)存和 CPU 份額來表示
- 一個(gè)首選的位置,由主機(jī)名、機(jī)架名稱指定,或者使用 * 來表示沒有偏好
- 此應(yīng)用程序中的一個(gè)優(yōu)先級,而不是跨多個(gè)應(yīng)用程序
如果可能的話,ResourceManager 會(huì)分配一個(gè)滿足 ApplicationMaster 在資源請求中所請求的需求的容器(表達(dá)為容器 ID 和主機(jī)名)。該容器允許應(yīng)用程序使用特定主機(jī)上給定的資源量。分配一個(gè)容器后,ApplicationMaster 會(huì)要求 NodeManager(管理分配容器的主機(jī))使用這些資源來啟動(dòng)一個(gè)特定于應(yīng)用程序的任務(wù)。此任務(wù)可以是在任何框架中編寫的任何進(jìn)程(比如一個(gè) MapReduce 任務(wù)或一個(gè) Giraph 任務(wù))。NodeManager 不會(huì)監(jiān)視任務(wù);它僅監(jiān)視容器中的資源使用情況,舉例而言,如果一個(gè)容器消耗的內(nèi)存比最初分配的更多,它會(huì)結(jié)束該容器。
ApplicationMaster 會(huì)竭盡全力協(xié)調(diào)容器,啟動(dòng)所有需要的任務(wù)來完成它的應(yīng)用程序。它還監(jiān)視應(yīng)用程序及其任務(wù)的進(jìn)度,在新請求的容器中重新啟動(dòng)失敗的任務(wù),以及向提交應(yīng)用程序的客戶端報(bào)告進(jìn)度。應(yīng)用程序完成后,ApplicationMaster 會(huì)關(guān)閉自己并釋放自己的容器。
盡管 ResourceManager 不會(huì)對應(yīng)用程序內(nèi)的任務(wù)執(zhí)行任何監(jiān)視,但它會(huì)檢查 ApplicationMaster 的健康狀況。如果 ApplicationMaster 失敗,ResourceManager 可在一個(gè)新容器中重新啟動(dòng)它。您可以認(rèn)為 ResourceManager 負(fù)責(zé)管理 ApplicationMaster,而 ApplicationMasters 負(fù)責(zé)管理任務(wù)。
有趣的事實(shí)和特性
YARN 提供了多種其他的優(yōu)秀特性。介紹所有這些特性不屬于本文的范疇,我僅列出一些值得注意的特性:
- 如果作業(yè)足夠小,Uberization 支持在 ApplicationMaster 的 JVM 中運(yùn)行一個(gè) MapReduce 作業(yè)的所有任務(wù)。這樣,您就可避免從 ResourceManager 請求容器以及要求 NodeManagers 啟動(dòng)(可能很小的)任務(wù)的開銷。
- 與為 MRv1 編寫的 MapReduce 作業(yè)的二進(jìn)制或源代碼兼容性 (MAPREDUCE-5108)。
- 針對 ResourceManager 的高可用性 (YARN-149)。此工作正在進(jìn)行中,已由一些供應(yīng)商完成。
- 重新啟動(dòng) ResourceManager 后的應(yīng)用程序恢復(fù) (YARN-128)。ResourceManager 將正在運(yùn)行的應(yīng)用程序和已完成的任務(wù)的信息存儲(chǔ)在 HDFS 中。如果 ResourceManager 重新啟動(dòng),它會(huì)重新創(chuàng)建應(yīng)用程序的狀態(tài),僅重新運(yùn)行不完整的任務(wù)。此工作已接近完成,社區(qū)正在積極測試。它已由一些供應(yīng)商完成。
- 簡化的用戶日志管理和訪問。應(yīng)用程序生成的日志不會(huì)留在各個(gè)從屬節(jié)點(diǎn)上(像 MRv1 一樣),而轉(zhuǎn)移到一個(gè)中央存儲(chǔ)區(qū),比如 HDFS。在以后,它們可用于調(diào)試用途,或者用于歷史分析來發(fā)現(xiàn)性能問題。
- Web 界面的新外觀。
結(jié)束語
YARN 是一個(gè)完全重寫的 Hadoop 集群架構(gòu)。它似乎在商用機(jī)器集群上實(shí)現(xiàn)和執(zhí)行分布式應(yīng)用程序的方式上帶來了變革。
與第一版 Hadoop 中經(jīng)典的 MapReduce 引擎相比,YARN 在可伸縮性、效率和靈活性上提供了明顯的優(yōu)勢。小型和大型 Hadoop 集群都從 YARN 中受益匪淺。對于最終用戶(開發(fā)人員,而不是管理員),這些更改幾乎是不可見的,因?yàn)榭梢允褂孟嗤?MapReduce API 和 CLI 運(yùn)行未經(jīng)修改的 MapReduce 作業(yè)。
沒有理由不將 MRv1 遷移到 YARN。最大型的 Hadoop 供應(yīng)商都同意這一點(diǎn),而且為 Hadoop YARN 的運(yùn)行提供了廣泛的支持。如今,YARN 已被許多公司成功應(yīng)用在生產(chǎn)中,比如 Yahoo!、eBay、Spotify、Xing、Allegro 等。