Tachyon简介

来源:互联网 发布:软件app发展前景 编辑:程序博客网 时间:2024/06/05 04:56

         Tachyon 是一个高容错的分布式内存文件系统,允许文件以内存的速度在集群框架(如spark,hadoop)中进行可靠的共享,其通过使用lineage信息和内存获得更高的性能。Tachyon将文件放入内存中,避免到磁盘中频繁加载数据,Tachyon以常见的Master/worker的方式组织集群,由Master节点负责管理维护文件系统MetaData,文件数据维护在Worker节点的内存中。容错性方面,主要的技术要点包括: 

l  底层支持Plugable的文件系统如HDFS用于用户指定文件的持久化

l  使用Journal机制持久化文件系统的Metadata

l  使用Zookeeper构建Master的HA

l  没有使用replica复制内存数据,而是采用和SparkRDD类似的Lineage的思想用于灾难恢复

Tachyon存放在RamDisk上的文件以Block(默认为1G)为单位划分,Master为每个Block分配一个BlockID,Worker直接以BlockID作为实际的文件名在Ramdisk上存储对应Block的数据。

Tachyon在生态系统中的位置如下图所示:




Tachyon在spark平台的架构



 

Tachyon有三个主要的部件:Master Client,与Worker。在每个SparkWorker节点上,都部署了一个Tachyon WorkerSpark Worker通过Tachyon Client访问Tachyon进行数据读写。所有的Tachyon Worker都被Tachyon Master所管理,Tachyon Master通过Tachyon Worker定时发出的心跳来判断Worker是否已经崩溃以及每个Worker剩余的内存空间量。

      

       Tachyon Master主要功能如下:首先,TachyonMaster是个主管理器,处理从各个Client发出的请求,这一系列的工作由Service Handler来完成。这些请求包括:获取Worker的信息,读取FileBlock信息,创建File等等;其次,Tachyon Master是个Name Node,存放着所有文件的信息,每个文件的信息都被封装成一个Inode,每个Inode都记录着属于这个文件的所有Block信息。第三,Tachyon Master同时管理着所有的WorkerWorker会定时向Master发送心跳通知本次活跃状态以及剩余存储空间。Master是通过Master Worker Info去记录每个Worker的上次心跳时间,已使用的内存空间,以及总存储空间等信息。 

 

       Tachyon worker 主要功能。它主要负责存储管理:首先,TachyonWorkerService Handler处理来自Client发来的请求,这些请求包括:读取某个Block的信息,缓存某个Block,锁住某个Block,向本地内存存储要求空间等等。第二,Tachyon Worker的主要部件是Worker Storage,其作用是管理Local Data(本地的内存文件系统)以及Under File SystemTachyon以下的磁盘文件系统,比如HDFS)。第三,Tachyon Worker还有个Data Server以便处理其他的Client对其发起的数据读写请求。当由请求达到时,Tachyon会先在本地的内存存储找数据,如果没有找到则会尝试去其他的Tachyon Worker的内存存储中进行查找。如果数据完全不在Tachyon里,则需要通过Under File System的接口去磁盘文件系统(HDFS)中读取。

 

       Tachyon Client的结构,它主要功能是向用户抽象一个文件系统接口以屏蔽掉底层实现细节。首先,Tachyon Client会通过Master Client部件跟Tachyon Master交互,比如可以向Tachyon Master查询某个文件的某个Block在哪里。Tachyon Client也会通过Worker Client部件跟Tachyon Worker交互,比如向某个Tachyon Worker请求存储空间。在Tachyon Client实现中最主要的是Tachyon File这个部件。在Tachyon File下实现了Block Out Stream,其主要用于写本地内存文件;实现了Block In Stream主要负责读内存文件。在Block In Stream内包含了两个不同的实现:Local Block In Stream主要是用来读本地的内存文件,而RemoteBlock In Stream主要是读非本地的内存文件。请注意,非本地可以是在其它的Tachyon Worker的内存文件里,也可以是在Under File System的文件里。

Tachyon的读写过程

         假设一个Spark作业发起了一个读请求,它首先会通过TachyonClientTachyon Master查询所需要的Block所在的位置。如果所在的Block不在本地的Tachyon Worker里,此Client则会通过Remote Block In Stream向别的TachyonWorker发出读请求,同时在Block读入的过程中,Client也会通过Block Out StreamBlock写入到本地的内存存储里,这样就可以保证下次同样的请求可以由本机完成。

         Tachyon的文件读写,尽可能的通过Java NIO API将文件直接映射到内存中,做为数据流进行读写操作,目的在于避免在Java Heap中使用大量的内存,由此减小GC的开销,提升响应速度。读写过程中,所有涉及到Meta相关信息的,都需要通过调用Tachyon Master经由Thrift暴露的ServerAPI来执行。

         Tachyon的文件读操作支持本地和远程两种模式,从Client API的角度来说对用户是透明的。读文件的实现,其流程基本就是先从Master处获取对应文件Offset位置对应的Block的ID,而后连接本地Worker取得相应ID对应的文件名,如果文件存在,Client端代码会通知Worker锁定对应的Block,而后Client端代码直接映射相关文件为RandomAccessFile直接进行读操作,并不经由Worker代理读取实际的数据,如果本地没有Worker,或者文件在本地worker上不存在,Client代码再进一步通过Master的API获取相关Block所对应的Worker,而后通过Worker暴露的DataServer接口读取对应Block的内容,在DataServer内部,同样延续锁定对应Block,映射文件的流程读取并将数据返回给Client。另外,基于读数据的时候使用的TachyonFile的API接口,如果使用的是FileStream的接口,当远程Worker也没有对应文件Block时,RemoteBlockInStream还会尝试从底层持久化文件系统层(如果存在对应的文件的话)去读取数据,而ReadByteBuffer接口则没有对应的流程

 

Tachyon目前只支持本地写操作,写操作按写入位置可以分为

 Cache:写到Tachyon内存文件系统中

Through:写到底层持久化文件系统中 

具体的类型是以上几种情况的合法的组合,如单cache,cache +through等。还有一个Async模式:异步写到底层持久化文件系统中,这个大概是为了优化那些数据需要持久化,但是又对性能Latency等有要求的场合。



参考文献:

http://www.tachyon-project.org/

http://blog.csdn.net/colorant/article/details/22385763

http://www.csdn.net/article/2015-06-25/2825056


0 0
原创粉丝点击