在Spark的RDD中引入过lineage这一概念。指的是RDD之间的依赖。而Alluxio则使用lineage来表示文件之间的依赖。在代码层面,指的是fileID之间的依赖。

代码中的注释指出:

* A lineage tracks the dependencies imposed by a job, including the input files the job depends on,
* and the output files the job generates.
内部数据结构:
@NotThreadSafe
public final class Lineage implements JournalEntryRepresentable {
private final long mId;
private final List<Long> mInputFiles;
private final List<Long> mOutputFiles;
private final Job mJob;
private final long mCreationTimeMs;
}

有了lineage之后,如何使用lineage来实现文件的容错呢?

在源码中,有2个关键类解决了这个问题,分别是LineageMaster和RecomputeExecutor。

有几个问题:

1. 什么时候启动LineageMaster?

  按道理,在Alluxio集群启动时,LineageMaster进程就应该已经“启动”了。

  查找LineageMaster的调用情况,可以发现在alluxio.master.AlluxioMaster对象中,main方法里会调用master.start();

  顺着这个思路,找到startMasters方法,就可以发现如下代码:

if (LineageUtils.isLineageEnabled(MasterContext.getConf())) {
mLineageMaster.start(isLeader);
}

  也就是说,在lineage使能的情况下,才会启动mLineageMaster.

  LineageMaster的依赖:

  

  LineageMaster的启动过程是这样的:

  @Override
public void start(boolean isLeader) throws IOException {
super.start(isLeader);
if (isLeader) {
mCheckpointExecutionService = getExecutorService()
.submit(new HeartbeatThread(HeartbeatContext.MASTER_CHECKPOINT_SCHEDULING,
new CheckpointSchedulingExcecutor(this, mFileSystemMaster),
mConfiguration.getInt(Constants.MASTER_LINEAGE_CHECKPOINT_INTERVAL_MS)));
mRecomputeExecutionService = getExecutorService()
.submit(new HeartbeatThread(HeartbeatContext.MASTER_FILE_RECOMPUTATION,
new RecomputeExecutor(new RecomputePlanner(mLineageStore, mFileSystemMaster),
mFileSystemMaster),
mConfiguration.getInt(Constants.MASTER_LINEAGE_RECOMPUTE_INTERVAL_MS)));
}
}

  先分析LineageMaster.start()除了super.start(isLeader)的代码。

  根据这部分代码,可以分析出,LineageMaster只会在leader上启动,而不会在standby master上启动。

  启动包含2个Executor服务的运行,运行在这2个Executor服务上的是2个心跳线程(HeartBeatThread)。

  这2个心跳线程所做的事情分别是:

    checkpoint执行服务所做的是Master Checkpoint Scheduling。executor是CheckpointSchedulingExcecutor。对应的Timer的interval是由“alluxio.master.lineage.checkpoint.interval.ms”所设定。

    而RecomputeExecutionService所做的事情则是文件的重计算(MASTER_FILE_RECOMPUTATION).

  在启动这2个服务之前,还会调用父类的start方法:

    先了解下AbstractMaster类的功能:

    * This is the base class for all masters, and contains common functionality. Common functionality
    * mostly consists of journal operations, like initialization, journal tailing when in standby mode,
    * or journal writing when the master is the leader.

    分析start方法的代码,首先会起一个固定线程数的线程池。然后,如果是leader,那么就会做如下事情:

      1.判断对应的日志是不是读写日志;

      2.将所有的日志标记为“Complete”;

      3.执行所有的日志文件中的Entry;

      4.初始化日志,把所有完成日志的状态写入检查点文件。

        AbstractMaster在此处会调用子类的streamToJournalCheckpoint方法。

        LineageMaster实现了JournalCheckpointStreamable接口,对应的streamToJournalCheckpoint方法调用LineStore的streamToJournalCheckpoint方法,将依赖转换成日志条目写入JournalOutputStream.

2.RecomputeExecutor已经在LineageMaster中例化过了,那么它的作用是什么?

  

  RecomputeExecutor包含一个内部类:RecomputeLauncher。

  这个内部类实现了runnable接口,这意味着这个类的实例将会被一个线程执行。

  该类的run方法做的事情是根据RecomputePlan类对象的依赖,循环地执行对应的任务:

  a 初始化文件

  b getJob().run()

        

总结,可以看出,lineage的实现与通常的预期较为相符。Master提供了稳定的重算服务,重算服务则由包含有RecomputeExecutor功能的HeartbeatThread实现。

Master通用的功能在AbstractMaster中提出甚至实现。从当前的线索出发,alluxio更多的方面可以挖掘出来。


