分布式文件系统介绍
什么是分布式文件系统:
分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连。分布式文件系统的设计基于客户机/服务器模式。
常见分布式文件系统:
常见的分布式文件系统有NFS、KFS、AFS、HDFS等。下面我们对NFS、KFS、AFS进行简单介绍:
NFS(Network File System):NFS的实质在于用户间计算机的共享。用户可以联结到共享计算机并像访问本地硬盘一样访问共享计算机上的文件。管理员可以建立远程系统上文件的访问,以至于用户感觉不到他们是在访问远程文件。
KFS(Kosmos distributed file system):是一个专门为数据密集型应用(搜索引擎,数据挖掘等)而设计的存储系统,类似于Google的GFS和Hadoop的HDFS分布式文件系统。 KFS使用C++实现,支持的客户端包括C++,Java和Python。KFS系统由三部分组成,分别是metaserver、chunkserver和client library。
AFS(Andrew File System):是专门为在大型分布式环境中提供可靠的文件服务而设计的。它通过基于单元的结构生成一种可管理的分布式环境。一个单元是某个独立区域中文件服务器和客户机系统的集合,这个独立区域由特定的机构管理。通常代表一个组织的计算资源。用户可以和同一单元中其他用户方便地共享信息,他们也可以和其他单元内的用户共享信息,这取决于那些单元中的机构所授予的访问权限。
这三个系统我们只是简单的了解一下他们的概念,之所以把这些材料收集给大家看主要是想引入我们今天要重点介绍的分布式文件系统——HDFS
Hadoop分布式文件系统(HDFS)被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统。它和现有的分布式文件系统有很多共同点。但同时,它和其他的分布式文件系统的区别也是很明显的。HDFS是一个高度容错性的系统,适合部署在廉价的机器上。
HDFS是Hadoop的一部分,而hadoop又曾经是是lucene的一部分:
HDFS概述:
(图2)
分布式操作系统特点:
datanode和namenode都是运行在普通的机器之上的软件,机器典型的都是GNU/Linux,HDFS是用java编写的,任何支持java的机器都可以运行namenode或datanode,利用java语言的超轻便型,很容易将HDFS部署到大范围的机器上。典型的部署是由一个专门的机器来运行namenode软件,集群中的其他每台机器运行一个datanode实例。
大数据集:运行在HDFS之上的程序有很大量的数据集。典型的HDFS文件大小是GB到TB的级别。所以,HDFS被调整成支持大文件。
简单一致性模型:大部分的HDFS程序对文件操作需要的是一次写多次读取的操作模式。一个文件一旦创建、写入、关闭之后就不需要修改了。这个假定简单化了数据一致的问题和并使高吞吐量的数据访问变得可能。一个Map-Reduce程序或者网络爬虫程序都可以完美地适合这个模型。
异构软硬件平台间的可移植性:HDFS被设计成可以简便地实现平台间的迁移,这将推动需要大数据集的应用更广泛地采用HDFS作为平台。
通信协议:所有的通信协议都是在TCP/IP协议之上构建的。一个客户端和指定TCP配置端口的namenode建立连接之后,它和namenode之间通信的协议是Client Protocal。datanode和namenode之间通过Datanode Protocol通信。
硬件故障:硬件故障是常态,而不是异常。整个HDFS系统将由数百或数千个存储着文件数据片断的服务器组成。实际上它里面有非常巨大的组成部分,每一个组成部分都很可能出现故障,这就意味着HDFS里的总是有一些部件是失效的,因此,故障的检测和自动快速恢复是HDFS一个很核心的设计目标。
HDFS的异常状态:
HDFS的主要目标就是在存在故障的情况下也能可靠地存储数据。三个最常见的故障是namenode故障,datanode故障和网络断开。
一个datanode周期性发送一个心跳包到namenode。网络断开会造成一组datanode子集和namenode失去联系。namenode根据缺失的心跳信息判断故障情况。namenode将这些datanode标记为死亡状态,不再将新的IO请求转发到这些datanode上,这些datanode上的数据将对HDFS不再可用,可能会导致一些块的复制因子降低到指定的值。
namenode检查所有的需要复制的块,并开始复制他们到其他的datanode上。重新复制在有些情况下是不可或缺的,例如:datanode失效,副本损坏,datanode磁盘损坏或者文件的复制因子增大。
数据正确性
从datanode上取一个文件块有可能是坏块,坏块的出现可能是存储设备错误,网络错误或者软件的漏洞。HDFS客户端实现了HDFS文件内容的校验。当一个客户端创建一个HDFS文件时,它会为每一个文件块计算一个校验码并将校验码存储在同一个HDFS命名空间下一个单独的隐藏文件中。当客户端访问这个文件时,它根据对应的校验文件来验证从datanode接收到的数据。如果校验失败,客户端可以选择从其他拥有该块副本的datanode获取这个块。
FsImage和Editlog是HDFS的核心数据结构。这些文件的损坏会导致整个集群的失效。因此,namenode可以配置成支持多个FsImage和EditLog的副本。任何FsImage和EditLog的更新都会同步到每一份副本中。namenode对于一个HDFS集群是单点失效的。假如namenode失效,就需要人工的干预。目前,还不支持自动重启和到其它namenode的切换。
NFS、DFS、AFS、HDFS的比较:
|
NFS |
KFS |
AFS |
HDFS |
功能 |
通过使用NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件。
|
专门为数据密集型应用(搜索引擎,数据挖掘等)而设计的存储系统,类似于Google的GFS和Hadoop的HDFS |
能够使来自任何通过这个国家的 AFS 机器能够在文件一经在外地存储就能访问。AFS较NFS有所增强。 |
HDFS是一个高度容错性的系统,适合部署在廉价的机器上。HDFS能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。 |
平台支持 |
|
KFS使用C++实现,支持的客户端包括C++,Java和Python |
|
机器典型的都是GNU/Linux,HD用java编写 |
<!--EndFragment-->