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的另一个子类




posted on 2014-12-03 14:49  Spark_莫然  阅读(356)  评论(0编辑  收藏  举报