PPTV之大數據集群容器化研究
背景
PPTV作為國內視頻領域的領先者,對于大規模流媒體的存儲、處理、分發及應用,有著迫切的要求。容器技術及微服務模式的出現,使大規模的研發交付效率大為提高。因此我們基于Docker技術打造了DCOS。集群物理資源的調度用Mesos,容器編排用Marathon,并以此為核心,結合Docker和Nginx,開發了DCOS管理控制臺,權限管理模塊,統一日志管理模塊,IP池管理模塊,存儲管理模塊,并與持續集成平臺Jenkins集成,實現應用容器的創建、運行。同時我們也有一個獨立于容器平臺的大數據集群,主要運行批處理任務,它的資源調度系統是Yarn。在容器平臺上運行的業務高峰一般發生在白天或晚上的黃金時間,而批處理任務多數運行在深夜。這樣就產生一個需求,如果能夠統一調度這兩個集群的物理資源,業務繁忙的白天將更多的資源用于容器平臺,到了深夜就將資源更多地用于批處理任務,就能更有效的節約成本。但是這兩個集群采用了兩個不同的資源調度系統Mesos和Yarn,使共享資源成為一個課題。本篇介紹了通過Apache Myriad項目解決這一課題的研究。
Mesos資源調度簡介

圖 1
圖1是官方的一個例子。Mesos集群由提供資源的Agent、負責調度資源的Mesos master以及使用資源的Framework構成。
- Agent將自己的資源(CPU、內存等)報告給Mesos master。
- Mesosmaster根據策略將資源提供(offer)給Framework。
- Framework再根據自己的策略決定哪個task在哪臺Agent執行。
- 通過Mesos master通知相應的Agent去執行。
這里可以看出Mesos是一個兩級調度系統。Mesos本身只對Framework做資源調度,然后由各個Framework根據自己的策略針對task進行資源調度。
Yarn資源調度簡介

圖 2
圖2是Yarn的資源調度架構圖。與Mesos類似由提供資源的NodeManager、負責調度資源的ResourceManager、使用資源的Application(圖中的AppMaster)構成。
- NodeManager將自己的資源(CPU、內存等)報告給ResourceManager。
- Client向ResourceManager提交作業(相當于一個Application)。
- ResourceManager為Application啟動一個AppMaster。
- AppMaster為Application向ResourceManager請求資源。
- ResourceManager根據調度策略為Application分配資源,并通知相應的NodeManager去執行task。
Yarn也可以說是一個兩級調度系統,但是AppMaster只能向ResourceManager請求資源(同時可以設定一些條件),最終哪個NodeManager執行哪個task則是由ResourceManager決定。相比Mesos的Framework自己決定執行task的Agent,AppMaster的調度權限比較低。
Apache Myriad:集成Mesos&Yarn
基本思路:把Yarn當作Mesos上的一個Framework來使用。

圖 3
如圖3所示,ResourceManager中的YarnScheduler被MyriadScheduler取代了。MyriadScheduler繼承YarnScheduler并實現了MesosFramework Scheduler接口。這樣ResourceManager就能夠接受Mesos master提供(offer)的資源,并且還具有原來Yarn Scheduler一樣的功能。另外Myriad還實現了管理NodeManager的Executor。整個過程是:
- Agent 1(黃色文本框中S1) 報告資源給Mesos master。
- Mesos master按照策略提供資源(這里是Agent1的一半)給ResourceManager。
- ResourceManager接受Mesosmaster提供的資源,要求Mesos master在Agent1上啟動NodeManager1(黃色文本框中NM1)。
- Agent1啟動NodeManager1。
- NodeManager 1將自己的資源(來源于之前Mesosmaster的offer)報告給ResourceManager。
于是在Mesos集群上建立了一個Yarn集群,其資源來源于Mesosmaster的offer,也就是說Yarn被置于Mesos的管理之下。為了方便Yarn集群動態擴、縮容,Myriad還提供了相應的WebUI和WebAPI。通過這個方案,實現了Yarn集群和Mesos集群共享物理資源。
實例

圖 4

圖 5

圖 6
如圖4所示,我們在Mesos上啟動了一個叫做“MyriadAlpha”的Myriad Framework,并擁有1個task(“4.4CPU,5.4G內存”),如圖5可以從Myriad的WebUI上看到該task,其實該task對應了一個NodeManager。如圖6(ResourceManager的WebUI)顯示了該NodeManager所在的物理機以及向ResourceManager報告的資源(“4VCore,4G內存”,※配置了1CPU=1VCore)。Mesos和ResourceManager上顯示的資源差是NodeManager本身使用的資源。
接下來我們利用Myriad的WebUI(也提供了WebAPI)對Yarn集群進行擴容。

圖 7
如圖7所示我們將增加2個NodeManager,每個NodeManager向Yarn集群提供“2CPU,2G內存”。

圖 8
如圖8顯示增加了2個Task(對應于NodeManager)。

圖 9
如圖9 ResourceManager WebUI顯示已有2個NodeManager加入集群,提供的資源均為“2VCore,2GB內存”。

圖 10
最后如圖10 Mesos WebUI上顯示了啟動的Task(也就是NodeManager)數和已分配的資源。
總結
通過Apache Myriad,Mesos可以統一地管理整個數據中心的物理資源,然后由ResourceManager從中獲得資源建立Yarn集群并進行擴、縮容。這樣本來運行于Yarn上面的應用如MapReduce、Tez、Hive等就能不加改變的運行(還是由Yarn來調度),但是它們使用的物理資源來源于Mesos。另外隨著Yarn的Docker Container Executor(DCE) 項目的完成,將實現整個集群的容器化。
文中為了便于說明這個過程上面的例子是手動進行的,如果利用“Fine-grained Scaling”,Myriad可以根據執行作業需要的實際資源動態的對NodeManager進行擴、縮容(具體細節與上例有差別)。
作者介紹:鄭輝,現PPTV研發中心架構師,專注于大數據、云計算,目前主要研究PPTV大數據平臺與容器平臺融合的相關技術。之前是日本一家互聯網公司的Hadoop技術負責人,同時也參與Apache社區HDFS、Hive項目的開發工作。
來自:http://dockone.io/article/1731