Hadoop數據操做系統YARN全解析

  爲了可以對集羣中的資源進行統一管理和調度,Hadoop 2.0引入了數據操做系統YARNYARN的引入,大大提升了集羣的資源利用率,並下降了集羣管理成本。首先,YARN容許多個應用程序運行在一個集羣中,並將資源按需分配給它們,這大大提升了資源利用率,其次,YARN容許各種短做業和長服務混合部署在一個集羣中,並提供了容錯、資源隔離及負載均衡等方面的支持,這大大簡化了做業和服務的部署和管理成本。java

  分享以前我仍是要說下我本身建立的大數據交流羣:784557197, 不論是學生仍是大神 ,都歡迎加入一塊兒探討node

  YARN整體上採用master/slave架構,如圖1所示,其中,master被稱爲ResourceManagerslave被稱爲 NodeManagerResourceManager負責對各個NodeManager上的資源進行統一管理和調度。當用戶提交一個應用程序時,須要提供一個用以跟蹤和管理這個程序的ApplicationMaster,它負責向ResourceManager申請資源,並要求NodeManger啓動能夠佔用必定資源的Container。因爲不一樣的ApplicationMaster被分佈到不一樣的節點上,並經過必定的隔離機制進行了資源隔離,所以它們之間不會相互影響。web

 圖1 Apache YARN的基本架構

  YARN中的資源管理和調度功能由資源調度器負責,它是Hadoop YARN中最核心的組件之一,是ResourceManager中的一個插拔式服務組件 。YARN經過層級化隊列的方式組織和劃分資源,並提供了多種多租戶資源調度器,這種調度器容許管理員按照應用需求對用戶或者應用程序分組,併爲不一樣的分組分配不一樣的資源量,同時經過添加各類約束防止單個用戶或者應用程序獨佔資源,進而可以知足各類QoS需求,典型表明是Yahoo!的Capacity SchedulerFacebookFair Schedulerdocker

  YARN做爲一個通用數據操做系統,既能夠運行像MapReduce、Spark這樣的短做業,也能夠部署像Web Server、MySQL Server這種長服務,真正實現一個集羣多用途,這樣的集羣,咱們一般稱爲輕量級彈性計算平臺,說它輕量級,是由於YARN採用了cgroups輕量級隔離方案,說它彈性,是由於YARN能根據各類計算框架或者應用的負載或者需求調整它們各自佔用的資源,實現集羣資源共享,資源彈性收縮。shell

圖2 以YARN爲核心的生態系統

Hadoop YARN在異構集羣中的應用

  從2.6.0版本開始,YARN引入了一種新的調度策略:基於標籤的調度機制。該機制的主要引入動機是更好地讓YARN運行在異構集羣中,進而更好地管理和調度混合類型的應用程序架構

1.什麼是基於標籤的調度

  故名思議,基於標籤的調度是一種調度策略,就像基於優先級的調度同樣,是調度器中衆多調度策略中的一種,能夠跟其餘調度策略混合使用。該策略的基本思想是:用戶可爲每一個NodeManager打上標籤,好比highmemhighdisk等,以做爲NodeManager的基本屬性;同時,用戶能夠爲調度器中的隊列設置若干標籤,以限制該隊列只能佔用包含對應標籤的節點資源,這樣,提交到某個隊列中的做業,只能運行在特定一些節點上。經過打標籤,用戶可將Hadoop分紅若干個子集羣,進而使得用戶可將應用程序運行到符合某種特徵的節點上,好比可將內存密集型的應用程序(好比Spark)運行到大內存節點上。負載均衡

2.Hulu應用案例

基於標籤的調度策略在Hulu內部有普遍的應用。之因此啓用該機制,主要出於如下三點考慮框架

  • 集羣是異構的。在Hadoop集羣演化過程當中,後來新增機器的配置一般比舊機器好,這使得集羣最終變爲一個異構的集羣。Hadoop設計之初衆多設計機制假定集羣是同構的,即便發展到如今,Hadoop對異構集羣的支持仍然很不完善,好比MapReduce推測執行機制還沒有考慮異構集羣情形
  • 應用是多樣化的。Hulu在YARN集羣之上同時部署了MapReduce、Spark、Spark Streaming、Docker Service等多種類型的應用程序 。當在異構集羣混合運行多類應用程序時,常常發生因爲機器配置不一致使並行化任務完成時間相差較大的狀況,這很是不利於分佈式程序的高效執行。此外,因爲 YARN沒法進行徹底的資源隔離,多個應用程序混合運行在一個節點上容易相互干擾,對於低延遲類型的應用一般是難以容忍的。
  • 個性化機器需求。因爲對特殊環境的依賴,有些應用程序只能運行在大集羣中的特定節點上。典型的表明是spark和docker,spark MLLib可能用到一些native庫,爲了防止污染系統,這些庫一般只會安裝在若干節點上;docker container的運行依賴於docker engine,爲了簡化運維成本,咱們 只會讓docker運行在若干指定的節點上。

