什么是Mesos Framework开发
今天就跟大家聊聊有关什么是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()
回调频率的同时,建议增加缓存机制。
看完上述内容,你们对什么是Mesos Framework开发有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。