当前位置: 首页 > 科技观察

ApacheMesos底层基础库

时间:2023-03-13 22:57:36 科技观察

1。ProtocolbufferProtocalBuffer是Google用于数据交换的开源库。常用于跨语言的数据访问,其作用一般是对象的序列化/反序列化。另一个类似的开源软件是Facebook的开源thrift。它们最大的区别是thrift提供了自动生成RPC的功能,而ProtocolBuffer需要自己实现,但是ProtocolBuffer的一个优点是它的序列化/反序列化非常高效。2.LibprocessLibprocess是一种用C/C++编写的高效消息传递编程模型(一种基于消息传递的网络通信模型,而非RPC),由Berkeley开源。它的整个实现非常简单,包括最基本的消息发送和接收。2.1Libprocess模型在mesos中,主要有四种角色,分别是:mesos-master,mesos-slave,framework(Hadoop/Spark/MPI等)scheduler,executor(在mesos-slave上执行framework任务的组件),其中每一个角色都是一个Process,它在实现的时候继承了libprocess中的ProtobufProcess类(它继承了Process类)。这样,它们都会被编译成一个socketserver,在后台运行,不断监听protocolbuffer消息,如下图:2.2各种常用函数的组合Libprocess+protocolbuffer最重要的消息传递mesos底层基础库(不使用RPC机制)。因为该库使用了基于ProtocolBuffer消息传递的通信机制),效率非常高。Mesos常用的两个头文件是libprocess\include\process下的process.hpp和protobuf.hpp。这两个提供了用于消息传递的API。Process.hpp是核心文件,提供原始接口。而protobuf.hpp是在process.hpp的基础上,增加了ProtocolBuffer对象参数,使ProtocolBuffer更易于使用。(1)installvoidinstall(void(T::*method)(P1C),P1(M::*param1)()const);安装一个处理ProtocolBuffer消息的handler,其中消息类型为M,消息对应的处理函数为method,函数参数为M::*param1。例如:mesos中的slave/slave.cpp:install(&Slave::newMasterDetected,&NewMasterDetectedMessage::pid);安装处理程序来处理NewMasterDetectedMessage(ProtocalBuffer对象)。一旦mesosslave收到消息,就会调用newMasterDetected函数进行处理,而这个函数的入参就是NewMasterDetectedMessage消息中的pid属性。voidinstall(conststd::string&name,void(T::*method)(constUPID&,conststd::string&))安装一个处理字符串的handler,即当接收到字符串名称时,调用function方法进行处理。此API在mesos中的典型应用程序期间维护主从之间的心跳,以确保彼此处于活动状态:在slave/slave.cpp中:install("PING",&Slave::ping);voidSlave::ping(constUPID&from,conststring&body){send(from,"PONG");}inmaster/master.cpp:install("PONG",&SlaveObserver::pong);voidpong(constUPID&from,conststring&body){timeouts=0;pinged=false;}voidtimeout(){if(pinged){//Sowehaven'tgotbackapongyet...if(++timeouts>=MAX_SLAVE_TIMEOUTS){deactivate();return;}}send(slave,"PING");pinged=true;delay(SLAVE_PONG_TIMEOUT,self(),&SlaveObserver::timeout);}(2)sendvoidsend(constprocess::UPID&to,constgoogle::protobuf::Message&message)向某个UPID发送消息,其中UPID代表一个socket,里面包含ip和端口信息,消息message是ProtocolBuffer定义的一个对象。(3)dispatchvoiddispatch(constUPID&pid,conststd::tr1::shared_ptr>&f)执行进程pid中的函数f。为了提高效率,该函数不等到函数f执行完毕,而是采用异步方式:将函数f放入一个函数队列,另一个进程(或多个)不断从队列中获取函数并依次执行它们。(4)delayTimerdelay(doublesecs,constPID&pid,void(T::*method)())延迟调度进程pid中的method方法secs秒,返回一个计数器,通过它可以取消调度。在mesos中,通过这个函数巧妙的构造了一个无限循环,不断检测空闲资源,分配给每一帧。代码如下:voidMaster::initialize(){...timerTickTimer=delay(1.0,self(),&Master::timerTick);}voidMaster::timerTick(){...timerTickTimer=delay(1.0,self(),&Master::timerTick);}以上功能代码段可以完成每1s调用一次timerTick函数的功能。3.Boost是一个非常有名的开源C++基础库。里面的STL非常高效方便,已经被很多著名软件所采用。4、Zookeeper是一个可靠的大型分布式系统的协调系统。它提供的功能包括:配置维护、名称服务、分布式同步、组服务等。Mesos使用zookeeper来解决master单点故障问题。Zookeeper用于构建master集群。当master发生故障时,会选择一个standbymaster成为master。5.glogGoogle开源的C++日志库,主要用于C++程序打印日志,打印格式如下:I041117:26:54.15019320653main.cpp:111]Creating“process”isolationmoduleI041117:26:54.15040020653main.cpp:119]Build:2012-04-1116:50:21byrootI041117:26:54.15065820653main.cpp:120]StartingMesosslaveI041117:26:54.15298120669slave.cpp:191]从站启动。214on5.23:34694I041117:26:54.15302420669slave.cpp:192]从属资源:cpus=2;mem=4906.gmock开源C++单元测试框架7.参考资料(1)Mesos主页:http://www.mesosproject.org/index.html(2)Mesos代码:https://svn.apache.org/repos/asf/incubator/mesos/trunk/原文链接:http://dongxicheng.org/apache-mesos/mesos-base-libarary/