84921936 2016-10-10
简介:描述了如何基于Mesos构建应用.
Framework开发指南
在本文档中,我们把Mesos程序集称为Framework。
你可以在源代码目录MESOS_HOME/src/examples/看到FrameworkScheduler的例子。通过例子来理解MesosFrameworkScheduler并选择你喜欢语言进行执行。RENDLER提供了以C++,Go,Haskell,Java,Python和Scala语言所实现的Framework例子供你选择。
创建框架Scheduler(Framework Scheduler)
你可以用C、C++、Java/Scala或者Python语言编写一个框架Scheduler,它需要继承Scheduler类(见下面Scheduler API)。Scheduler应当创建一个SchedulerDriver(负责Scheduler和Mesos master的通信),然后调用SchedulerDriver.run()函数。
SchedulerAPI(Scheduler API)
用framework schedulers程序实现的回调接口。
声明如下代码位于:MESOS_HOME/include/mesos/scheduler.hpp 。
/*
* 空的虚拟的析构函数 (需要把析构函数实例化成子类).
*/
virtual ~Scheduler() {}
/*
* 函数在当Scheduler成功在MesosMaster中注册时被调用。
* FrameworkID是在Framework中由Master生成一个唯一的ID,用于区别其他Scheduler。
* MasterInfo以参数的形式提供当前的Master IP地址和端口。
*/
virtual void registered(SchedulerDriver* driver,
const FrameworkID& frameworkId,
const MasterInfo& masterInfo) = 0;
/*
* 函数在Scheduler再次在新当选的Master注册时被调用。
*只有当Scheduler以前被注册过时调用。
* MasterInfo以参数的形式表示新当选的Master的更新信息。
*/
virtual void reregistered(SchedulerDriver* driver,
const MasterInfo& masterInfo) = 0;
/*
* 函数在Scheduler与Master变成"无链接"时被调用。
* (举例来说, 当前Master关闭并由其他的Master接管)。
*/
virtual void disconnected(SchedulerDriver* driver) = 0;
/*
* 函数在资源已经被提供给这个Framework时被调用。最简单的offer仅包含一个简单slave的资源。
* 这些资源以一个offer的形式打包提供给当前Framework对象,除非发生异常情况,则不在提交。
* 第一种当前或者某个Framework拒绝了这些资源,才能够再次提交offer。
* (请查看 SchedulerDriver::launchTasks) 或者第二种情况取消了这些资源。
* (请查看 Scheduler::offerRescinded)。
* 注意:资源可能在同一时间提交给一个或者多个Framework(根据分配器的分配情况)。 * 如果上面的事情发生, 首先拿到offer的Framework将会使用这些资源来启动Tasks,导致其他Tasks获取
* offer的Framework取消这些资源的使用(或者某个Framework已经使用这些资源启动了Tasks,
* 这些Tasks将会伴随着TASK_LOST状态而失败,并发送过多的消息通知)。
*/
virtual void resourceOffers(SchedulerDriver* driver,
const std::vector<Offer>& offers) = 0;
/*
* 函数在某个offer不在有效时被调用。(举例来说, 节点不可用或者资源被其他Framework的offer占用)。
* 如下发生以下情况offer均不会撤销 (举例来说, 丢弃信息,Framework运行失败,等等。),
* 当Framework尝试启动那些没有有效offer的Tasks时,Framework会收到那些Tasks发送TASK_LOST的状态更新
* (请查看Scheduler::resourceOffers).
*/ virtual void offerRescinded(SchedulerDriver* driver,
const OfferID& offerId) = 0;
/*
* 函数在一个Tasks的状态发生变化时被调用。(举例来说, 一个节点(slave)丢失并且Tasks丢失,
* 一个Tasks完成并且Executors发送了一个状态更新回话,等等)。 如果使用隐式定义implicit
* acknowledgements, 以 _acknowledges_ 的收据作为这个状态的更新作为回调函数返回!
* 如果发生Scheduler无论何种原因在回调函数的时候终止(或者进程退出)另一个状态更新将会被提交
* (注意,无论如何,如果slave发送状态更新是丢失或者失败。在那段时间是不正确的)。
* 如果使用的是显示explicit acknowledgments,Scheduler必须在驱动中知道这个状态。
*/
virtual void statusUpdate(SchedulerDriver* driver,
const TaskStatus& status) = 0;
/*
* 函数在当Executors发送消息时被调用。
* 这些消息是尽力服务:在任何可靠的方式下,绝不期望Framework消息会被重新提交。 */
virtual void frameworkMessage(SchedulerDriver* driver,
const ExecutorsID& ExecutorsId,
const SlaveID& slaveId,
const std::string& data) = 0;
/*
* 函数在当某个slave确定不能找到时被调用。(举例来说,设备故障,网络隔离)。
* 绝大部分Framework会以在新的slave上重新启动所有Tasks的方式进行调度。
*/
virtual void slaveLost(SchedulerDriver* driver,
const SlaveID& slaveId) = 0;
/*
* 函数在Executors退出或者中断时被调用。注意:任何Tasks的运行将会自动生成TASK_LOST的状态更新。
*/
virtual void ExecutorsLost(SchedulerDriver* driver,
const ExecutorsID& ExecutorsId, const SlaveID& slaveId,
int status) = 0;
/*
* 函数在一个未被Scheduler或者Scheduler驱动不能捕获的错误发生时被调用。
* Scheduler驱动将会在这个回调函数执行之前执行。
*/
virtual void error(SchedulerDriver* driver,
const std::string& message) = 0;
http://blog.csdn.net/a515983690/article/details/51446043