参考
Scheduler Http Api:http://mesos.apache.org/documentation/latest/scheduler-http-api/
Java Api:http://mesos.apache.org/api/latest/java/
任务下发流程
- agent向master汇报心跳
- master基于offerResource接口,将资源offer给scheduler
- scheduler基于自己的任务状态,决定是acceptOffer或者declineOffer,如果当前有合适任务,那么acceptOffer,将任务下发给master
- master将任务下发给agent
- agent执行完成后,通过statusUpdate将任务状态汇报给master
- master将任务执行状态返回给taskScheduler
- taskScheduler完成任务
TaskScheduler开发
当前scheduler开发主要有三个类:
-
Scheduler:
- 框架的回调接口类,开发者必须实现该类
- 当状态发生变更时,master会回调该类的接口,状态包括:scheduler注册,resourceOffer,任务状态变更,slave或者executor异常等
- master回调时,一个时间点只会进行一次回调,因此在实现该类接口时,需要快速进行处理,不要长时间hang住。
-
SchedulerDriver:
- 负责主动发起跟master的交互
- 负责scheduler生命周期管理:注册,启动,停止等
- 负责task的生命周期管理:创建,删除,停止等
- Scheduler状态回调的响应,比如响应offerResource,响应statusUpdate等
-
MesosSchedulerDriver:
- Mesos默认的SchedulerDriver实现
资源Offer
offer_timeout 设置
master默认资源分配策略是消极的,体现在以下几个方面:
1. 当agent汇报资源时,master默认只会先把offer发给一个scheduler,当这个scheduler做出响应(accept或者decline)后,再发给下一个
2. master默认offer_timeout设置是永不超时
3. 只有当scheduler异常退出或者自己显式向master取消注册,master才会回收scheduler对应的offers
基于以上三点,如果当master在处理offer时hang住,或者没有处理该offer信息(比如直接丢弃),那么该offer上的资源将永远无法使用
解决方案:
- master设置offer_timeout,该参数表示,如果scheduler在timeout时间内没有回应offer,那么master就认为offer已经过期,会重新再发起offer
- scheduler在处理offerResource时,如果资源不需要,需要显示使用declineOffer将资源拒绝
Filter过滤器
scheduler在declineOffer时,可以使用filter进行过滤,filter里面有变量refuse_seconds,可以设置对于该offer的refuse时间
资源属性
由于当前Slave在汇报的时候,只是汇报资源信息(CPU/MEM),在某些情况下,我们希望把任务下发到特定类型的Agent上执行,比如CPU主频较高的Agent,OS为Centos7的Agent,OS为windows的Agent等等,现有机制是无法实现的,因为agent并没有汇报这些信息,怎么办呢?
解决方案:
- Agent在向master注册时,可以在slaveInfo里面填充自定义属性Attribute,比如OS信息,CPU主频信息等等
- master再像scheduler提供resourceOffer时,会把master的Attribute属性带到offer中
- scheduler在offerResource响应时,可以检查offer的Attribute属性(即master的Attribute属性),再进行判断