这是磁盘上的物理结构,与之对应的,是内存中的数据结构,用以表征这样的磁盘结构,方便读写操作的进行。Block类用于表示数据块,而FSDataset类是数据服务器管理文件块的数据结构,其中,FSDataset.FSDir对应着数据块文件和目录,FSDataset.FSVolume对应着一个数据目录,FSDataset.FSVolumeSet是FSVolume的集合,每一个FSDataset有一个FSVolumeSet。多个数据目录,可以放在不同的磁盘上,这样有利于加快磁盘操作的速度。相关的类图,可以参看这里。。。
此外,与FSVolume对应的,还有一个数据结构,就是DataStorage,它是Storage的子类,提供了升级、回滚等支持。但与FSVolume不一样,它不需要了解数据块文件的具体内容,它只知道有这么一堆文件放这里,会有不同版本的升级需求,它会处理怎么把它们升级回滚之类的业务(关于Storage,可以参见这里)。而FSVolume提供的接口,都基本上是和Block相关的。。。
相比数据服务器,主控服务器的数据量不大,但逻辑更为复杂。主控服务器主要有三类数据:文件系统的目录结构数据,各个文件的分块信息,数据块的位置信息(就数据块放置在哪些数据服务器上...)。在GFS和HDFS的架构中,只有文件的目录结构和分块信息才会被持久化到本地磁盘上,而数据块的位置信息则是通过动态汇总过来的,仅仅存活在内存数据结构中,机器挂了,就灰飞烟灭了。每一个数据服务器启动后,都会向主控服务器发送注册消息,将其上数据块的状况都告知于主控服务器。俗话说,简单就是美,根据DRY原则,保存的冗余信息越少,出现不一致的可能性越低,付出一点点时间的代价,换取了一大把逻辑上的简单性,绝对应该是一个包赚不赔的买卖。。。
在HDFS中,FSNamespacesystem类就负责保管文件系统的目录结构以及每个文件的分块状况的,其中,前者是由FSDirectory类来负责,后者是各个INodeFile本身维护。在INodeFile里面,有一个BlockInfo的数组,保存着与该文件相关的所有数据块信息,BlockInfo中包含了从数据块到数据服务器的映射,INodeFile只需要知道一个偏移量,就可以提供相关的数据块,和数据块存放的数据服务器信息。。。
在Hadoop的实现中,部署了一套RPC机制,以此来实现各服务间的通信协议。在Hadoop中,每一对服务器间的通信协议,都定义成为一个接口。服务端的类实现该接口,并且建立RPC服务,相关的接口,在独立的线程处理RPC请求。客户端则可以实例化一个该接口的代理对象,调用该接口的相应方法,执行一次同步的通信,传入相应参数,接收相应的返回。基于此RPC的通信模式,是一个消息拉取的流程,RPC服务器等待RPC客户端的调用,而不会先发制人主动把相关信息推送到RPC客户端去。。。
其实RPC的模式和原理,实在是没啥好说的,之所以说,是因为可以通过把握好这个,彻底理顺Hadoop各服务器间的通信模式。Hadoop会定义一些列的RPC接口,只需要看谁实现,谁调用,就可以知道谁和谁通信,都做些啥事情,图中服务器的基本架构、各服务所使用的协议、调用方向、以及协议中的基本内容。。。
III. 基本的文件操作
基本的文件操作,可以分成两类,一个是对文件目录结构的操作,比如文件和目录的创建、删除、移动、更名等等;另一个是对文件数据流的操作,包括读取和写入文件数据。当然,文件读和写,是有本质区别的,尤其是在数据冗余的情况下,因此,当成两类操作也不足为过。此外,要具体到读写的类别,也是可以再继续分类下去的。在GFS的论文中,对于分布式文件系统的读写场景有一个重要的假定(其实是从实际业务角度得来的...):就是文件的读取是由大数据量的连续读取和小数据量的随机读取组成,文件的写入则基本上都是批量的追加写,和偶尔的插入写(GFS中还有大量的假设,它们构成了分布式文件系统架构设计的基石。每一个系统架构都是搭建在一定假设上的,这些假设有些来自于实际业务的状况,有些是因为天生的条件约束,不基于假设理解设计,肯定会有失偏颇...)。在GFS中,对文件的写入分成追加写和插入写都有所支持,但是,在HDFS中仅仅支持追加写,这大大降低了复杂性。关于HDFS与GFS的一些不同,可以参看这里。。。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-40093-3.html
超级期待啊
我需要输入登录名个密码的wifi