随着实时计算的需求日益增多,分布式内存计算也持续升温,怎样将海量数据近乎实时地处理,或者说怎样把离线批处理的速度再提高到一个新的高度是当前研究的重点。近年来,内存的吞吐量成指数倍增加,而磁盘的吞吐量增加缓慢,那么将原有计算框架中文件落地磁盘替换为文件落地内存,也是提升效率的优化点。 node
目前已经使用基于内存计算的分布式计算框架有:Spark、Impala及SAP的HANA等。可是其中不乏一些仍是有文件落地磁盘的操做,若是能让这些落地磁盘的操做所有落地到一个共享的内存中,那么这些基于内存的计算框架的效率会更高。 缓存
Tachyon是AmpLab的李浩源所开发的一个分布式内存文件系统,能够在集群里以访问内存的速度来访问存在Tachyon里的文件。Tachyon是架构在最底层的分布式文件存储和上层的各类计算框架之间的一种中间件,其主要职责是将那些不须要落地到DFS里的文件落地到分布式内存文件系统中来达到共享内存,从而提升效率。同时能够减小内存冗余、GC时间等,Tachyon的在大数据中层次关系以下图所示: 服务器
Tachyon容许文件之内存的速度在集群框架中进行可靠的共享,就像Spark和 MapReduce那样。经过利用信息继承、内存侵入,Tachyon得到了高性能。Tachyon工做集文件缓存在内存中,而且让不一样的 Jobs/Queries以及框架都能之内存的速度来访问缓存文件。所以,Tachyon能够减小那些须要常用数据集经过访问磁盘来得到的次数。 架构
Tachyon在Spark平台的部署:总的来讲,Tachyon有三个主要的部件:Master, Client,与Worker。在每一个Spark Worker节点上,都部署了一个Tachyon Worker,Spark Worker经过Tachyon Client访问Tachyon进行数据读写。全部的Tachyon Worker都被Tachyon Master所管理,Tachyon Master经过Tachyon Worker定时发出的心跳来判断Worker是否已经崩溃以及每一个Worker剩余的内存空间量。 框架
Tachyon Master的结构其主要功能以下:首先,Tachyon Master是个主管理器,处理从各个Client发出的请求,这一系列的工做由Service Handler来完成。这些请求包括:获取Worker的信息,读取File的Block信息,建立File等等;其次,Tachyon Master是个Name Node,存放着全部文件的信息,每一个文件的信息都被封装成一个Inode,每一个Inode都记录着属于这个文件的全部Block信息。在Tachyon中,Block是文件系统存储的最小单位,假设每一个Block是256MB,若是有一个文件的大小是1GB,那么这个文件会被切为4个Block。每一个Block可能存在多个副本,被存储在多个Tachyon Worker中,所以Master里面也必须记录每一个Block被存储的Worker地址;第三,Tachyon Master同时管理着全部的Worker,Worker会定时向Master发送心跳通知本次活跃状态以及剩余存储空间。Master是经过Master Worker Info去记录每一个Worker的上次心跳时间,已使用的内存空间,以及总存储空间等信息。 分布式
Tachyon Worker主要负责存储管理:首先,Tachyon Worker的Service Handler处理来自Client发来的请求,这些请求包括:读取某个Block的信息,缓存某个Block,锁住某个Block,向本地内存存储要求空间等等。第二,Tachyon Worker的主要部件是Worker Storage,其做用是管理Local Data(本地的内存文件系统)以及Under File System(Tachyon如下的磁盘文件系统,好比HDFS)。第三,Tachyon Worker还有个Data Server以便处理其余的Client对其发起的数据读写请求。当由请求达到时,Tachyon会先在本地的内存存储找数据,若是没有找到则会尝试去其余的Tachyon Worker的内存存储中进行查找。若是数据彻底不在Tachyon里,则须要经过Under File System的接口去磁盘文件系统(HDFS)中读取。 oop
如今咱们经过一个简单的场景把各个部件都串起来:假设一个Spark做业发起了一个读请求,它首先会经过Tachyon Client去Tachyon Master查询所须要的Block所在的位置。若是所在的Block不在本地的Tachyon Worker里,此Client则会经过Remote Block In Stream向别的Tachyon Worker发出读请求,同时在Block读入的过程当中,Client也会经过Block Out Stream把Block写入到本地的内存存储里,这样就能够保证下次一样的请求能够由本机完成。 性能
HDFS(Hadoop Distributed File System)是一个分布式文件系统。HDFS具备高容错性(fault-tolerant)特色,而且设计用来部署在低廉的硬件上。并且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了POSIX的要求,这样能够实现以流的形式访问(streaming access)文件系统中的数据。 大数据
HDFS采用Master/Slave架构。HDFS集群是由一个Namenode和必定数目的Datanode组成的。Namenode是一台中心服务器,负责管理文件系统的名字空间(namespace)以及客户端对文件的访问。集群中的Datanode通常是一个节点一个,负责管理它所在节点上的存储。HDFS暴露了文件系统的名字空间,用户可以以文件的形式在上面存储数据。从内部看,一个文件其实被分红一个或多个数据块,这些块存储在一组Datanode上。Namenode执行文件系统的名字空间操做,好比打开、关闭、重命名文件或目录,它也负责肯定数据块到具体Datanode节点的映射。Datanode负责处理文件系统客户端的读写请求,在Namenode的统一调度下对数据块进行建立、删除和复制。 优化
HDFS架构示意图以下图所示。
Namenode和Datanode被设计成能够在普通的商用机器上运行,这些机器通常运行着GNU/Linux操做系统。HDFS采用Java语言开发,所以任何支持Java的机器均可以部署Namenode或Datanode。因为采用了可移植性极强的Java语言,使得HDFS能够部署到多种类型的机器上。一个典型的部署场景是一台机器上只运行一个Namenode实例,而集群中的其余机器则分别运行一个Datanode实例。这种架构并不排斥在一台机器上运行多个Datanode,只不过这样的状况比较少见。
集群中单一Namenode的结构大大简化了系统的架构。Namenode是全部HDFS元数据的仲裁者和管理者,这样用户数据永远不会流过Namenode。
对比HDFS和Tachyon,首先从二者的存储结构来看,HDFS设计为用来存储海量文件的分布式系统,Tachyon设计为用来缓存经常使用数据的分布式内存文件系统。从这点来看,Tachyon能够认为是操做系统层面上的Cache,HDFS能够认为是磁盘。
在可靠性方面,HDFS采用副本技术来保证出现系统宕机等意外状况时文件访问的一致性以及可靠性;而Tachyon是依赖于底层文件系统的可靠性来实现自身文件的可靠性的。因为相对于磁盘资源来讲,内存是很是宝贵的,因此Tachyon经过在其underfs(通常使用HDFS)上写入CheckPoint日志信息来实现对文件系统的可恢复性。
从文件的读取以及写入方式来看,Tachyon能够更好地利用本地模式来读取文件信息,当文件读取客户端和文件所在的Worker位于一台机器上时,客户端会直接绕过Worker直接读取对应的物理文件,减小了本机的数据交互。而HDFS在遇到这样的状况时,会经过本地Socket进行数据交换,这也会有必定的系统资源开销。在写入文件时,HDFS只能写入磁盘,而Tachyon却提供了5种数据写入模式用以知足不一样需求。