簡介:描述了如何基于Mesos構(gòu)建應(yīng)用. Framework開發(fā)指南 在本文檔中,我們把Mesos程序集稱為Framework。 你可以在源代碼目錄MESOS_HOME/src/examples/看到FrameworkScheduler的例子。通過例子來理解MesosFrameworkScheduler并選擇你喜歡語言進(jìn)行執(zhí)行。RENDLER提供了以C++,Go,Haskell,Java,Python和Scala語言所實(shí)現(xiàn)的Framework例子供你選擇。 創(chuàng)建框架Scheduler(Framework Scheduler) 你可以用C、C++、Java/Scala或者Python語言編寫一個(gè)框架Scheduler,它需要繼承Scheduler類(見下面Scheduler API)。Scheduler應(yīng)當(dāng)創(chuàng)建一個(gè)SchedulerDriver(負(fù)責(zé)Scheduler和Mesos master的通信),然后調(diào)用SchedulerDriver.run()函數(shù)。 SchedulerAPI(Scheduler API) 用framework schedulers程序?qū)崿F(xiàn)的回調(diào)接口。 聲明如下代碼位于:MESOS_HOME/include/mesos/scheduler.hpp 。 /* * 空的虛擬的析構(gòu)函數(shù) (需要把析構(gòu)函數(shù)實(shí)例化成子類). */ virtual ~Scheduler() {} /* * 函數(shù)在當(dāng)Scheduler成功在MesosMaster中注冊(cè)時(shí)被調(diào)用。 * FrameworkID是在Framework中由Master生成一個(gè)唯一的ID,用于區(qū)別其他Scheduler。 * MasterInfo以參數(shù)的形式提供當(dāng)前的Master IP地址和端口。 */ virtual void registered(SchedulerDriver* driver, const FrameworkID& frameworkId, const MasterInfo& masterInfo) = 0; /* * 函數(shù)在Scheduler再次在新當(dāng)選的Master注冊(cè)時(shí)被調(diào)用。 *只有當(dāng)Scheduler以前被注冊(cè)過時(shí)調(diào)用。 * MasterInfo以參數(shù)的形式表示新當(dāng)選的Master的更新信息。 */ virtual void reregistered(SchedulerDriver* driver, const MasterInfo& masterInfo) = 0; /* * 函數(shù)在Scheduler與Master變成"無鏈接"時(shí)被調(diào)用。 * (舉例來說, 當(dāng)前Master關(guān)閉并由其他的Master接管)。 */ virtual void disconnected(SchedulerDriver* driver) = 0; /* * 函數(shù)在資源已經(jīng)被提供給這個(gè)Framework時(shí)被調(diào)用。最簡單的offer僅包含一個(gè)簡單slave的資源。 * 這些資源以一個(gè)offer的形式打包提供給當(dāng)前Framework對(duì)象,除非發(fā)生異常情況,則不在提交。 * 第一種當(dāng)前或者某個(gè)Framework拒絕了這些資源,才能夠再次提交offer。 * (請(qǐng)查看 SchedulerDriver::launchTasks) 或者第二種情況取消了這些資源。 * (請(qǐng)查看 Scheduler::offerRescinded)。 * 注意:資源可能在同一時(shí)間提交給一個(gè)或者多個(gè)Framework(根據(jù)分配器的分配情況)。 * 如果上面的事情發(fā)生, 首先拿到offer的Framework將會(huì)使用這些資源來啟動(dòng)Tasks,導(dǎo)致其他Tasks獲取 * offer的Framework取消這些資源的使用(或者某個(gè)Framework已經(jīng)使用這些資源啟動(dòng)了Tasks, * 這些Tasks將會(huì)伴隨著TASK_LOST狀態(tài)而失敗,并發(fā)送過多的消息通知)。 */ virtual void resourceOffers(SchedulerDriver* driver, const std::vector<Offer>& offers) = 0; /* * 函數(shù)在某個(gè)offer不在有效時(shí)被調(diào)用。(舉例來說, 節(jié)點(diǎn)不可用或者資源被其他Framework的offer占用)。 * 如下發(fā)生以下情況offer均不會(huì)撤銷 (舉例來說, 丟棄信息,Framework運(yùn)行失敗,等等。), * 當(dāng)Framework嘗試啟動(dòng)那些沒有有效offer的Tasks時(shí),Framework會(huì)收到那些Tasks發(fā)送TASK_LOST的狀態(tài)更新 * (請(qǐng)查看Scheduler::resourceOffers). */ virtual void offerRescinded(SchedulerDriver* driver, const OfferID& offerId) = 0; /* * 函數(shù)在一個(gè)Tasks的狀態(tài)發(fā)生變化時(shí)被調(diào)用。(舉例來說, 一個(gè)節(jié)點(diǎn)(slave)丟失并且Tasks丟失, * 一個(gè)Tasks完成并且Executors發(fā)送了一個(gè)狀態(tài)更新回話,等等)。 如果使用隱式定義implicit * acknowledgements, 以 _acknowledges_ 的收據(jù)作為這個(gè)狀態(tài)的更新作為回調(diào)函數(shù)返回! * 如果發(fā)生Scheduler無論何種原因在回調(diào)函數(shù)的時(shí)候終止(或者進(jìn)程退出)另一個(gè)狀態(tài)更新將會(huì)被提交 * (注意,無論如何,如果slave發(fā)送狀態(tài)更新是丟失或者失敗。在那段時(shí)間是不正確的)。 * 如果使用的是顯示explicit acknowledgments,Scheduler必須在驅(qū)動(dòng)中知道這個(gè)狀態(tài)。 */ virtual void statusUpdate(SchedulerDriver* driver, const TaskStatus& status) = 0; /* * 函數(shù)在當(dāng)Executors發(fā)送消息時(shí)被調(diào)用。 * 這些消息是盡力服務(wù):在任何可靠的方式下,絕不期望Framework消息會(huì)被重新提交。 */ virtual void frameworkMessage(SchedulerDriver* driver, const ExecutorsID& ExecutorsId, const SlaveID& slaveId, const std::string& data) = 0; /* * 函數(shù)在當(dāng)某個(gè)slave確定不能找到時(shí)被調(diào)用。(舉例來說,設(shè)備故障,網(wǎng)絡(luò)隔離)。 * 絕大部分Framework會(huì)以在新的slave上重新啟動(dòng)所有Tasks的方式進(jìn)行調(diào)度。 */ virtual void slaveLost(SchedulerDriver* driver, const SlaveID& slaveId) = 0; /* * 函數(shù)在Executors退出或者中斷時(shí)被調(diào)用。注意:任何Tasks的運(yùn)行將會(huì)自動(dòng)生成TASK_LOST的狀態(tài)更新。 */ virtual void ExecutorsLost(SchedulerDriver* driver, const ExecutorsID& ExecutorsId, const SlaveID& slaveId, int status) = 0; /* * 函數(shù)在一個(gè)未被Scheduler或者Scheduler驅(qū)動(dòng)不能捕獲的錯(cuò)誤發(fā)生時(shí)被調(diào)用。 * Scheduler驅(qū)動(dòng)將會(huì)在這個(gè)回調(diào)函數(shù)執(zhí)行之前執(zhí)行。 */ virtual void error(SchedulerDriver* driver, const std::string& message) = 0;
|
|