• [zz]mesos 底层基础库


    转载自:http://dongxicheng.org/apache-mesos/mesos-base-libarary/

    1. Protocol buffer

    protocalBuffer是google开源的用于数据交换的库,常用于跨语言的数据访问,担任的角色一般为对象的序列化/反序列化。 另一个与之类似的开源软件是facebook开源的thrift,它们两个最大区别是thrift提供了自动生成RPC的功能而Protocal Buffer需要自己实现,但ProtocalBuffer的一个优势是其序列化/反序列化非常高效。

    2. Libprocess

    libprocess是采用C/C++编写的高效消息传递编程模型(类似actor model,基于事件的模型),由伯克利开源。 其整个实现非常类似Erlang的进程模型,包括最基本的消息发送和接收等。

    2.1 Libprocess模型

    mesos中,主要有四个角色,分别是:mesos-master,mesos-slave,framework(Hadoop/Spark/MPI等) scheduler,executor(在mesos-slave 上执行framework task的组件),每种角色均是一个Process,在实现时会继承libprocess中的ProtobufProcess类(它又继承了 Process类),这样,它们均会编成一个后台运行且不断监听protocal buffer消息的server,如下图所示:

    2.2 各种常用函数

    Libprocess+protocol buffer组合是mesos最底层最重要的消息传递基础库(没有采用RPC机制),由于该库采用了actor model(与Hadoop yarn类似),因而非常高效。Mesos常 用的两个头文件是libprocess\include\process下的process.hpp和protobuf.hpp,这两个提供了用于消息传 递的API,其中process.hpp是最核心的文件,提供了原始的接口,而protobuf.hpp是在process.hpp基础上,加入了 ProtocalBuffer对象参数,使ProtocalBuffer使用起来更加容易。

    (1) install

    void install(void (T::*method)(P1C),P1 (M::*param1)() const);

    安装一个处理ProtocalBuffer消息的handler,其中,消息类型是M,该消息对应的处理函数是method,函数参数为M::*param1。举例:mesos中slave/slave.cpp:

    install(
          &Slave::newMasterDetected,
          &NewMasterDetectedMessage::pid);
    

    安装一个处理NewMasterDetectedMessage(ProtocalBuffer对象)的handler,mesos slave一旦接收到该消息,便会调用newMasterDetected函数处理, 且该函数的输入参数是NewMasterDetectedMessage消息中的pid属性。

    void install(const std::string& name,void (T::*method)(const UPID&, const std::string&))

    安装一个处理字符串的handler,也就是说,当收到字符串name后,调用函数method进行处理。这个API在mesos中的典型应用时维持master与slave之间的心跳,以确定彼此活着:

    在slave/slave.cpp中:

    install("PING", &Slave::ping);
    
    void Slave::ping(const UPID& from, const string& body)
    {
      send(from, "PONG");
    }
    

    在master/master.cpp中:

    install("PONG", &SlaveObserver::pong);
      void pong(const UPID& from, const string& body)
      {
        timeouts = 0;
        pinged = false;
      }
      void timeout()
      {
        if (pinged) { // So we haven't got back a pong yet ...
          if (++timeouts >= MAX_SLAVE_TIMEOUTS) {
            deactivate();
            return;
          }
        }
        send(slave, "PING");
        pinged = true;
        delay(SLAVE_PONG_TIMEOUT, self(), &SlaveObserver::timeout);
      }
    

    (2) send

    void send(const process::UPID& to, const google::protobuf::Message& message)

    向某个UPID上发送消息,其中UPID代表一个socket,里面含有ip和port信息,而消息message是ProtocalBuffer定义的对象。

    (3) dispatch

    void dispatch(const UPID& pid,
      const std::tr1::shared_ptr >& f)
    

    执行进程pid中的函数f,为了提高效率,该函数并不会等到函数f执行完成,而是采用了异步的方法:将函数f放入一个函数队列,由另外一个进程(或者多个)不断从队列中获取函数,依次执行。

    (4) delay

    Timer delay(double secs,const PID& pid,void (T::*method)())

    延迟secs秒调度进程pid中的方法method,并返回一个计数器,通过这个计时器,可取消该调度。

    mesos中,巧妙地通过该函数构造了一个无限循环以不断检测空闲资源,并将之分配给各个框架,代码如下:

    void Master::initialize() {
    ……
      timerTickTimer = delay(1.0, self(), &Master::timerTick);
    }
    void Master::timerTick() {
      ……
      timerTickTimer = delay(1.0, self(), &Master::timerTick);
    }
    

    上面函数代码段可完成每1s调用一次timerTick函数的功能。

    3. Boost

    非常有名的开源C++基础库,里面的STL非常高效方便,已被很多著名软件采用。

    4. Zookeeper

    是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护、名字服务、分布式同步、组服务等。 Mesos采用zookeeper解决master单点故障问题,使用zookeeper搭建一个master集群,当master出现故障时,选择一个standby master 变为master。

    5. glog

    Google开源的C++日志库,主用于C++程序中打印日志,打印格式如下:

    I0411 17:26:54.150193 20653 main.cpp:111] Creating “process” isolation module
    I0411 17:26:54.150400 20653 main.cpp:119] Build: 2012-04-11 16:50:21 by root
    I0411 17:26:54.150658 20653 main.cpp:120] Starting Mesos slave
    I0411 17:26:54.152981 20669 slave.cpp:191] Slave started on 123.145.2.2:34694
    I0411 17:26:54.153024 20669 slave.cpp:192] Slave resources: cpus=2; mem=490

    6. gmock

    开源 C++ 单元测试框架

    7. 参考资料

    (1)Mesos主页:http://www.mesosproject.org/index.html

    (2)Mesos代码:https://svn.apache.org/repos/asf/incubator/mesos/trunk/

  • 相关阅读:
    Python-数据结构
    优化算法-BFGS
    Sparse AutoEncoder简介
    Sparse Filtering简介
    基于受限玻尔兹曼机(RBM)的协同过滤
    Grep学习笔记
    【深度学习篇】--Windows 64下tensorflow-gpu安装到应用
    【自然语言处理篇】--聊天机器人从初始到应用
    【深度学习】--DCGAN从入门到实例应用
    【深度学习】--GAN从入门到初始
  • 原文地址:https://www.cnblogs.com/zhangzhang/p/2850965.html
Copyright © 2020-2023  润新知