发布于 2015-12-05 11:05:21 | 585 次阅读 | 评论: 0 | 来源: 网络整理
Mesos master 的用于确定哪些框架资源的逻辑,是封装 在分配器模块里的。分配器是一个可插入组件,Mesos 可以使用它来实现自己的共享策略,例如fair-sharing、优先级等,或调整默认等级优势资源公平算法((见DRF 文献 )。
使用定制的分配器,便一个必须:
* 实现分配器接口``` mesos/master/allocator.hpp```
* 包装分配器实现到模块然后在Mesos master中加载
分配器模块是在c++中实现的,Mesos 也是c++写的。他们的子类中定义的分配器接口在mesos/master/allocator.hpp
。但是,你的实现可以是一个c++代理,这表明调用实际的分配器的语言是可以选择的。
默认的分配器是
HierarchicalDRFAllocatorProcess
,位置在$MESOS_HOME/src/master/allocator/mesos/hierarchical.hpp
。像大多数便组件,它是基于actor的,这意味着所有接口方法是无阻塞的,并且返回后立即将相应的执行加载到执行者的队列。如果你想以类似的方式设计定制分配器,在
$MESOS_HOME/src/master/allocator/mesos/allocator.hpp
中定义子类。然后在MesosAllocator
封装基于actor 的MesosAllocator
分配器。这将调用底层的执行者和控制它的生命周期。您可以参考HierarchicalDRFAllocatorProcess
.
此外,内置的分层分配器可以扩展,而不需要重新实现整个分配的逻辑。这可以通过使用theSorter
抽象类。Sorters
定义层次结构层的顺序(如角色或框架),通过调用“客户端”对象和一些客户信息,应该提供资源,返回客户的有序列表。
分类器是在c++和继承中实现Sorter
类的,这定义在$MESOS_HOME/src/master/allocator/sorter/sorter.hpp
。默认分类器是DRFSorter
,实现了公平分享,相关位置在$MESOS_HOME/src/master/allocator/sorter/drf/sorter.hpp.
。这个分类器能够根据权重,表决出优先顺序,需要指定-add()
。每个客户端的资源是通过它的权重而来的。例如,一个权重为2的客户端将比权重为1的客户端得到两倍的资源。
编写一个定制的分配器,下一步是要重写内置的实现。这个过程包括几个步骤:
* 封装你的分配器便分配器模块,
* 在Mesos maste 加载这个模块
一个分配器模块是一个工厂函数和模块描述、在定义 mesos/module/allocator.hpp
. 定义。假设分配逻辑由theExternalAllocator
实现类中声明external_allocator
。
以下代码片段描述了一个实现名为ExternalAllocatorModule
的分配器模块 :
#include <mesos/master/allocator.hpp>
#include <mesos/module/allocator.hpp>
#include <stout/try.hpp>
#include "external_allocator.hpp"
using namespace mesos;
using mesos::master::allocator::Allocator;
using mesos::internal::master::allocator::HierarchicalDRFAllocator;
static Allocator* createExternalAllocator(const Parameters& parameters)
{
Try<Allocator*> allocator = ExternalAllocator::create();
if (allocator.isError()) {
return NULL;
}
return allocator.get();
}
// Declares an ExternalAllocator module named 'ExternalAllocatorModule'.
mesos::modules::Module<Allocator> ExternalAllocatorModule(
MESOS_MODULE_API_VERSION,
MESOS_VERSION,
"Mesos Contributor",
"engineer@example.com",
"External Allocator module.",
NULL,
createExternalAllocator);
请参阅便模块文档说明如何编译和加载模块便主人。