爲了解決以上問題Hulu在Capacity Scheduler基礎上啓用了基於標籤的調度策略。如圖3所示,咱們根據機器配置和應用程序需求,爲集羣中的節點打上了多種標籤,包括:運維

  • spark-node:用於運行spark做業的機器,這些機器一般配置較高,尤爲是內存較大;
  • mr-node:運行MapReduce做業的機器,這些機器配置是多樣的;
  • docker-node:運行docker應用程序的機器,這些機器上裝有docker engine;
  • streaming-node:運行spark streaming流式應用的機器。

圖3 YARN部署示例

須要注意的是,YARN容許一個節點同時存在多個標籤,進而實現一臺機器混合運行多類應用程序(在hulu內部,咱們容許一些節點是共享的,同時能夠運行多種應用程序)。表面上看來,經過引入標籤將集羣分紅了多個物理集羣,但實際上,這些物理集羣跟傳統意義上徹底隔離的集羣是不一樣的,這些集羣既相互獨立又相互關聯,用戶可很是容易地經過修改標籤動態調整某個節點的用途。jvm

 Hadoop YARN應用案例及經驗總結

.
Hadoop YARN做爲一個數據操做系統,提供了豐富的API供用戶開發應用程序。Hulu在YARN應用程序設計方面進行了大量探索和實踐,開發了多個可直接運行在YARN上的分佈式計算框架和計算引擎,典型的表明是voidbox和nesto。

(1)基於Docker的容器計算框架 voidbox

Docker是近兩年很是流行的容器虛擬化技術,能夠自動化打包部署絕大部分應用,它使得任何程序可以運行在資源隔離的容器環境,從而提供了一套更加優雅的項目構建、發佈、運行的解決方案。

爲了整合YARN和Docker各自的獨特優點,Hulu北京大數據團隊開發了Voidbox。Voidbox是一個分佈式的計算框架,利用 YARN做爲資源管理模塊,用Docker做爲執行任務的引擎,從而讓YARN既能夠調度傳統的MapReduce和Spark等類型的應用程序,也能夠調度封裝在Docker鏡像中的應用程序。

Voidbox支持基於Docker Container的DAG(有向無環圖)任務和長服務(好比web service),提供命令行方式與IDE方式等多種應用程序提交方式,知足了生產環境和開發環境的需求。此外,Voidbox能夠配合 Jenkins,GitLab,私有的Docker倉庫完成一整套開發、測試、自動發佈的流程。

圖4 Voidbox系統架構

在Voidbox中,YARN負責集羣的資源調度,Docker做爲一個執行引擎,從Docker Registry中拉取鏡像執行。Voidbox負責爲基於容器的DAG任務申請資源,運行Docker任務。如圖4所示,每一個黑線框表明一臺機器,上面運行着幾個模塊,具體以下:

Voidbox組件:

  • VoidboxClient:客戶端程序。用戶可經過該組件管理Voidbox應用程序(Voidbox應用程序包含一個或多個Docker做業,一個做業包含一個或多個Docker任務),好比提交和殺死Voidbox應用程序等。
  • VoidboxMaster:其實是一個YARN的Application Master,負責向YARN申請資源,並將獲得的資源進一步分配給內部的Docker任務。
  • VoidboxDriver:負責單個Voidbox應用程序的任務調度。Voidbox支持基於Docker Container的DAG任務調度而且在任務之間能夠插入其餘用戶代碼,Voidbox Driver負責處理DAG任務之間的依賴順序調度以及運行用戶代碼。
  • VoidboxProxy:是YARN與Docker引擎之間的橋樑,負責中轉YARN發向Docker引擎的命令,好比啓動或殺死Docker容器等。
  • StateServer:維護各個Docker引擎的健康情況信息,向Voidbox Master提供可運行Docker Container的機器列表,使得Voidbox Master能夠更有效地申請資源。

Docker組件:

  • DockerRegistry:存儲Docker鏡像,做爲內部Docker鏡像的版本管理工具。
  • DockerEngine: Docker Container執行的引擎,從Docker Registry獲取相應的Docker鏡像,執行Docker相關命令。
  • Jenkins:配合GitLab進行應用程序的版本管理,當應用版本更新時,Jenkins負責編譯打包,生成Docker鏡像,上傳至Docker Registry,從而完成應用程序自動發佈的流程。

