发布于 2015-12-05 11:06:14 | 474 次阅读 | 评论: 0 | 来源: 网络整理
Mesos 模块介绍基于Mesos 0.21.0。
* Mesos 的使用和开发中出现的风险,由使用方承担!
* 所有相关问题,请您直接发邮件给相关模块的作者,或邮件给modules@mesos.apache.org。
Mesos 模块提供了一种方便扩展其内部运作的方式,即通过创建和使用共享库,使之可以在需要时加载。模块可以用来定制化,无需为每个特定的用例重新编译。模块可以分隔外部依赖使之成为独立的库, 这最终成为了Mesos的一个核心功能。这样模块也可以很容易地测试新的功能。例如,假设可加载的分配器包含VM(Lua,Python,…),可以尝试新的用脚本语言写的分配器算法,而不用被迫使那些依赖关系增加到项目中。总结就是,模块提供了一种简单的方法,可以使Mesos轻松的被第三方模块扩展,而第三方模块却不必知道所有Mesos的内部细节。
命令行标志--modules
用于Mesos master ,slave 和测试指定的模块列表的加载情况和在内部子系统的可用情况。
使用 --modules=filepath
来指定列表模块 ,所指的文件中应包含被JSON格式化的字符串, 。“filepath”的格式应该是‘file:///path/to/file’
或 ‘/path/to/file’
.的形式。
使用--modules="{...}"
在命令行指定模块列表。
*. 加载库libfoo.so
,其中包含两个模块org_apache_mesos_bar
和org_apache_mesos_baz
。
{
"libraries": [
{
"file": "/path/to/libfoo.so",
"modules": [
{
"name": "org_apache_mesos_bar",
},
{
"name": "org_apache_mesos_baz"
}
]
}
]
}
*. 从foo
加载模块org_apache_mesos_bar
和传递命令行参数X和Y值(模块加载org_apache_mesos_baz
没有任何命令行参数):
{
"libraries": [
{
"name": "foo",
"modules": [
{
"name": "org_apache_mesos_bar"
"parameters": [
{
"key": "X",
"value": "Y",
}
]
},
{
"name": "org_apache_mesos_baz"
}
]
}
]
}
*. 在命令行中指定
--modules='{"libraries":[{"file":"/path/to/libfoo.so", "modules":[{"name":"org_apache_mesos_bar"}]}]}'
对于每一个library,至少有一个的“file”或“name”参数必须被指定。“file”参数可能指一个文件名(例如“libfoo.so”),相对路径(如“myLibs / libfoo.so”)或绝对路径(例如“/home/mesos/lib/libfoo.so”)。“name”参数是指库名称(如“foo”)。如果“name”被指定了,它会在当前平台上自动改为一个合适的库名称(如在Linux上:“foo”自动改为“libfoo.so”。在OS X 改为“libfoo.dylib”)。
如果库路径没有在“file”中指定参数,库就会搜索标准库的路径或目录:LD_LIBRARY_PATH
(在OS X上是:DYLD_LIBRARY_PATH
)。
如果“file”和“name”两个都指定了,“name”将被忽略。
Mesos master’s 分配器定期确定哪些框架(s)应该提供集群的可用资源。分配器模块使试验专用的资源分配算法。这些可能是一个分配程序的一个例子,它提供了一个主导资源公平分配程序。
在Mesos master加载自定义分配器,你需要:
--modules
配置,--allocator
。
例如,下面的命令将运行Mesos master,其内包含ExternalAllocatorModule
(见本节为JSON格式):./bin/mesos-master.sh --work_dir=m/work --modules="file://<modules-including-allocator>.json" --allocator=ExternalAllocatorModule
匿名模块不会收到任何回调, 它与他们的父进程共存。 与其他命名模块不同的是,一个匿名模块并不直接提供基本便功能(如一个隔离器模块)。和装饰模块也不同,它也不直接提供添加或注入数据。 匿名模块不需要任何特定的选择器(标志),Mesos master 或 slave 通过--modules, 他们会立即被实例化
验证模块允许第三方快速开发和插件的新身份验证方法。这样的模块可以支持PAM(LDAP、MySQL NIS,UNIX)对身份的验证。
类似于Apache web服务器模块,hooks 允许模块作者绑定模块到内部组件,模块可能不完全适合内部组件,但是可以被定义操作,这就是所谓的hooks。
可用的hook API中在Mesos中定义为hook.hpp 。每个hook 定义了插入点和可用的上下文。一个示例就是任务信息传递给master 的LaunchTaskHook
。
一些hooks 在一个对象(例如 任务信息)并返回全部或部分的对象(如 任务标签),以可以修改或替换动态内容。这些hooks 被称为。
为了支持装饰模块删除元数据(环境变量或标签),其返回值的定义Mesos做了一些改变,请参见Mesos 0.23.0(如下)。
状态 (0.22.x)版本之前 (0.23.0+)版本后 Error Error is propagated to the call-site No change None The result of the decorator is not applied No change Some The result of the decorator is appended The result of the decorator overwrites the final labels/environment object
在Mesos中加载一个hook,你需要:
* 把hook通过 --modules 的方式,介绍给Mesos.
* 通过--hooks标识选择它
例如,下面的命令将运行有TestTaskHook hook的Mesos slave :
./bin/mesos-slave.sh --master=<IP>:<PORT> --modules="file://<path-to-modules-config>.json" --hooks=TestTaskHook
隔离器模块支持试验专门隔离和监视功能。这些例子可以是第三方的资源隔离机制的GPGPU硬件,网络,等等。
以下代码片段描述了一个模块的实现名为“org_apache_mesos_bar”的“TestModule”类:
#include <iostream>
#include "test_module.hpp"
class TestModuleImpl : public TestModule
{
public:
TestModuleImpl()
{
std::cout << "HelloWorld!" << std::endl;
}
virtual int foo(char a, long b)
{
return a + b;
}
virtual int bar(float a, double b)
{
return a * b;
}
};
static TestModule* create()
{
return new TestModule();
}
static bool compatible()
{
return true;
}
// Declares a module named 'org_apache_mesos_TestModule' of
// 'TestModule' kind.
// Mesos core binds the module instance pointer as needed.
// The compatible() hook is provided by the module for compatibility checks.
// The create() hook returns an object of type 'TestModule'.
mesos::modules::Module<TestModule> org_apache_mesos_TestModule(
MESOS_MODULE_API_VERSION,
MESOS_VERSION,
"Apache Mesos",
"modules@mesos.apache.org",
"This is a test module.",
compatible,
create);
以下假设Mesos 安装在标准的位置,即Mesos 动态库和头文件是可用的。 g++ -lmesos -fpic -o test_module.o test_module.cpp $ gcc -shared -o libtest_module.so test_module.o
除了显式使用–modules标识测试模块 ,通常运行整个mesos 测试套件 加上给定的模块。例如,下面的命令将运行mesos 测试套件 ,其中给定org_apache_mesos_TestCpuIsolator 隔离 模块: ./bin/mesos-tests.sh --modules="/home/kapil/mesos/isolator-module/modules.json" --isolation="org_apache_mesos_TestCpuIsolator"
每个模块的名字应该是唯一的。在Json字符串有重复的模块名称会导致进程异常中止。 因此,我们鼓励模块作者定义名字模块根据Java包命名方(http://docs.oracle.com/javase/tutorial/java/package/namingpkgs.html)。 例如:
Module NameModule Domain nameModule Symbol Namefoobarmesos.apache.orgorg_apache_mesos_foobarbarBazexample.comcom_example_barBaz
简而言之:保持模块名称。小写和反向域。——单独的强调。不直接使用类名作为模块的名字。——不同的模块从相同的组织仍然需要不同的名称。
在装载以上模块,动态库包含模块需要加载到Mesos 。这在Mesos 启动时加载。当引入新模块类型 时,Mesos 开发人员不需要碰代码。但是,开发人员负责登记新模块,包括版本信息,以保证任何给定的模块将保持兼容。这些信息保存在一个表src/module/manager.cpp. 。一个条目为一个模块,每个都有一个相应的Mesos 发布版本号。这个数字需要开发人员维护,以和当前的Mesos 版本以及模块之间的兼容性,。在旧Mesos 版本中的模块不能直接写到后来的版本。
为了成功加载模块,不同版本之间必须存在以下关系:
kind version <= Library version <= Mesos version
Mesos kind version Library Is module loadable Reason 0.18.0 0.18.0 0.18.0 yes 0.29.0 0.18.0 0.18.0 yes 0.29.0 0.18.0 0.21.0 yes 0.18.0 0.18.0 0.29.0 NO Library compiled against a newer Mesos release. 0.29.0 0.21.0 0.18.0 NO Module/Library older than the kind version supported by Mesos. 0.29.0 0.29.0 0.18.0 NO Module/Library older than the kind version supported by Mesos.
不兼容的更改记录模块API。
* Added support for module-specific command-line parameters.
添加特定于模块支持命令行参数
* Changed function signature for create().
改变了创建()函数签名。
模块的初始版本的API。
JSON Schema:
{
"type":"object",
"required":false,
"properties":{
"libraries":{
"type":"array",
"required":false,
"items":{
"type":"object",
"required":false,
"properties":{
"file":{
"type":"string",
"required":false
},
"name":{
"type":"string",
"required":false
},
"modules":{
"type":"array",
"required":false,
"items":{
"type":"object",
"required":false,
"properties":{
"name":{
"type":"string",
"required":true
},
"parameters":{
"type":"array",
"required":false,
"items":{
"type":"object",
"required":false,
"properties":{
"key":{
"type":"string",
"required":true
},
"value":{
"type":"string",
"required":true
}
}
}
}
}
}
}
}
}
}
}
}