分布式文件系统GFS、HDFS的比较

一、概论

HDFS(Hadoop分布式文件系统)是根据GFS(Google文件系统)的原理开发的,是GFS的简化版。

前面提到,对于如何处理大数据,计算机科学界有两大方向:一是集中式计算,二是分布式计算。

过去,分布式计算理论比较复杂,技术实现比较困难,因此集中式计算一直是主流解决方案。但2003年到2004年间,Google发表了MapReduce、GFS和BigTable三篇技术论文,提出了一套全新的分布式计算理论。这套理论相比于传统的分布式计算模型有三大优势:

1)它简化了传统的分布式计算理论,降低了技术实现的难度,可以进行实际的应用。

2)它可以应用在廉价的计算设备上,只需增加计算设备的数量就可以提升整体的计算能力,应用成本十分低廉。

3)它被Google应用在Google的计算中心,取得了很好的效果,有了实际应用的证明。

于是,各家互联网公司开始利用Google的分布式计算模型搭建自己的分布式计算系统,Google的这三篇论文成为了大数据时代的技术核心。由于Google没有开源具体的技术实现,所以其他互联网公司只能根据这三篇技术论文中的相关原理,搭建自己的分布式计算系统。例如,Hadoop采用了MapReduce打造了分布式计算框架,并根据GFS开发了HDFS分布式文件系统,根据BigTable开发了HBase数据存储系统。

其中,HDFS虽然和GFS原理相同,但运算速度上达不到Google论文中的标准,并且在并发写的处理上,采用了一些简化的做法。尽管如此, HDFS 算是开源分布式文件系统中最完整实现了 GFS 论文中的概念模型。Hadoop也由于其开源特性,使得它成为分布式计算系统事实上的国际标准。

二、GFS与HDFS的异同

具体而言,GFS与HDFS的

共同点:

1、都采用单一主控机+多台工作机的模式,由一台主控机(Master)存储系统全部元数据,并实现数据的分布、复制、备份决策,主控机还实现了元数据的checkpoint和操作日志记录及回放功能。工作机存储数据,并根据主控机的指令进行数据存储、数据迁移和数据计算等。

2、都通过数据分块和复制(多副本,一般是3)来提供更高的可靠性和更高的性能。当其中一个副本不可用时,系统都提供副本自动复制功能。同时,针对数据读多于写的特点,读服务被分配到多个副本所在机器,提供了系统的整体性能。

3、都提供了一个树结构的文件系统,实现了类似与Linux下的文件复制、改名、移动、创建、删除操作以及简单的权限管理等。

不同点:

1、GFS支持多客户端并发Append模型,允许文件被多次或者多个客户端同时打开以追加数据;HDFS文件只允许一次打开并追加数据,客户端先把所有数据写入本地的临时文件中,等到数据量达到一个块的大小(通常为64MB),再一次性写入HDFS文件。

2、GFS采用主从模式备份Master的系统元数据,当主Master失效时,可以通过分布式选举备机接替,继续对外提供服务;而HDFS的Master的持久化数据只写入到本机,可能采用磁盘镜像作为预防,出现故障时需要人工介入

3、GFS支持数据库快照,而HDFS不支持

4、GFS写入数据时,是实时写入到物理块;而HDFS是积攒到一定量,才持久化到磁盘。

1)认为组件失效是一种常态,提供了容错机制,自动负载均衡,使得分布式文件系统可以在廉价机器上运行

2)面向大文件存储,系统主要的工作负载是大规模的流式读取,写操作主要是追加方式写,很少有随机写

3)一次写入,多次读取,例如互联网上的网页存储

1、结构

【主服务器Master】

管理所有元数据;租约管理;集群块迁移;无用块回收等。

元数据主要有三类:命名空间、文件和块的映射关系(一个文件包含哪些块)、每个块副本的位置信息。

前两类元数据会以操作日志文件存储在本地磁盘上,并复制到远程Master备机上,容灾需要。块副本的位置信息为Master通过心跳向各个ChunkServer轮询获得,无需持久化,避免了ChunkServer变更时的Master和ChunkServer的数据同步问题。

【块服务器chunkserver】

数据存储节点,文件被分割为固定大小的块(Chunk),每个块被唯一标识,默认情况下,每个块有3个副本。

【客户端】

与 Master节点的通信只获取元数据,所有的数据操作都直接和 Chunk 服务器进行交互;GFS提供了一套类似传统文件系统的 API 接口,客户端以库的形式被链接到客户程序里,并非一个独立的系统。

2、读取

