9.3 HDFS体系结构
想要了解HDFS的体系结构,首先从HDFS的相关概念入手,下面将介绍HDFS中的几个重要概念。
9.3.1 HDFS的相关概念
1.块(Block)
我们知道,在操作系统中都有一个文件块的概念,文件以块的形式存储在磁盘中,此处块的大小代表系统读/写可操作的最小文件大小。也就是说,文件系统每次只能操作磁盘块大小的整数倍数据。通常来说,一个文件系统块大小为几千字节,而磁盘块大小为512字节。文件的操作都由系统完成,这些对用户来说都是透明的。
这里,我们所要介绍的HDFS中的块是一个抽象的概念,它比上面操作系统中所说的块要大得多。在配置Hadoop系统时会看到,它的默认块大小为64MB。和单机上的文件系统相同,HDFS分布式文件系统中的文件也被分成块进行存储,它是文件存储处理的逻辑单元(如果没有特别指出,后文中所描述的块都是指HDFS中的块)。
HDFS作为一个分布式文件系统,设计是用来处理大文件的,使用抽象的块会带来很多好处。一个好处是可以存储任意大的文件而又不会受到网络中任一单个节点磁盘大小的限制。可以想象一下,单个节点存储100TB的数据是不可能的,但是由于逻辑块的设计,HDFS可以将这个超大的文件分成众多块,分别存储在集群的各个机器上。另外一个好处是使用抽象块作为操作的单元可以简化存储子系统。这里之所以提到简化,是因为这是所有系统的追求,而对故障出现频繁、种类繁多的分布式系统来说,简化就显得尤为重要。在HDFS中块的大小固定,这样它就简化了存储系统的管理,特别是元数据信息可以和文件块内容分开存储。不仅如此,块更有利于分布式文件系统中复制容错的实现。在HDFS中,为了处理节点故障,默认将文件块副本数设定为3份,分别存储在集群的不同节点上。当一个块损坏时,系统会通过NameNode获取元数据信息,在另外的机器上读取一个副本并进行存储,这个过程对用户来说都是透明的。当然,这里的文件块副本冗余量可以通过文件进行配置,比如在有些应用中,可能会为操作频率较高的文件块设置较高的副本数量以提高集群的吞吐量。
在HDFS中,可以通过终端命令直接获得文件和块信息,比如以下命令可以列出文件系统中组成各个文件的块(有关HDFS的命令,将会在9.4节中详细讲解):
hadoop fsck/-files-blocks
2.NameNode和DataNode
HDFS体系结构中有两类节点,一类是NameNode,另一类是DataNode。这两类节点分别承担Master和Worker的任务。NameNode就是Master管理集群中的执行调度,DataNode就是Worker具体任务的执行节点。NameNode管理文件系统的命名空间,维护整个文件系统的文件目录树及这些文件的索引目录。这些信息以两种形式存储在本地文件系统中,一种是命名空间镜像(Namespace image),一种是编辑日志(Edit log)。从NameNode中你可以获得每个文件的每个块所在的DataNode。需要注意的是,这些信息不是永久保存的,NameNode会在每次系统启动时动态地重建这些信息。当运行任务时,客户端通过NameNode获取元数据信息,和DataNode进行交互以访问整个文件系统。系统会提供一个类似于POSIX的文件接口,这样用户在编程时无须考虑NameNode和DataNode的具体功能。
DataNode是文件系统Worker中的节点,用来执行具体的任务:存储文件块,被客户端和NameNode调用。同时,它会通过心跳(Heartbeat)定时向NameNode发送所存储的文件块信息。