Tachyon学习及源码阅读:简介

前言

这个系列是关于Tachyon的,主要基于《Reliable, Memory Speed Storage for Cluster Computing Frameworks 》这篇论文以及源码,最近工作比较忙,精力实在有限,可能更新得比较慢

简介

Tachyon是一个分布式文件系统,提供了一种可靠的方式,可以以访问内存的速度在不同的分布式计算框架之间共享数据。Tachyon使用lineage技术实现容错,并通过一种检查点(checkpoint)算法来确保恢复以及资源开销在一定范围之内。据作者测试,Tachyon的写性能超过in-memory hbase 110倍,能为实际端到端工作流提高4倍性能。Tachyon目前已经开源并且在多个不同的企业、组织部署。

近些年已经出现了大量计算框架,大规模并行数据处理的速度和复杂度都有极大的提升,但其中很大一部分性能依然受限于IO。依照传统的思路,对于IO性能问题一般引入cache来提升,但传统意义上在分布式计算系统中的cache虽然能极大提升read性能,但对于write的性能却帮助不大,这是因为分布式系统需要提供容错,而对于write动作一般采用在多个不同节点上保存副本来实现,但在内存中产生数据副本对于写性能会由较大影响 并且节点之间副本传输(内存到内存)受限于网络延时和吞吐量,相比直接使用本地内存进行cache性能会差很多。

Tachyon是一个in-memory的存储系统,对于读和写有非常大的吞吐量,并且使用linage方式(当数据丢失时会根据源头数据以及一组操作重新构建数据)来替换掉replicate的方式从而解决了上述为了实现容错而牺牲性能的问题。

lineage方式来实现容错其实在计算框架上已经有所应用,比如spark,但把这个技术放到一个存储系统上则有两个比较大的问题:第一,如何减小错误恢复开销。在一个长时间持续运行的系统中实现lineage,必须考虑到当错误发生时,数据可能已经演化了很久了,那么此时进行重构数据就需要经历很多步骤,时间开销很大。这种情况在普通的spark应用或者MapReduce应用中不会出现,这是因为通常来说缓存数据仅在一个Job的生命周期内有效,而作为一个存储系统则完全不一样:它是持续不断地运行在集群中的。有种类似的情况是Spark-streaming,Spark-streaming也是持续运行在集群中的,为了解决这个问题它引入了checkpoint,基于其计算框架的特性(例如RDD)来实现这一点。不过同样的方法在存储系统中就很难照搬过来,这是因为一个存储系统对于上层计算框架来说是透明的、通用的,它无法根据具体的计算框架特性来实现相应的checkpoint。

第二个问题如何为数据重建提供资源。在进行数据重建时必须保证当前recomputation任务能够得到充足的资源以满足当前job的数据需要,且不能过度影响优先级更高的计算任务的执行性能。

对于第一个问题,Tachyon在后台不间断地构建checkpoint file。为了实现这一方案,Tachyon引入了一种叫做Edge algorithm的算法,这种算法无需知道上层计算框架的特性,并且提供了一个数据重建开销上限。

对于第二个问题,Tachyon基于两种集群资源分配模型(strict priority 和 weighted fair sharing),提供了依赖任务优先级的资源分配方案。举个例子:如果一个低优先级的任务请求一块已丢失的数据,重构任务会尽量减少占用的资源从而减小对高优先级任务的影响,但是如果之后有一个较高优先级的任务也请求了同一块数据,那么Tachyon会自动增加这块数据重构任务所占用的资源(权重增加了)。

适用Tachyon的几点特性

1.数据不可更改。数据写入后不可更改但可以append,类似HDFS。

2.计算任务具有确定性。Tachyon基于lineage来重构数据,那么每一个演化阶段的操作必须是可确定的。

3.支持计算本地化。计算框架的调度器须支持计算本地化以减少网络数据传输。

4.程序大小小于数据大小。在大数据处理中通常对一份数据中的不同记录执行相同操作,而数据的大小远大于程序的大小,因此可以将程序在每个节点上制作副本。

5.工作集和全局数据。整个存储系统中的所有数据量很大,需要落到磁盘上,但工作集数据量仅为全局数据的一部分,可以载入到内存。

Tachyon架构

Tachyon使用的是标准的Master-Slave的架构。Manager用于跟踪lineage的信息、计算checkpoint并且和集群资源管理器配合为数据重构任务分配资源。每个Tachyon Worker是集群节点上的一个守护进程,用于管理本地资源,并且周期性地向master报告状态。每个Worker用ramdisk来存储,application可以通过worker来直接访问ramdisk上的文件,这样一来application就能以内存级访问速度来读取数据。

先到这里,之后会详细介绍其架构的几个重要设计、checkpoint实现以及edge 算法。

时间: 2024-08-05 11:04:31

Tachyon学习及源码阅读:简介的相关文章

【 js 基础 】【 源码学习 】backbone 源码阅读(三)

