Mesos Framework開發

Mesos 介紹

Mesos 官網是這樣介紹自己的:

Program against your datacenter like it’s a single pool of resources

Apache Mesos abstracts CPU, memory, storage, and other compute resources away from machines (physical or virtual), enabling fault-tolerant and elastic distributed systems to easily be built and run effectively.

翻譯過來就是:

Mesos 使你的數據中心看起來像一個資源池。

Apache Mesos 將CPU、內存、存儲和其他計算資源從機器(物理機或虛擬機)中抽象出來,從而使容錯和彈性的分佈式系統易於構建和有效運行。

通俗來講就是:

Mesos 作爲主機上各種資源的管理者,使你可以在Mesos之上更方便地維護和使用這些資源,進行程序的分佈式運行和管理。

更詳細的介紹可以去官網查看文檔。

Mesos Framework 介紹

Mesos Framework 由兩部分組成:

  • Scheduler 框架器
  • Executor 執行器

既然Mesos是主機資源的管理者,那麼Framework中的Scheduler就是主機資源的調度者,它負責決定使用哪些資源下發哪些任務,而Executor就是下發任務工作的執行者,它真正地負責執行任務的運行工作。

Mesos 會將主機上的資源抽象成一片片的資源邀約(resources offer),不斷的發給以特定角色(role)註冊在Mesos上的Scheduler,然後Scheduler拿到這些offer後,根據是否是任務所需的將這些offer進行拒絕(decline)或接受(accept),如果可以接受這個offer,就要告訴Mesos Master我要用多少資源,以及下發什麼樣的任務,之後Mesos Master將這些信息經過一系列的流轉,最終通知給每臺主機上運行的Executor,實現任務在主機上的運行工作。

Framework Scheduler 開發

在瞭解了Mesos Framework的大致原理後,就可以嘗試開發Framework了,本文主要介紹Scheduler的開發。

Mesos官網文檔中有對於Framework開發的指導 Framework Development Guide,我提取了其中比較關鍵的地方:

框架開發指南

對於Scheduler開發,有兩種方式:

  • 通過實現SchedulerDriver C++ 接口,建議Mesos 0.28.0 or 更老的版本
  • 通過HTTP API ,建議Mesos 1.0 or 更新的版本

對於第一種方式,Scheduler開發人員通過註冊事件回調方法,來實現自定義的調度邏輯。因爲SchedulerDriver 接口是用C++編寫的,這要求Scheduler開發人員使用C++語言,其他語言使用C++編譯而來的本地庫。

Name Language
Scheduler Library C++
Scheduler Adapter (depends on native libmesos) Java

第二種方式,是新版本Mesos推薦的用法,各種語言現成的的庫也有很多,詳情查看: HTTP API client libraries

隨後會通過示例程序,來介紹這兩種方式的環境搭建。

爲了保證多Scheduler的可擴展性,Mesos給了以下建議:

  • 使用 Suppress:調用Suppress後,Mesos就不再給Scheduler發送資源Offer。在沒有任務要下發或沒有其他對offer的操作時,Scheduler必須保持suppressed狀態,以確保Mesos更有效地爲其他Scheduler提供offer。

  • 不要長時間持有Offers: 如果某些Offers不是Scheduler所需的,請立馬拒絕(decline)掉它。否則,這些資源Offers就無法提供給其他的Scheduler,並且本身收到的資源offers也會減少。

  • 使用一個較大超時時間拒絕Decline 資源Offers: 當拒絕一個offer時,設置一個較大的 Filters.refuse_seconds 超時 (例如 1 hour)。這可以確保Mesos有時間去嘗試向其他的Scheduler提供資源offers(作者認爲,這個時間需要具體情況具體分析,比如需要任務重試時,這個超時就不能太大) 。但是,如果Scheduler最終無法進入SUPPRESSED狀態,並且在拒絕後有新的任務要下發時,則在一段時間內,如果沒有接收到足夠的資源Offers,則應考慮使用REVIVE進行恢復。

  • 不要頻繁地調用REVIVE: 調用REVIVE會清除掉所有的filters,並且,如果頻繁地調用REVIVE ,就相當於使用很短的超時時間去拒絕offer。

  • 設置 FrameworkInfo.offer_filters: 在Scheduler的配置中設置這個參數,可以指定全局的filters。目前支持的參數爲OfferFilters.min_allocatable_resources,在集羣層面也有這個配置(使用--min_allocatable_resources進行指定),可以前者對每個角色進行配置,去覆蓋掉後者的配置。使用一個想要收到的最小Offer的大小來設置FrameworkInfo.offer_filters,能夠確保Scheduler能夠更好的收到足夠合適大小的Offer。

在操作上,當有不同的Scheduler共存時,可以做以下事情來確保Scheduler能夠獲取它們所需的資源:

  • 不在Schedulers之間共享同一個Role
  • 使用quota給角色分配資源
  • 設置最小分配資源量
  • 考慮啓用隨機排序

Scheduler 開發示例

我在github上放了兩個示例程序,分別使用上面提到的兩種方式。

通過實現SchedulerDriver接口

github地址:mesos-framework-demo

語言:Java

由於使用了C++本地庫,所以在運行jar包時,要在/usr/local/lib放入mesoslib.so文件,也可以通過設置環境變量來改變這個路徑:

MESOS_NATIVE_JAVA_LIBRARY=/usr/local/lib/mesoslib.so

查看clone下來的代碼,完成的工作有:

1.設置FrameworkInfo,主要包括:

  • user 指定executor或task的運行用戶

  • name 指定Framework的名字

  • id 指定Framework的唯一標識

  • failoverTimeout 指定等待故障排除的時間,超過這個時間未重新註冊,框架及其下運行的任務將會被移除

  • role 角色名

2.實現org.apache.mesos.Scheduler接口的方法,主要包括:

  • registered() 註冊成功時回調
  • resourceOffers() 資源Offers到達時回調
  • statusUpdate() 任務狀態有更新時回調
  • reregistered() 重新註冊時回調

3.配置Zk地址,用於發現Mesos Master

完成以上配置及實現,即可實現了一個簡單的Framework Scheduler,當註冊成功後,在Mesos的/frameworks頁面,可以看到你啓動的Framework。

示例項目中,mesos.proto是數據的結構定義,裏面有各種數據的類型與結構關係。

通過HTTP API

github地址:mesos-framework-go-example

語言:golang

爲了方便,使用了現成的第三方工具 mesos-go

要做的工作相比第一種方式,第三步不再是配置Zk地址,而是配置Mesos的scheduler接口地址:

Url: "http://localhost:5050/api/v1/scheduler",
開發建議
  • 選擇合適的數據存儲中間件,例如:Zookeeper、Etcd、Mysql
  • 使用多實例,保證高可用
  • 如果在resourceOffers()回調方法中存在Http請求或數據訪問,在使用Filters.refuse_seconds 控制resourceOffers()回調頻率的同時,建議增加緩存機制。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章