Hadoop 2.X HDFS源码剖析
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.1.2 HDFS基本概念

了解了HDFS整体架构后,我们再介绍HDFS中几个比较重要的概念。

1.数据块(Block)

HDFS中数据块的概念与大部分Linux文件系统(ext2、ext3)的数据块概念相同,HDFS文件是以数据块的形式存储的,数据块是HDFS文件处理的最小单元。由于HDFS文件往往比较大,同时为了最小化寻址开销,所以HDFS数据块也更大,默认是128MB。HDFS数据块会以文件的形式存储在数据节点的磁盘上。

在HDFS中,所有文件都会被切分成若干个数据块分布在数据节点上存储。同时由于HDFS会将同一个数据块冗余备份保存到不同的数据节点上(一个数据块默认保存3份),所以数据块的一个副本丢失了并不会影响这个数据块的访问。

在HDFS的读和写操作中,数据块都是最小单元。在读操作中,HDFS客户端会首先到名字节点查找HDFS文件包含的数据块的位置信息,然后根据数据块的位置信息从数据节点读取数据。而在写操作中,HDFS客户端也会首先从名字节点申请新的数据块,然后根据新申请数据块的位置信息建立数据流管道写数据。

2.名字节点(Namenode)

HDFS是一个典型的Master/Slave结构的分布式系统,名字节点是HDFS主/从结构中的主节点。名字节点管理着文件系统的命名空间(namespace),包括文件系统目录树、文件/目录信息以及文件的数据块索引,这些信息以两个文件的形式永久保存在名字节点的本地磁盘上,即命名空间镜像文件和编辑日志文件。同时名字节点还保存着数据块与数据节点的对应关系,这部分数据并不保存在名字节点的本地磁盘上,而是在名字节点启动时动态构建的。HDFS客户端会通过名字节点获取上述信息,之后读写文件数据。

名字节点是HDFS中的单一故障点,如果名字节点丢失元数据或者损坏,文件系统将出现错误,甚至无法使用。为了解决名字节点的单点问题,Hadoop 2.X版本引入了名字节点高可用性(HA)的支持。在HA实现中,同一个HDFS集群中会配置两个名字节点——活动名字节点和备用名字节点。活动名字节点的内存元数据与备用名字节点是完全同步的,那么在活动名字节点发生故障而停止服务时,备用名字节点可以立即切换为活动状态,而不影响HDFS集群的服务。

名字节点的内存除了保存文件系统的命名空间外,还保存了文件系统中所有数据块与数据节点的对应关系,这意味着如果集群中文件数量过多时,名字节点的内存将成为限制系统横向扩展的瓶颈。为了解决这个问题,Hadoop 2.X版本引入了联邦HDFS机制(HDFS Federation)。联邦HDFS机制允许添加名字节点以实现命名空间的扩展,其中每个名字节点都管理文件系统命名空间中的一部分,是一个独立的命名空间卷(namespace volume)。命名空间卷之间是相互独立的,两两之间并不相互通信,甚至其中一个名字节点失效了也不会影响由其他名字节点维护的命名空间的可用性。例如,一个名字节点可能管理/user目录下的所有文件,而另一个名字节点可能管理/share目录下的所有文件,这两个名字节点独立运行,互不影响。

HDFS名字节点的相关内容我们会在第3章中介绍,包括HDFS元数据的管理,以及名字节点的HA机制等内容。而对于联邦HDFS机制,由于更改较多的是Datanode部分的代码,所以这部分内容我们会在第4章中介绍,请读者参考对应章节学习名字节点的实现。

3.数据节点(Datanode)

数据节点是HDFS中的从节点,数据节点会根据HDFS客户端请求或者Namenode调度将新的数据块写入本地存储,或者读出本地存储上保存的数据块。

数据节点作为HDFS中的从节点,会不断地向名字节点发送心跳、数据块汇报以及缓存汇报,名字节点会通过心跳、数据块汇报以及缓存汇报的响应向数据节点发送指令,数据节点会执行这些指令,例如创建、删除或者复制数据等。

HDFS数据节点的相关内容我们会在第4章中介绍。

4.客户端

HDFS提供了多种客户端接口供应用程序以及用户使用,包括命令行接口、浏览器接口以及代码API接口。用户通过这些接口可以很方便地使用HDFS,而不需要考虑HDFS的实现细节。

而这些HDFS客户端接口的实现都是建立在DFSClient类的基础上的,DFSClient类封装了客户端与HDFS其他节点间的复杂交互,我们会在第5章中介绍HDFS客户端的相关内容。

5.HDFS通信协议

HDFS作为一个分布式文件系统,它的某些流程是非常复杂的(例如读、写文件等典型流程),常常涉及数据节点、名字节点和客户端三者之间的配合、相互调用才能实现。为了降低节点间代码的耦合性,提高单个节点代码的内聚性,HDFS将这些节点间的调用抽象成不同的接口。

HDFS节点间的接口主要有两种类型。

■ Hadoop RPC接口:HDFS中基于Hadoop RPC框架实现的接口。

■ 流式接口:HDFS中基于TCP或者HTTP实现的接口。

由于HDFS通信协议部分内容比较多,我们会单独在本章的HDFS通信协议小节中介绍这两部分内容。