相似於spark on yarn,Voidbox也提供兩種應用程序運行模式,分別是yarn-cluster模式和yarn-client模式。yarn-cluster模式中應用程序的控制組件和資源管理組件都運行在集羣中,Voidbox應用程序提交成功後,客戶端能夠隨時退出而不影響集羣中應用程序的運行。yarn- cluster模式適合生產環境提交應用程序;yarn-client模式中應用程序的控制組件運行在客戶端,其餘組件運行在集羣中,客戶端能夠看到關於應用程序運行狀態的更多信息,客戶端退出後,在集羣中運行的應用程序也隨即退出,yarn-client模式能夠方便用戶進行調試。

(2)並行計算引擎nesto

nesto是hulu內部一個相似於presto/impala的MPP計算引擎,它是專門爲處理複雜的嵌套式數據而設計的,支持複雜的數據處理邏輯(SQL難以表達),其採用了列式存儲、code generation等優化技術以加速數據處理效率。Nesto架構相似於presto/impala,它是無中心化的,多個nesto server經過zookeeper進行服務發現。

  爲了簡化nesto部署和管理成本,hulu直接將nesto部署到YARN上。這樣,nesto安裝部署過程將變得很是簡單:Nesto安裝程序 (包括配置文件和jar包)被打成一個獨立的壓縮包存放到HDFS,用戶可經過運行一個提交命令,並指定啓動的nesto server數目、每一個server須要的資源等信息,便可快速部署一套nesto集羣。

  Nesto on yarn程序由一個ApplicationMaster和多個Executor構成,其中ApplicationMaster負責像YARN申請資源,並啓動Executor,而Executor的做用是啓動nesto server,關鍵設計點在ApplicationMaster,它的功能包括:

  與ResourceManager通訊,申請資源,這些資源需保證來自不一樣的結點,以達到每一個節點只啓動一個Executor的目的;

  與NodeManager通訊,啓動Executor,並監控這些Executor健康情況,一旦發現某個Executor出現故障,則從新在其餘節點上啓動一個新的Executor;

  提供一個嵌入式web server,以便展現各個nesto server中任務運行情況。

2.Hadoop YARN開發經驗總結

(1)巧用資源申請API

  Hadoop YARN提供了較爲豐富的資源表達語義,用戶能夠申請特定節點/機架上的資源,也能夠經過黑名單的方式再也不接受某個節點上的資源。

(2)注意memory overhead

  一個container的內存是由java heap,jvm overhead和non-java memory三部分構成的,若是用戶爲應用程序設置的內存大小爲X GB(-xmxXg),則ApplicationMaster爲其申請的container內存大小應爲X+D,其中D爲jvm overhead,不然可能會因總內存超出限制被YARN殺死。

(3) log rotation

  對於長服務而言,服務日誌會越積攢越多,於是log rotation顯得尤其重要。因爲啓動以前,應用程序是沒法知道日誌具體存放位置(好比哪一個節點的哪一個目錄下)的,爲了方便用戶操做日誌目錄,YARN 提供了宏,當該宏出如今啓動命令中時,YARN會自動將其替換爲具體的日誌目錄,好比:

echo $log4jcontent > $PWD/log4j.properties && java -Dlog4j.configuration=log4j.properties …

com.example.NestoServer 1>>/server.log 2>>/server.log

 其中變量log4jcontent內容以下:

(4)調試技巧

  NodeManager啓動Container以前,會將該Container相關的環境變量、啓動命令等信息寫入一個shell腳本,並經過啓動該腳本的方式啓動Container。有些狀況下,Container啓動失敗多是因爲啓動命令寫錯的緣故(好比某些特殊字符被轉義了),爲此,可經過查看最後執行腳本內容判斷啓動命令是否存在問題,具體方法是,在container執行命令以前添加打印腳本內容的命令。

(5)共享集羣帶來的性能問題

  當在YARN集羣中同時運行多種應用程序時,可能形成節點負載不一,進而致使某些節點上的任務運行速度慢於其餘節點,這對於OLAP需求的應用是不能接受的。爲了解決該問題,一般有兩種解決方式:1)經過打標籤的方式將這類應用運行到一些獨享的節點上 2)在應用程序內部實現相似於MapReduce和Spark的推測執行機制,爲慢任務額外啓動一個或多個一樣的任務,以空間換時間的方式,避免慢任務拖慢整個應用程序的運行效率。
  

Hadoop YARN發展趨勢

  對於 YARN,會朝着通用資源管理和調度方向發展,而不只僅限於大數據處理領域,包括對 MapReduce、Spark 短做業的支持,以及對 Web Service 等長服務的支持。

相關文章
相關標籤/搜索