• Tachyon源码解读一:master部分


    一、Conf

    大多系统在启动的时候,必须读取配置信息。这里从配置文件开始。

    在路径tachyon/conf/ Utils是所有配置类的基类,其中申明了基本属性类型(BooleanIntLongString四种类型)。它有四个子类。一下是类关系图


    CommonConfMasterWorker的公共配置信息

     public final String TACHYON_HOME;

      public final String UNDERFS_ADDRESS;

      public final String UNDERFS_DATA_FOLDER;

      public final String UNDERFS_WORKERS_FOLDER;

      public final String UNDERFS_HDFS_IMPL;

      public final String UNDERFS_GLUSTERFS_IMPL;

      public final String UNDERFS_GLUSTERFS_VOLUMES;

      public final String UNDERFS_GLUSTERFS_MOUNTS;

      public final String UNDERFS_GLUSTERFS_MR_DIR;

      public final String WEB_RESOURCES;

      public final boolean USE_ZOOKEEPER;

      public final String ZOOKEEPER_ADDRESS;


    二、Format

    格式化tachyon文件

    根据参数内容

    Master:创建目录

    Worker:从配置文件中拿到节点循环删除



    三、Master

    初始化配置

    TachyonMaster master =

            new TachyonMaster(new InetSocketAddress(mConf.HOSTNAME, mConf.PORT), mConf.WEB_PORT,

                mConf.SELECTOR_THREADS, mConf.QUEUE_SIZE_PER_SELECTOR, mConf.SERVER_THREADS);

    启动

    Tachyon Master的启动过程,首先当然是要读取Master相关配置参数,目前都是通过-D参数传给Java的,理想的是通过配置文件来做。目前这些参数,一部分是在Env文件里设置变量,再通过-D参数设置,也有的直接写死在-D参数中的,也有启动脚本中默认未配置,在MasterConf代码里使用了默认值的。 通过读取特定的format文件判断文件系统是否格式化,接下来就是在内存中重建文件系统信息

    这里摘自网络

    Tachyon的文件系统信息依靠Journal日志保存,Journal包括两部分,一是meta信息在某个时刻的快照Image,二是增量LogTachyon Master启动时首先从快照Image文件中读取文件系统meta信息,包括各种数据节点(文件/目录/Raw/Checkpoint/依赖关系等)信息,而后再从继续EditLog(可能多个)中读取增量操作记录,EditLog的内容基本对应于Tachyon文件系统Client的一些相关操作,包括文件的添加,删除,重命名,数据块的添加等等.需要注意的是,这里的Log记录不包括实际的文件内容数据,只是meta信息,所以如果Cache中的文件内容丢失,如果没有持久化,也没有绑定相关lineage信息,那么对应的文件的具体内容也就丢失了文件系统信息恢复完毕以后,在Tachyon Master正式启动服务之前,Tachyon Master会先把当前的Meta Data写出为新的快照Image在启用zookeepeer的情况下,standbyMaster会定期将Editlog合并并创建StandbyImage,如果没有StandbyMaster则只有在启动过程中,才通过上述步骤合并到新的Image中。这里多个Master并发操作Imageeditlog,没有Lock或者互斥的机制,不知道会不会存在竞争冲突,数据stale或丢失的问题



    启动有两种模式:

    Zookerper(tachyon的高可用方案)

    单机

    如果有配置zookerper模式的话,需要先启动zookerper客户端。Master在这作为zookerper的客户端(需要将当前运行线程编号提交给client)

    接下来是setup(),在该方法中初始化Master的基本信息

    设置web服务。

    设置MasterServiceHandler(它维护所有worker的状态)

    初始化socket服务(线程选择服务)

    然后启动web服务

     mWebServer.startWebServer();


    下面看下master包中的类图




    首先从最上面的EditLog看起,这是一个Master操作日志。

    先看下load()方法:

    该方法需要提供三个参数:MasterInfopath(日志路径)、还一个Int类型的也就是Master加载最小日志数量。这个方法先对path进行一系列的校验,然后生成一个以文件大小和序列组合的名字的editlog结尾的命名存放在数组集合。然后调用loadSingeLog()方法。

    loadSingeLog方法中有个EditLogOperation,这里是指每个EditLog每一个单一的操作都是一个条目,它会序列化json

    op = parser.readValueAs(EditLogOperation.class);

    这里得到一个操作值,根据操作类型来匹配方法。

    有如下操作类型:

    ADD_BLOCK

    ADD_CHECKPOINT

    CREATE_FILE

    COMPLETE_FILE

    SET_PINNED

    RENAME

    DELETE

    CREATE_RAW_TABLE

    UPDATE_RAW_TABLE_METADATA

    CREATE_DEPENDENCY:


    MasterServiceHandler

    它维护每个工人的状态。它永远不会保存任何用户的状态。

    他实现了MasterService中的Iface接口。

    该接口中包含了多种方法,其中实现的方法维护着worker的操作信息。包括注册、心跳、缓存块等等


    MasterInfo

    是主控文件系统的全局视图

    该类实现了HeartbeatExecutor接口,并实现heartbeat()维护worker通信。

    在这个方法中实现了一些文件操作、命令等方法


    ImageWriter

    这是一个写映像文件的抽象类。Dependency继承了它,并有一些新的功能:从json创建一个依赖,添加孩子依赖等。并重写了writeImage方法。

    RawTablesImageWrite的另一个子类




  • 相关阅读:
    异步任务AsyncTask
    巧用TextView实现分隔线
    android系统的常用权限
    浅析对话框AlertDialog
    LinearLayout中的layout_weight属性详解
    CLOB大数据对象
    模糊查询demo
    ES6 箭头函数
    ES6中数组求和,求平均数方法( reduce )
    ES6中数组方法( every 和 some )
  • 原文地址:https://www.cnblogs.com/huwf/p/4273380.html
Copyright © 2020-2023  润新知