Alluxio/Tachyon如何发挥lineage的作用?的更多相关文章

  1. Tachyon在Spark中的作用(Tachyon: Reliable, Memory Speed Storage for Cluster Computing Frameworks 论文阅读翻译)

    摘要:         Tachyon是一种分布式文件系统,能够借助集群计算框架使得数据以内存的速度进行共享.当今的缓存技术优化了read过程,可是,write过程由于须要容错机制,就须要通过网络或者 ...

  2. 负载均衡技术在CDN中发挥着重要作用

    转载地址:http://www.qicaispace.com/gonggao/server/page01/info07.asp CDN是一个经策略性部署的整体系统,能够帮助用户解决分布式存储.负载均衡 ...

  3. 发挥bat的作用

    from 转自:http://blog.csdn.net/hitlion2008/article/details/7467252 1.什么是Windows BATCH BATCH也就是批处理文件,有时 ...

  4. 让Redis在你的系统中发挥更大作用的几点建议

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/105.html?1455868313 Redis在很多方面与其他数据库解决 ...

  5. 懂DOS终于发挥了一点作用:phoenix bios密码破解

    手上一个笔记本,不知开机密码,但bios是老phoenix的bios,出错后有溢出码,到网上下载了一个unlock6,满怀希望地进行破解,结果一运行,屏幕就没反应.试了几个都不行.最后怀疑是不是输出的 ...

  6. 几点建议,让Redis在你的系统中发挥更大作用

    Redis在很多方面与其他数据库解决方案不同:它使用内存提供主存储支持,而仅使用硬盘做持久性的存储:它的数据模型非常独特,用的是单线程.另一个大区别在于,你可以在开发环境中使用Redis的功能,但却不 ...

  7. 让Redis在你的系统中发挥更大作用

    Redis在很多方面与其他数据库解决方案不同:它使用内存提供主存储支持,而仅使用硬盘做持久性的存储:它的数据模型非常独特,用的是单线程.另一个大区别在于,你可以在开发环境中使用Redis的功能,但却不 ...

  8. 邀您参加 | BigData & Alluxio 交流会-成都站

    4月27日,在天府之国,与你共享大数据与Alluxio的技术魅力. 活动介绍 本期技术沙龙将会聚焦在大数据.存储.数据库以及Alluxio应用实践等领域,邀请腾讯技术专家和业界技术专家现场分享关于Al ...

  9. Alluxio1.0.1最新版(Tachyon为其前身)介绍,+HDFS分布式环境搭建

    Alluxio(之前名为Tachyon)是世界上第一个以内存为中心的虚拟的分布式存储系统.它统一了数据访问的方式,为上层计算框架和底层存储系统构建了桥梁. 应用只需要连接Alluxio即可访问存储在底 ...

随机推荐

  1. python面向对象重新梳理

    关于本篇博文: 面向对象中所有的内容的重新梳理,其实面向对象的知识早在一个多月前就学习过并整理过,但是发现还是有所欠缺,故在此以极其简介的语言风格重新梳理一遍 面向对象详细介绍:http://www. ...

  2. MySQL安装、基本账户安全(5.0以后版本)

    博文目录: 1.Mysql-5.0.40.tar.gz Mysql-5.1.72.tar.gz 2.Mysql-5.5.22.tar.gz 3.Mysql-5.5.34.tar.gz 4.Mysql- ...

  3. centos7.3 快速安装 mariadb(mysql)

    从最新版本的linux系统开始,默认的是 Mariadb而不是mysql! 使用系统自带的repos安装很简单: yum install mariadb mariadb-server systemct ...

  4. 0_Simple__simpleTemplates + 0_Simple__simpleTemplates_nvrtc

    使用 C++ 的模板 ▶ 源代码:静态使用 // sharedmem.cuh #ifndef _SHAREDMEM_H_ #define _SHAREDMEM_H_ // SharedMemory 的 ...

  5. smfony设置量表之间的关系

    设置量表之间的关系 验证是否ok 查看我们定义是否有问题 数据库操作 http://www.2cto.com/database/201504/387197.html  设置时间段数据库自动插入时间 不 ...

  6. cookie和session的比较

    cookie和session的比较 一.对于cookie: ①cookie是创建于服务器端 ②cookie保存在浏览器端 ③cookie的生命周期可以通过cookie.setMaxAge(2000); ...

  7. django celery 定时任务

    可参考上一篇:http://www.cnblogs.com/wumingxiaoyao/p/8515075.html 1. 安装 django-celery-beat pip3 install dja ...

  8. 机器学习入门-K-means算法

    无监督问题,我们手里没有标签 聚类:相似的东西聚在一起 难点:如何进行调参 K-means算法 需要制定k值,用来获得到底有几个簇,即几种类型 质心:均值,即向量各维取平均值 距离的度量: 欧式距离和 ...

  9. hashlib 加密模块使用说明

    import hashlib  #hashilib 模块 m = hashlib.md5() m.update('hello 天王盖地虎'.encode(encoding = 'utf-8)) m.h ...

  10. as3 XML类和XMLList类的区别

    一.XML类和XMLList类的区别       AS3.0中,处理XML主要用到两个主类,XML类和XMLList类,这两个类的很多内容是共通的.应该有人会问,XML和XMLList的区别是什么? ...