客户端将服务所要读取的文件名与byte offset,根据系统chunk大小,换算成文件的chunk index,即文件数据所处的第几个chunk。将filename与chunk index传给master。

Master返回给client元数据信息(包含chunk handle与实际存储的chunkserver location)。

client获取到该信息,直接对chunkserver发出读请求。对于三副本而言(一份chunk存储在三台不同的chunkserver),client选择离自己最近的chunkserver(网络?),通过之前获取的元数据信息找到需要读的chunk位置以及下一个chunk位置。如果缓存的元数据信息已过期,则需要重新向master去获取一遍。

Chunkserver返回给client要读的数据信息。

3、写入

客户端请求 Master, 询问chunkserver的位置。

Master 返回主chunkserver和次chunkserver的位置信息。

客户端选择最优的网络顺序推送数据到这些chunkserver。

一旦所有的chunkserver确认收到了数据,客户端将发送一个写请求控制命令到主chunkserver。

由主chunkserver分配连续的序列号来确定最终的写入顺序,然后转发写请求到所有次chunkserver

次chunkserver按顺序执行写入操作

次chunkserver写完后向主chunkserver应答确认操作完成。

最后主chunkserver应答客户端,若任意chunkserver写入过程中出现错误,将报告给客户端,由客户端发起重试。

4、容错

无论Master和Chunk Server都有容错机制。容错机制就是维持副本。

四、HDFS

【HDFS特点】

高容错性、可构建在廉价机器上

适合批处理

适合大数据处理

流式文件访问

【HDFS局限】

不支持低延迟访问

不适合小文件存储

不支持并发写入

不支持修改

1、结构

HDFS具有主/从架构。HDFS集群由单个NameNode,和多个datanode构成。

【NameNode】即Master:

管理 HDFS 的名称空间。

管理数据块(Block)映射信息

配置副本策略

处理客户端读写请求。

【DataNode】就是Slave。NameNode 下达命令,DataNode 执行实际的操作。

存储实际的数据块。

执行数据块的读/写操作。

【Secondary NameNode】:并非 NameNode 的热备。当NameNode 挂掉的时候,它并不能马上替换 NameNode 并提供服务。

辅助 NameNode,分担其工作量。

定期合并 fsimage和fsedits,并推送给NameNode。

在紧急情况下,可辅助恢复 NameNode。

【客户端】

提供一些命令来管理、访问 HDFS,比如启动或者关闭HDFS。

与 DataNode 交互,读取或者写入数据;读取时,要与 NameNode 交互,获取文件的位置信息;写入 HDFS 的时候,Client 将文件切分成 一个一个的Block,然后进行存储。

2、读取

1)客户端跟NameNode通信,找到文件块所在的DataNode列表。

2)根据列表,按就近原则(或随机?)挑选一台DataNod,读取每一块。

3)每个DataNode从磁盘读取,返回数据

4)客户端接收后,合成最终需要的文件返回

3、写入

1)客户端跟NameNode通信请求上传文件,NameNode检查目标文件是否存在,父目录是否存在

2)NameNode返回是否可以上传

3)客户端会先对文件进行切分成块。然后向NameNode请求第一个块该传输到哪些DataNode。

4)NameNode返回DataNode列表。

5)客户端请求一个DataNode上传数据,第一个DataNode收到请求会继续调用第二个DataNode,然后第二个调用第三个DataNode,将整个pipeline建立完成,逐级返回客户端。

6)客户端开始向第一个DataNode传输块,第一个DataNode接收的同时传给第二台,第二台传给第三台

7)当一个块传输完成时,客户端再次请求NameNode上传第二个块,以此类推。

4、容错

(1)故障检测

1、节点故障

DataNode主动向NameNode发送心跳消息。

2、网络故障

应答信号

3、数据损坏

DataNode定期发送报告信息给NameNode,报告前先校验,异常不发送有问题的数据块信息,NameNode对照可以知晓情况。

(2)故障处理

1、读写故障处理

1)读取故障

如果一个DataNode出问题,会试图找另一个(应该是备份节点吧)

2)写入故障

检测应答信号,无则跳过

2、DataNode故障处理

NameNode维护两张表:数据块表和DataNode表,定期检测,发现有损坏的会发指令让DataNode进行拷贝或备份。

5、副本

副本指DataNode的副本。副本尽量放在不同的机架。

五、总结

由于分布式文件系统存储文件时都切割成块,因此特别擅长处理巨大的文件。除此而外,有

高性能:可并行读取、写入

高可用:主从机制

良好的伸缩性:架构支持

等特点

我来评几句
登录后评论

已发表评论数()

相关站点

热门文章