头图

在Hadoop HDFS的体系架构中,包含了三个组成部分。它们分别是:NameNode、DataNode和SecondaryNameNode。下图摘至Hadoop官方的网站,它说明了HDFS的体系架构。
image.png

视频讲解如下:
https://www.bilibili.com/video/BV1eh23Y5En9/?aid=113282883000...

一、NameNode的职责

NameNode,即名称节点,它是HDFS的主节点,其主要作用体现在以下几个方面。

1、管理和维护HDFS

NameNode管理和维护HDFS的元信息文件fsimage文件和操作日志文件edits文件,以及管理和维护HDFS命名空间。

1.1 HDFS的元信息文件

fsimage文件是HDFS的元信息文件,该文件中保存了目录和文件的相关信息。通过读取fsimage文件就能获取到HDFS的数据分布情况。在部署好的环境中,可以在$HADOOP_HOME/tmp/dfs/name/current目录中找到该文件,如下图所示。
image.png

HDFS提供了元信息查看器,帮助我们来查看元信息文件中的内容。执行下面的命令:

hdfs oiv -i fsimage_0000000000000016309 -o /root/a.xml -p XML

该命令将fsimage元信息文件格式化生成一个XML文件。查看XML文件的内容如下图所示。这里可以看到HDFS中有一个input目录和一个data.txt文件。
image.png

1.2 HDFS的操作日志文件

NameNode维护的另一个系统文件就是edits文件,该文件中记录的客户端操作。HDFS也提供了日志查看器用来查看edits文件中的内容。edits文件与fsimage文件存放在同一个目录下。执行下面的命令:

hdfs oev -i edits_inprogress_0000000000000000105 -o /root/b.xml

该命令将edits日志文件格式化生成一个XML文件。查看XML文件的内容如下图所示,可以看成这条日志记录的是创建一个目录的操作。
image.png

2、接收客户端的请求

客户端的操作请求,无论是上传数据或者下载数据都是由NameNode负责接收和处理。最终将数据按照数据块的形式保存到数据节点DataNode上。下图说明了HDFS数据上传的过程。

image.png

假设需要上传200M大小的一个文件。按照数据块128M的大小为单位进行切块,该文件就会被切分成两个数据块。客户端发出上传命令后,由DistributedFileSystem对象创建一个DFSClient对象,该对象负责与NameNode建立RPC通信,并请求NameNode生成文件的元信息。当NameNode接收到请求后,会生成对应的元信息,如图3.5中的第4步所示。元信息包含了以下的内容:数据块的个数、存储的位置,以及冗余的位置。例如:数据块1将保存到了DataNode1上,同时,对应的两份冗余存储在DataNode2和DataNode3上。NameNode会将生成的元信息返回给DistributedFileSystem对象,并由其创建输出流对象FSDataOutputStream。然后根据生成的元信息上传数据块。例如图3.5中的第7步所示,客户端会将数据块1上传到了DataNode1上,并通过水平复制将其复制到其他的冗余节点上,最终保证数据块冗余度的要求。通过这样的方式,直到所有的数据块上传成功。

了解到了HDFS数据上传的过程,下图说明了HDFS数据下载的过程。
image.png

二、DataNode的职责

数据节点的主要职责是按照数据块来保存数据。从Hadoop 2.x开始,数据块默认大小是128M。在配置好的环境中,数据块默认保存到了Hadoop安装目录下的tmp目录下,如下图所示。
image.png

从上图可以看出每个数据块文件都是以blk的前缀开头,并且默认大小是134217728字节,即128M。

三、SecondaryNameNode的职责

SecondaryNameNode是HDFS的第二名称节点,其主要作用是合并日志。因为HDFS的最新状态信息是记录在edits日志中,而数据的元信息需要记录在fsimage中。换而言之,fsimage文件维护的并不是最新的HDFS状态信息。因此需要一种机制将edits日志中的最新状态信息合并写入fsimage文件中,这个工作就是由SecondaryNameNode完成的。
SecondaryNameNode不是NameNode的热备,因此当NameNode出现问题的时候,不能由SecondaryNameNode顶替NameNode的工作。下图说明的SecondaryNameNode合并日志的过程。
image.png

那么SecondaryNameNode会在什么情况下执行日志文件的合并呢?触发的条件就是当HDFS发出检查点的时候。在默认情况下,Secondary NameNode每小时或在每100万次事务后执行检查点操作,以先到者为准。可以根据以下两个条参数配置检查点操作的频率:

dfs.namenode.checkpoint.txns:
该值默认值是"1000000",即100w条记录。该属性可以指定自上次执行检查点操作以来的编辑日志事务数。

dfs.namenode.checkpoint.period:
该值默认值是"3600s",即1小时。该属性可以指定自上次执行检查点操作以来经过的时间。

赵渝强老师
33 声望14 粉丝

20年以上的IT行业从业经历,清华大学计算机软件工程专业毕业,京东大学大数据学院院长,Oracle中国有限公司高级技术顾问;曾在BEA、甲骨文、摩托罗拉等世界500强公司担任高级软件架构师或咨询顾问等要职,精通大...