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++编译而来的本地库。

NameLanguage
Scheduler LibraryC++
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()回调频率的同时,建议增加缓存机制。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值