一、Conf
大多系统在启动的时候,必须读取配置信息。这里从配置文件开始。
在路径tachyon/conf/ Utils是所有配置类的基类,其中申明了基本属性类型(Boolean、Int、Long、String四种类型)。它有四个子类。一下是类关系图
CommonConf是Master和Worker的公共配置信息
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,二是增量Log。Tachyon Master启动时首先从快照Image文件中读取文件系统meta信息,包括各种数据节点(文件/目录/Raw表/Checkpoint/依赖关系等)信息,而后再从继续EditLog(可能多个)中读取增量操作记录,EditLog的内容基本对应于Tachyon文件系统Client的一些相关操作,包括文件的添加,删除,重命名,数据块的添加等等.需要注意的是,这里的Log记录不包括实际的文件内容数据,只是meta信息,所以如果Cache中的文件内容丢失,如果没有持久化,也没有绑定相关lineage信息,那么对应的文件的具体内容也就丢失了文件系统信息恢复完毕以后,在Tachyon Master正式启动服务之前,Tachyon Master会先把当前的Meta Data写出为新的快照Image在启用zookeepeer的情况下,standby的Master会定期将Editlog合并并创建Standby的Image,如果没有Standby的Master则只有在启动过程中,才通过上述步骤合并到新的Image中。这里多个Master并发操作Image的editlog,没有Lock或者互斥的机制,不知道会不会存在竞争冲突,数据stale或丢失的问题 |
启动有两种模式:
Zookerper(tachyon的高可用方案)
单机
如果有配置zookerper模式的话,需要先启动zookerper客户端。Master在这作为zookerper的客户端(需要将当前运行线程编号提交给client)
接下来是setup(),在该方法中初始化Master的基本信息
设置web服务。
设置MasterServiceHandler(它维护所有worker的状态)
初始化socket服务(线程选择服务)
然后启动web服务
mWebServer.startWebServer(); |
下面看下master包中的类图
首先从最上面的EditLog看起,这是一个Master操作日志。
先看下load()方法:
该方法需要提供三个参数:MasterInfo、path(日志路径)、还一个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方法。
RawTables:ImageWrite的另一个子类