简介:描述了如何基于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;
|
|