
Hadoop數(shù)據(jù)操作系統(tǒng)YARN全解析其它
為了能夠?qū)褐械馁Y源進行統(tǒng)一管理和調(diào)度,Hadoop 2.0引入了數(shù)據(jù)操作系統(tǒng)YARN。YARN的引入,大大提高了集群的資源利用率,并降低了集群管理成本。首先,YARN允許多個應(yīng)用程序運行在一個集群中,并將資源按需分配給它們,這大大提高了資源利用率,其次,YARN允許各類短作業(yè)和長服務(wù)混合部署在一個集群中,并提供了容錯、資源隔離及負載均衡等方面的支持,這大大簡化了作業(yè)和服務(wù)的部署和管理成本。
YARN總體上采用master/slave架構(gòu),如圖1所示,其中,master被稱為ResourceManager,slave被稱為 NodeManager,ResourceManager負責對各個NodeManager上的資源進行統(tǒng)一管理和調(diào)度。當用戶提交一個應(yīng)用程序時,需要提供一個用以跟蹤和管理這個程序的ApplicationMaster,它負責向ResourceManager申請資源,并要求NodeManger啟動可以占用一定資源的Container。由于不同的ApplicationMaster被分布到不同的節(jié)點上,并通過一定的隔離機制進行了資源隔離,因此它們之間不會相互影響。
圖1 Apache YARN的基本架構(gòu)
YARN中的資源管理和調(diào)度功能由資源調(diào)度器負責,它是Hadoop YARN中最核心的組件之一,是ResourceManager中的一個插拔式服務(wù)組件 。YARN通過層級化隊列的方式組織和劃分資源,并提供了多種多租戶資源調(diào)度器,這種調(diào)度器允許管理員按照應(yīng)用需求對用戶或者應(yīng)用程序分組,并為不同的分組分配不同的資源量,同時通過添加各種約束防止單個用戶或者應(yīng)用程序獨占資源,進而能夠滿足各種QoS需求,典型代表是Yahoo!的Capacity Scheduler和Facebook的Fair Scheduler。
YARN作為一個通用數(shù)據(jù)操作系統(tǒng),既可以運行像MapReduce、Spark這樣的短作業(yè),也可以部署像Web Server、mysql Server這種長服務(wù),真正實現(xiàn)一個集群多用途,這樣的集群,我們通常稱為輕量級彈性計算平臺,說它輕量級,是因為YARN采用了cgroups輕量級隔離方案,說它彈性,是因為YARN能根據(jù)各種計算框架或者應(yīng)用的負載或者需求調(diào)整它們各自占用的資源,實現(xiàn)集群資源共享,資源彈性收縮。
圖2 以YARN為核心的生態(tài)系統(tǒng)
Hadoop YARN在異構(gòu)集群中的應(yīng)用
從2.6.0版本開始,YARN引入了一種新的調(diào)度策略:基于標簽的調(diào)度機制。該機制的主要引入動機是更好地讓YARN運行在異構(gòu)集群中,進而更好地管理和調(diào)度混合類型的應(yīng)用程序。
1.什么是基于標簽的調(diào)度
故名思議,基于標簽的調(diào)度是一種調(diào)度策略,就像基于優(yōu)先級的調(diào)度一樣,是調(diào)度器中眾多調(diào)度策略中的一種,可以跟其他調(diào)度策略混合使用。該策略的基本思想是:用戶可為每個NodeManager打上標簽,比如highmem,highdisk等,以作為NodeManager的基本屬性;同時,用戶可以為調(diào)度器中的隊列設(shè)置若干標簽,以限制該隊列只能占用包含對應(yīng)標簽的節(jié)點資源,這樣,提交到某個隊列中的作業(yè),只能運行在特定一些節(jié)點上。通過打標簽,用戶可將Hadoop分成若干個子集群,進而使得用戶可將應(yīng)用程序運行到符合某種特征的節(jié)點上,比如可將內(nèi)存密集型的應(yīng)用程序(比如Spark)運行到大內(nèi)存節(jié)點上。
2.Hulu應(yīng)用案例
基于標簽的調(diào)度策略在Hulu內(nèi)部有廣泛的應(yīng)用。之所以啟用該機制,主要出于以下三點考慮:
集群是異構(gòu)的。在Hadoop集群演化過程中,后來新增機器的配置通常比舊機器好,這使得集群最終變?yōu)橐粋€異構(gòu)的集群。Hadoop設(shè)計之初眾多設(shè)計機制假定集群是同構(gòu)的,即使發(fā)展到現(xiàn)在,Hadoop對異構(gòu)集群的支持仍然很不完善,比如MapReduce推測執(zhí)行機制尚未考慮異構(gòu)集群情形。
應(yīng)用是多樣化的。Hulu在YARN集群之上同時部署了MapReduce、Spark、Spark Streaming、Docker Service等多種類型的應(yīng)用程序 。當在異構(gòu)集群混合運行多類應(yīng)用程序時,經(jīng)常發(fā)生由于機器配置不一導(dǎo)致并行化任務(wù)完成時間相差較大的情況,這非常不利于分布式程序的高效執(zhí)行。此外,由于 YARN無法進行完全的資源隔離,多個應(yīng)用程序混合運行在一個節(jié)點上容易相互干擾,對于低延遲類型的應(yīng)用通常是難以容忍的。
個性化機器需求。由于對特殊環(huán)境的依賴,有些應(yīng)用程序只能運行在大集群中的特定節(jié)點上。典型的代表是spark和docker,spark MLLib可能用到一些native庫,為了防止污染系統(tǒng),這些庫通常只會安裝在若干節(jié)點上;docker container的運行依賴于docker engine,為了簡化運維成本,我們 只會讓docker運行在若干指定的節(jié)點上。
為了解決以上問題,Hulu在Capacity Scheduler基礎(chǔ)上啟用了基于標簽的調(diào)度策略。如圖3所示,我們根據(jù)機器配置和應(yīng)用程序需求,為集群中的節(jié)點打上了多種標簽,包括:
spark-node:用于運行spark作業(yè)的機器,這些機器通常配置較高,尤其是內(nèi)存較大;
mr-node:運行MapReduce作業(yè)的機器,這些機器配置是多樣的;
docker-node:運行docker應(yīng)用程序的機器,這些機器上裝有docker engine;
streaming-node:運行spark streaming流式應(yīng)用的機器。
圖3 YARN部署示例
需要注意的是,YARN允許一個節(jié)點同時存在多個標簽,進而實現(xiàn)一臺機器混合運行多類應(yīng)用程序(在hulu內(nèi)部,我們允許一些節(jié)點是共享的,同時可以運行多種應(yīng)用程序)。表面上看來,通過引入標簽將集群分成了多個物理集群,但實際上,這些物理集群跟傳統(tǒng)意義上完全隔離的集群是不同的,這些集群既相互獨立又相互關(guān)聯(lián),用戶可非常容易地通過修改標簽動態(tài)調(diào)整某個節(jié)點的用途。
Hadoop YARN應(yīng)用案例及經(jīng)驗總結(jié)
Hadoop YARN作為一個數(shù)據(jù)操作系統(tǒng),提供了豐富的API供用戶開發(fā)應(yīng)用程序。Hulu在YARN應(yīng)用程序設(shè)計方面進行了大量探索和實踐,開發(fā)了多個可直接運行在YARN上的分布式計算框架和計算引擎,典型的代表是voidbox和nesto。
(1)基于Docker的容器計算框架 voidbox
Docker是近兩年非常流行的容器虛擬化技術(shù),可以自動化打包部署絕大部分應(yīng)用,它使得任何程序能夠運行在資源隔離的容器環(huán)境,從而提供了一套更加優(yōu)雅的項目構(gòu)建、發(fā)布、運行的解決方案。
為了整合YARN和Docker各自的獨特優(yōu)勢,Hulu北京大數(shù)據(jù)團隊開發(fā)了Voidbox。Voidbox是一個分布式的計算框架,利用 YARN作為資源管理模塊,用Docker作為執(zhí)行任務(wù)的引擎,從而讓YARN既可以調(diào)度傳統(tǒng)的MapReduce和Spark等類型的應(yīng)用程序,也可以調(diào)度封裝在Docker鏡像中的應(yīng)用程序。
Voidbox支持基于Docker Container的DAG(有向無環(huán)圖)任務(wù)和長服務(wù)(比如web service),提供命令行方式與IDE方式等多種應(yīng)用程序提交方式,滿足了生產(chǎn)環(huán)境和開發(fā)環(huán)境的需求。此外,Voidbox可以配合 Jenkins,GitLab,私有的Docker倉庫完成一整套開發(fā)、測試、自動發(fā)布的流程。
圖4 Voidbox系統(tǒng)架構(gòu)
在Voidbox中,YARN負責集群的資源調(diào)度,Docker作為一個執(zhí)行引擎,從Docker Registry中拉取鏡像執(zhí)行。Voidbox負責為基于容器的DAG任務(wù)申請資源,運行Docker任務(wù)。如圖4所示,每個黑線框代表一臺機器,上面運行著幾個模塊,具體如下:
Voidbox組件:
VoidboxClient:客戶端程序。用戶可通過該組件管理Voidbox應(yīng)用程序(Voidbox應(yīng)用程序包含一個或多個Docker作業(yè),一個作業(yè)包含一個或多個Docker任務(wù)),比如提交和殺死Voidbox應(yīng)用程序等。
VoidboxMaster:實際上是一個YARN的Application Master,負責向YARN申請資源,并將得到的資源進一步分配給內(nèi)部的Docker任務(wù)。
VoidboxDriver:負責單個Voidbox應(yīng)用程序的任務(wù)調(diào)度。Voidbox支持基于Docker Container的DAG任務(wù)調(diào)度并且在任務(wù)之間可以插入其他用戶代碼,Voidbox Driver負責處理DAG任務(wù)之間的依賴順序調(diào)度以及運行用戶代碼。
VoidboxProxy:是YARN與Docker引擎之間的橋梁,負責中轉(zhuǎn)YARN發(fā)向Docker引擎的命令,比如啟動或殺死Docker容器等。
StateServer:維護各個Docker引擎的健康狀況信息,向Voidbox Master提供可運行Docker Container的機器列表,使得Voidbox Master可以更有效地申請資源。
Docker組件:
DockerRegistry:存儲Docker鏡像,作為內(nèi)部Docker鏡像的版本管理工具。
DockerEngine: Docker Container執(zhí)行的引擎,從Docker Registry獲取相應(yīng)的Docker鏡像,執(zhí)行Docker相關(guān)命令。
Jenkins:配合GitLab進行應(yīng)用程序的版本管理,當應(yīng)用版本更新時,Jenkins負責編譯打包,生成Docker鏡像,上傳至Docker Registry,從而完成應(yīng)用程序自動發(fā)布的流程。
類似于spark on yarn,Voidbox也提供兩種應(yīng)用程序運行模式,分別是yarn-cluster模式和yarn-client模式。yarn-cluster模式中應(yīng)用程序的控制組件和資源管理組件都運行在集群中,Voidbox應(yīng)用程序提交成功后,客戶端可以隨時退出而不影響集群中應(yīng)用程序的運行。yarn- cluster模式適合生產(chǎn)環(huán)境提交應(yīng)用程序;yarn-client模式中應(yīng)用程序的控制組件運行在客戶端,其他組件運行在集群中,客戶端可以看到關(guān)于應(yīng)用程序運行狀態(tài)的更多信息,客戶端退出后,在集群中運行的應(yīng)用程序也隨即退出,yarn-client模式可以方便用戶進行調(diào)試。
(2)并行計算引擎nesto
nesto是hulu內(nèi)部一個類似于presto/impala的MPP計算引擎,它是專門為處理復(fù)雜的嵌套式數(shù)據(jù)而設(shè)計的,支持復(fù)雜的數(shù)據(jù)處理邏輯(SQL難以表達),其采用了列式存儲、code generation等優(yōu)化技術(shù)以加速數(shù)據(jù)處理效率。Nesto架構(gòu)類似于presto/impala,它是無中心化的,多個nesto server通過zookeeper進行服務(wù)發(fā)現(xiàn)。
為了簡化nesto部署和管理成本,hulu直接將nesto部署到Y(jié)ARN上。這樣,nesto安裝部署過程將變得非常簡單:Nesto安裝程序 (包括配置文件和jar包)被打成一個獨立的壓縮包存放到HDFS,用戶可通過運行一個提交命令,并指定啟動的nesto server數(shù)目、每個server需要的資源等信息,即可快速部署一套nesto集群。
Nesto on yarn程序由一個ApplicationMaster和多個Executor構(gòu)成,其中ApplicationMaster負責像YARN申請資源,并啟動Executor,而Executor的作用是啟動nesto server,關(guān)鍵設(shè)計點在ApplicationMaster,它的功能包括:
與ResourceManager通信,申請資源,這些資源需保證來自不同的結(jié)點,以達到每個節(jié)點只啟動一個Executor的目的;
與NodeManager通信,啟動Executor,并監(jiān)控這些Executor健康狀況,一旦發(fā)現(xiàn)某個Executor出現(xiàn)故障,則重新在其他節(jié)點上啟動一個新的Executor;
提供一個嵌入式web server,以便展示各個nesto server中任務(wù)運行狀況。
2.Hadoop YARN開發(fā)經(jīng)驗總結(jié)
(1)巧用資源申請API
Hadoop YARN提供了較為豐富的資源表達語義,用戶可以申請?zhí)囟ü?jié)點/機架上的資源,也可以通過黑名單的方式不再接受某個節(jié)點上的資源。
(2)注意memory overhead
一個container的內(nèi)存是由java heap,jvm overhead和non-java memory三部分構(gòu)成的,如果用戶為應(yīng)用程序設(shè)置的內(nèi)存大小為X GB(-xmxXg),則ApplicationMaster為其申請的container內(nèi)存大小應(yīng)為X+D,其中D為jvm overhead,否則可能會因總內(nèi)存超出限制被YARN殺死。
(3) log rotation
對于長服務(wù)而言,服務(wù)日志會越積攢越多,因而log rotation顯得尤為重要。由于啟動之前,應(yīng)用程序是無法知道日志具體存放位置(比如哪個節(jié)點的哪個目錄下)的,為了方便用戶操作日志目錄,YARN 提供了宏,當該宏出現(xiàn)在啟動命令中時,YARN會自動將其替換為具體的日志目錄,比如:
echo $log4jcontent > $PWD/log4j.properties && java -Dlog4j.configuration=log4j.properties …
com.example.NestoServer 1>>/server.log 2>>/server.log
其中變量log4jcontent內(nèi)容如下:
(4)調(diào)試技巧
NodeManager啟動Container之前,會將該Container相關(guān)的環(huán)境變量、啟動命令等信息寫入一個shell腳本,并通過啟動該腳本的方式啟動Container。有些情況下,Container啟動失敗可能是由于啟動命令寫錯的緣故(比如某些特殊字符被轉(zhuǎn)義了),為此,可通過查看最后執(zhí)行腳本內(nèi)容判斷啟動命令是否存在問題,具體方法是,在container執(zhí)行命令之前添加打印腳本內(nèi)容的命令。
(5)共享集群帶來的性能問題
當在YARN集群中同時運行多種應(yīng)用程序時,可能造成節(jié)點負載不一,進而導(dǎo)致某些節(jié)點上的任務(wù)運行速度慢于其他節(jié)點,這對于OLAP需求的應(yīng)用是不能接受的。為了解決該問題,通常有兩種解決方式:1)通過打標簽的方式將這類應(yīng)用運行到一些獨享的節(jié)點上 2)在應(yīng)用程序內(nèi)部實現(xiàn)類似于MapReduce和Spark的推測執(zhí)行機制,為慢任務(wù)額外啟動一個或多個同樣的任務(wù),以空間換時間的方式,避免慢任務(wù)拖慢整個應(yīng)用程序的運行效率。
Hadoop YARN發(fā)展趨勢
對于 YARN,會朝著通用資源管理和調(diào)度方向發(fā)展,而不僅僅限于大數(shù)據(jù)處理領(lǐng)域,包括對 MapReduce、Spark 短作業(yè)的支持,以及對 Web Service 等長服務(wù)的支持。
數(shù)據(jù)分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
SQL Server 中 CONVERT 函數(shù)的日期轉(zhuǎn)換:從基礎(chǔ)用法到實戰(zhàn)優(yōu)化 在 SQL Server 的數(shù)據(jù)處理中,日期格式轉(zhuǎn)換是高頻需求 —— 無論 ...
2025-09-18MySQL 大表拆分與關(guān)聯(lián)查詢效率:打破 “拆分必慢” 的認知誤區(qū) 在 MySQL 數(shù)據(jù)庫管理中,“大表” 始終是性能優(yōu)化繞不開的話題。 ...
2025-09-18CDA 數(shù)據(jù)分析師:表結(jié)構(gòu)數(shù)據(jù) “獲取 - 加工 - 使用” 全流程的賦能者 表結(jié)構(gòu)數(shù)據(jù)(如數(shù)據(jù)庫表、Excel 表、CSV 文件)是企業(yè)數(shù)字 ...
2025-09-18DSGE 模型中的 Et:理性預(yù)期算子的內(nèi)涵、作用與應(yīng)用解析 動態(tài)隨機一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開始提取前,需先判斷 TIF 文件的類型 —— ...
2025-09-17CDA 數(shù)據(jù)分析師:解鎖表結(jié)構(gòu)數(shù)據(jù)特征價值的專業(yè)核心 表結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 規(guī)范存儲的結(jié)構(gòu)化數(shù)據(jù),如數(shù)據(jù)庫表、Excel 表、 ...
2025-09-17Excel 導(dǎo)入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實戰(zhàn)應(yīng)用 在用 Python(如 pandas 庫)處理 Excel 數(shù)據(jù)時,“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗與 t 檢驗:差異、適用場景與實踐應(yīng)用 在數(shù)據(jù)分析與統(tǒng)計學領(lǐng)域,假設(shè)檢驗是驗證研究假設(shè)、判斷數(shù)據(jù)差異是否 “ ...
2025-09-16CDA 數(shù)據(jù)分析師:掌控表格結(jié)構(gòu)數(shù)據(jù)全功能周期的專業(yè)操盤手 表格結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 存儲的結(jié)構(gòu)化數(shù)據(jù),如 Excel 表、數(shù)據(jù) ...
2025-09-16MySQL 執(zhí)行計劃中 rows 數(shù)量的準確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調(diào)優(yōu)中,EXPLAIN執(zhí)行計劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對象的 text 與 content:區(qū)別、場景與實踐指南 在 Python 進行 HTTP 網(wǎng)絡(luò)請求開發(fā)時(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結(jié)構(gòu)數(shù)據(jù)價值的核心操盤手 表格結(jié)構(gòu)數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫表)是企業(yè)最基礎(chǔ)、最核心的數(shù)據(jù)形態(tài) ...
2025-09-15Python HTTP 請求工具對比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請求(如接口調(diào)用、數(shù)據(jù)爬取 ...
2025-09-12解決 pd.read_csv 讀取長浮點數(shù)據(jù)的科學計數(shù)法問題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長浮點數(shù)據(jù)時的科學計數(shù)法問題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務(wù)數(shù)據(jù)分析步驟的落地者與價值優(yōu)化者 業(yè)務(wù)數(shù)據(jù)分析是企業(yè)解決日常運營問題、提升執(zhí)行效率的核心手段,其價值 ...
2025-09-12用 SQL 驗證業(yè)務(wù)邏輯:從規(guī)則拆解到數(shù)據(jù)把關(guān)的實戰(zhàn)指南 在業(yè)務(wù)系統(tǒng)落地過程中,“業(yè)務(wù)邏輯” 是連接 “需求設(shè)計” 與 “用戶體驗 ...
2025-09-11塔吉特百貨孕婦營銷案例:數(shù)據(jù)驅(qū)動下的精準零售革命與啟示 在零售行業(yè) “流量紅利見頂” 的當下,精準營銷成為企業(yè)突圍的核心方 ...
2025-09-11CDA 數(shù)據(jù)分析師與戰(zhàn)略 / 業(yè)務(wù)數(shù)據(jù)分析:概念辨析與協(xié)同價值 在數(shù)據(jù)驅(qū)動決策的體系中,“戰(zhàn)略數(shù)據(jù)分析”“業(yè)務(wù)數(shù)據(jù)分析” 是企業(yè) ...
2025-09-11Excel 數(shù)據(jù)聚類分析:從操作實踐到業(yè)務(wù)價值挖掘 在數(shù)據(jù)分析場景中,聚類分析作為 “無監(jiān)督分組” 的核心工具,能從雜亂數(shù)據(jù)中挖 ...
2025-09-10統(tǒng)計模型的核心目的:從數(shù)據(jù)解讀到?jīng)Q策支撐的價值導(dǎo)向 統(tǒng)計模型作為數(shù)據(jù)分析的核心工具,并非簡單的 “公式堆砌”,而是圍繞特定 ...
2025-09-10