HDFS源码分析(1)----HDFS概述

时间:2023-01-26 08:29:14

感谢朋友支持本博客,欢迎共同探讨交流,由于能力和时间有限,错误之处在所难免,欢迎指正!
如果转载,请保留作者信息。
博客地址:http://blog.csdn.net/gaoxingnengjisuan
邮箱地址:dong.liu@siat.ac.cn


从这篇博文开始,我将会结合以前阅读HDFS源代码的记录,再看一遍HDFS的源码,并进行整理写出来。现在网上和市面上有很多HDFS源码分析的资料,而且写的都不错,我这里只是作为自己的一个资料备份吧,博文整理的过程中肯定会引用到相关已有资料中的内容,我会在博文后面以参考文献的形式进行标注。

HDFS的主要特性

HDFS全称是Hadoop分布式文件系统,作为一个分布式文件系统,它具有高容错的特点。下面来说说它的主要特性:

1.支持超大文件。一个Hadoop文件系统会存储T、P级别的数据。

2.检测和快速应对硬件故障。一般的HDFS系统是由数百台甚至上千台服务器组成,因此,故障检测和自动恢复是HDFS的一个设计目标。

3.流式数据访问。HDFS处理的数据规模都比较大,一般都是批处理,所以它注重的是数据的吞吐量,而不是数据的访问速度。

4.简化的一致性模型。大部分的HDFS程序操作文件时需要一次写入,多次读取。在HDFS中,一个文件一旦经过创建、写入、关闭后,一般就不需要修改了。这样简单的一致性模型,有助于提高吞吐量的数据访问模型。

而HDFS不适用于如下应用:

1.低延迟数据访问。因为HDFS关注的是数据的吞吐量,而不是数据的访问速度,所以HDFS不适用于要求低延迟的数据访问应用。

2.大量的小文件。HDFS是通过将数据分布在数据节点,并将文件的元数据保存在名字节点上来支持超大文件存储的。名字节点的内存大小决定了HDFS系统可保存的文件数量,大量的小文件会影响到名字节点的性能。

3.多用户写入修改文件。HDFS中的文件只能有一个写入者,而且写操作总是在文件末。它不支持多个写入者,也不支持在数据写入后,在文件的任意位置进行修改。

HDFS体系结构

HDFS采用了主从体系结构,主要包括名字节点,数据节点和客户端三个角色。

在一个HDFS系统中,有一个名字节点和一个第二名字节点,有成百上千个数据节点,客户端节点的数量是不确定的,可能会比数据节点的数量还要多。

名字节点可以看做是分布式文件夹系统中的管理者,它负责管理文件系统命名空间、集群配置和数据块复制等。

数据节点是文件存储的基本单元,它以数据块的形式保存了HDFS中文件的内容和数据块的数据校验信息。

客户端和名字节点、数据节点通信,访问HDFS文件系统,操作文件。

名字节点和第二名字节点

名字节点是HDFS主从结构中主节点上运行的主要进程。它是HDFS的书记员,维护着整个文件系统的文件目录树,文件/目录的元信息和文件的数据块索引,即每个文件对应的数据块列表。这些信息以两种形式存储于本地文件系统中:一种是命名空间镜像(也叫文件系统镜像),另一种是命名空间镜像的编辑日志。

命名空间镜像保存着某一特定时刻HDFS的目录树、元信息和数据块索引等信息,后续对这些信息的改动,则保存在编辑日志中,它们一起提供了一个完整的名字节点第一关系。

同时,通过名字节点,客户端还可以获取数据块所在的数据节点信息需要注意的是,名字节点中与数据节点相关的信息不保留在名字节点的本地文件系统中,也就是上面提到的命名空间镜像和编辑日志中,名字节点每次启动时,都会动态的重建这些信息,这些信息构成了名字节点的第二关系。运行时,客户端通过名字节点获取上述信息,然后和数据节点进行交互,读写文件数据。

另外,名字节点还能获取HDFS整体运行状态的一些信息,如系统的可用空间、已经使用的空间、各数据节点的当前状态等。

第二名字节点适用于定期合并命名空间镜像和镜像编辑日志的辅助守护进程。第二名字节点和名字节点的区别在于它不接收或记录HDFS的任何实时变化,而只是根据集群配置的时间间隔,不停地获取HDFS某一个时间点的命名空间镜像和镜像的编辑日志,合并得到一个新的命名空间镜像。该新镜像会上传到名字节点,替换原有的命名空间镜像,并清空上述日志。应该说,第二名字节点配合名字节点,为名字节点上的名字节点第一关系提供了一个简单的检查点机制,并避免出现编辑日志过大,导致名字节点启动时间过长的问题。

名字节点是HDFS集群中的单一故障点,通过第二名字节点的检查点,可以减少停机的时间并减低名字节点元数据丢失的风险。但是,第二名字节点不支持名字节点的故障自动恢复,名字节点失效处理需要人工干预。

数据节点

HDFS是为大文件而设计,但存放在HDFS上的文件和传统文件系统类似,也是将文件分块,然后进行存储。但和传统文件系统不同,在数据节点上,HDFS文件块以Linux文件系统上的普通文件进行保存。客户端进行文件内容操作时,先由名字节点告知客户端每个数据驻留在哪个数据节点,然后客户端直接与数据节点守护进程进行通信,处理与数据块对应的本地文件。同时,数据节点会和其他数据节点进行通信,复制数据块,保证数据的冗余性。

数据节点作为从节点,会不断地向名字节点报告。初始化时,每个数据节点将当前存储的数据块告知名字节点。后续数据节点工作过程中,数据节点仍会不断地更新名字节点,为之提供本地修改的相关信息,并接受来自名字节点的指令,创建、移动或者删除本地磁盘上的数据块。

客户端

客户端是用户和HDFS进行交互的手段,HDFS提供了各种各样的客户端,包括命令行接口、Java API、Thrift接口、C语言库、用户空间文件系统等。


参考文献:

Hadoop技术内幕——深入解析Hadoop Common和HDFS架构设计与实现原理