最近看完了 backbone.js 的源码,这里对于源码的细节就不再赘述了,大家可以 star 我的源码阅读项目(https://github.com/JiayiLi/source-code-study)进行参考交流,有详细的源码注释,以及知识总结,同时 google 一下 backbone 源码,也有很多优秀的文章可以用来学习. 我这里主要记录一些偏设计方向的知识点.这篇文章主要讲 backbone.sync 中用到的 Rest 和 CRUD. 首先我们简单了解一下 REST: REST :

【 js 基础 】【 源码学习 】backbone 源码阅读(一)

最近看完了 backbone.js 的源码,这里对于源码的细节就不再赘述了,大家可以 star 我的源码阅读项目(https://github.com/JiayiLi/source-code-study)进行参考交流,有详细的源码注释,以及知识总结,同时 google 一下 backbone 源码,也有很多优秀的文章可以用来学习. 我这里主要记录一些偏设计方向的知识点.具体从以下几个方面入手:1.MVC 框架2.观察者模式 以及 控制反转 一.MVC 框架所谓 MVC 框架,包含三个部分,mod

【 js 基础 】【 源码学习 】backbone 源码阅读(二)

最近看完了 backbone.js 的源码,这里对于源码的细节就不再赘述了,大家可以 star 我的源码阅读项目(https://github.com/JiayiLi/source-code-study)进行参考交流,有详细的源码注释,以及知识总结,同时 google 一下 backbone 源码,也有很多优秀的文章可以用来学习. 我这里主要记录一些偏设计方向的知识点.这篇文章主要讲 控制反转. 一.控制反转 上篇文章有说到控制反转,但只是简略的举了个例子,在这里我们详细说一下这个知识点,它其实

如何阅读Java源码 阅读java的真实体会

刚才在论坛不经意间,看到有关源码阅读的帖子.回想自己前几年,阅读源码那种兴奋和成就感(1),不禁又有一种激动. 源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心. 说到技术基础,我打个比方吧,如果你从来没有学过Java,或是任何一门编程语言如C++,一开始去啃<Core Java>,你是很难从中吸收到营养的,特别是<深入Java虚拟机>这类书,别人觉得好,未必适合现在的你. 虽然Tomcat的源码很漂亮,但我绝不建议你一开始就读它.我文中会专门谈到这个,暂时不展开. 强烈

【原】AFNetworking源码阅读(四)

[原]AFNetworking源码阅读(四) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇还遗留了很多问题,包括AFURLSessionManagerTaskDelegate类所实现的NSURLSession相关的代理方法,甚至连dataTask.uploadTask.downloadTask这几个基本概念也没说.这一篇就是为了集中消灭这些遗留问题. 2. AFURLSessionManagerTaskDelegate的代理方法 此处实现的仍然是NSURLS

【原】SDWebImage源码阅读(三)

[原]SDWebImage源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1.SDWebImageDownloader中的downloadImageWithURL 我们来到SDWebImageDownloader.m文件中,找到downloadImageWithURL函数.发现代码不是很长,那就一行行读.毕竟这个函数大概做什么我们是知道的.这个函数大概就是创建了一个SDWebImageSownloader的异步下载器,根据给定的URL下载image. 先映入眼帘的

CI框架源码阅读笔记1 - 环境准备、基本术语和框架流程

最开始使用CI框架的时候,就打算写一个CI源码阅读的笔记系列,可惜虎头蛇尾,一直没有行动.最近项目少,总算是有了一些时间去写一些东西.于是准备将之前的一些笔记和经验记录下来,一方面权作备忘,另一方面时刻提醒自己:借鉴和学习才有出路,忘记过去意味着背叛! 基本术语说明 在本文开始之前,有必要对文中反复出现的术语做一个简单的说明,如果你对这一部分已经熟谙,完全可以略过.本文中反复出现和提及的术语包括: 前端控制器(Front Controller): 用于集中控制用户的所有请求的组件,将用户的请求发

Flume-NG源码阅读之AvroSink

org.apache.flume.sink.AvroSink是用来通过网络来传输数据的,可以将event发送到RPC服务器(比如AvroSource),使用AvroSink和AvroSource可以组成分层结构.它继承自AbstractRpcSink  extends AbstractSink implements Configurable这跟其他的sink一样都得extends AbstractSink implements Configurable,所以重点也在confgure.start.

Java源码阅读的真实体会

原文:http://zwchen.iteye.com/blog/1154193 刚才在论坛不经意间,看到有关源码阅读的帖子.回想自己前几年,阅读源码那种兴奋和成就感(1),不禁又有一种激动. 源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心. 说到技术基础,我打个比方吧,如果你从来没有学过Java,或是任何一门编程语言如C++,一开始去啃<Core Java>,你是很难从中吸收到营养的,特别是<深入Java虚拟机>这类书,别人觉得好,未必适合现在的你. 虽然Tomcat的