在HDFS中有两种节点,分别是NameNode和DataNode。NameNode负责集群中与存储相关的调度,DataNode负责具体的存储任务。

一、NameNode(元数据节点功能)

NameNode维护了整个文件系统的元数据信息,这些信息以两种形式的文件存储,一种是镜像文件(image文件),另一种是编辑日志(edit log)。NameNode会在文件系统启动时,动态地加载这些文件到内存中以响应客户端的读写请求。Namenode是中心服务器,单一节点(简化系统的设计和实现),负责管理文件系统的名称空间(namespace)以及客户端对文件的访问。文件操作,Namenode负责文件元数据的操作,DataNode负责处理文件内容的读写请求,跟文件内容相关的数据流不会经过Namenode,只会询问它跟那个DataNode联系,否则Namenode会成为系统的瓶颈。

副本存放在哪些DataNode上由Namenode来控制,根据全局情况作出块放置决定,读取文件时Namenode尽量让用户先读取最近的副本,降低带块消耗和读取延时。Namenode全权管理数据块的复制,它周期性地从集群中的每个Datanode接收心跳信号和块状态报告。接收到心跳信号意味着该Datanode节点工作正常。块状态报告包含了一个该Datanode上所有数据块的列表。Namenode是主节点,存储文件的元数据如文件名,文件目录结构,文件属性(生成时间,副本数,文件权限)以及每个文件的块列表,以及块所在的DataNode等等。

NameNode具体功能主要包括如下几个方面:

1、NameNode是HDFS中最重要的节点,负责维护HDFS,是HDFS中的主节点

2、NameNode负责接收客户端端发起的操作请求,包括HDFS 文件上传、下载、目录创建、浏览等

3、维护HDFS 元数据信息(fsimage),定期将HDFS内存中不常用的信息刷到磁盘上(fsimage文件中)

4、实时维护操作日志edits,保存HDFS的最新状态

5、负责管理文件系统的名称空间(namespace)

二、元数据文件(fsimage)

1、fsimage功能:

(1)FSImage文件是HDFS中名字节点NameNode上文件/目录元数据在特定某一时刻的持久化存储文件。它的作用不言而喻,在HA出现之前,NameNode因为各种原因宕机后,若要恢复或在其他机器上重启NameNode,重新组织元数据,就需要加载对应的FSImage文件、FSEditLog文件,并在内存中重做FSEditLog文件中的事务条目。

(2)hfsimage记录了HDFS文件系统元数据检查点,记录了HDFS最后一次检查点之前系统中所有目录和文件的序列化信息。

2、fsimage的保存目录:

$HADOOP_HOME/tmp/dfs/name/current

[root@hadoop-server01 current]# ll fsimage_*

-rw-r--r--. 1 root root 58891 Jul 15 06:48 fsimage_0000000000000019746

-rw-r--r--. 1 root root    62 Jul 15 06:48 fsimage_0000000000000019746.md5

-rw-r--r--. 1 root root 58891 Jul 15 21:55 fsimage_0000000000000019747

-rw-r--r--. 1 root root    62 Jul 15 21:55 fsimage_0000000000000019747.md5

fsiamge由于是二进制文件,不可用直接查看,因此可以使用hdfs特定工具查看,下面在HDFS上上传一个文件来查看fsimage信息。

步骤1:创建目录并上传一个文件

[root@hadoop-server01 current]# hadoop fs -mkdir -p /fsimage/test

[root@hadoop-server01 current]# hadoop fs -put /root/hadoop-2.4.1.tar.gz /fsimage/test

步骤2:生成的fsimage可读文件

[root@hadoop-server01 current]# ll fsimage_*

-rw-r--r--. 1 root root 58891 Jul 15 21:55 fsimage_0000000000000019747

-rw-r--r--. 1 root root    62 Jul 15 21:55 fsimage_0000000000000019747.md5

-rw-r--r--. 1 root root 58891 Jul 15 22:05 fsimage_0000000000000019749

-rw-r--r--. 1 root root    62 Jul 15 22:05 fsimage_0000000000000019749.md5

#hdfs oiv -i fsimage_0000000000000019749 -o ~/fsimage/fsimage_0000000000000019749.txt

或者生产xml文件

[root@hadoop-server01 current]# hdfs oiv -i fsimage_0000000000000019749 -o ~/fsimage/fsimage_0000000000000019749.xml -p XML

步骤3:查看fsimage信息

<?xml version="1.0"?>

<fsimage><NameSection>

<genstampV1>1000</genstampV1><genstampV2>3509</genstampV2><genstampV1Limit>0</genstampV1Limit><lastAllocatedBlockId>1073744317</lastAllocatedBlockId><txid>19747</txid></NameSection>

<INodeSection><lastInodeId>20581</lastInodeId><inode><id>16385</id><type>DIRECTORY</type><name></name><mtime>1531142641775</mtime><permission>root:supergroup:rwxr-xr-x</permission><nsquota>9223372036854775807</nsquota><dsquota>-1</dsquota></inode>

<inode><id>16386</id><type>FILE</type><name>hadoop-2.4.1.tar.gz</name><replication>1</replication><mtime>1529372767471</mtime><atime>1529372766100</atime><perferredBlockSize>134217728</perferredBlockSize><permission>root:supergroup:rw-r--r--</permission><blocks><block><id>1073741825</id><genstamp>1001</genstamp><numBytes>134217728</numBytes></block>

<block><id>1073741826</id><genstamp>1002</genstamp><numBytes>4439028</numBytes></block>

</blocks>

.....

这个一个可读的xml文件,里面记录了每个文件的相信信息。

三、Edits文件(操作日志文件)

edits文件保存了HDFS最新状态,即保留了最后一次检查点之后的所有操作。

保存目录:$HADOOP_HOME/tmp/dfs/name/current

[root@hadoop-server01 current]# ll edits_*

-rw-r--r--. 1 root root 1048576 Jul 10 01:47 edits_0000000000000019744-0000000000000019746

-rw-r--r--. 1 root root 1048576 Jul 15 06:48 edits_0000000000000019747-0000000000000019747

-rw-r--r--. 1 root root      42 Jul 15 22:05 edits_0000000000000019748-0000000000000019749

-rw-r--r--. 1 root root 1048576 Jul 15 22:06 edits_0000000000000019750-0000000000000019761

-rw-r--r--. 1 root root      42 Jul 15 22:25 edits_0000000000000019762-0000000000000019763

-rw-r--r--. 1 root root 1048576 Jul 15 22:25 edits_inprogress_0000000000000019764

edits文件同样为二进制文件,如果要查看文件内容需要利用hdfs工具对其进行转换

[root@hadoop-server01 current]#  hdfs oev -i edits_inprogress_0000000000000019764 -o /root/edits/edits_inprogress_0000000000000019764.xml

[root@hadoop-server01 current]# more /root/edits/edits_inprogress_0000000000000019764.xml

<?xml version="1.0" encoding="UTF-8"?>

<EDITS>

 <EDITS_VERSION>-56</EDITS_VERSION>

 <RECORD>

   <OPCODE>OP_START_LOG_SEGMENT</OPCODE>

   <DATA>

     <TXID>19764</TXID>

   </DATA>

 </RECORD>

 <RECORD>

   <OPCODE>OP_MKDIR</OPCODE>

   <DATA>

     <TXID>19765</TXID>

     <LENGTH>0</LENGTH>

     <INODEID>20585</INODEID>

     <PATH>/20180716</PATH>

     <TIMESTAMP>1531718723942</TIMESTAMP>

     <PERMISSION_STATUS>

       <USERNAME>root</USERNAME>

       <GROUPNAME>supergroup</GROUPNAME>

       <MODE>493</MODE>

     </PERMISSION_STATUS>

   </DATA>

 </RECORD>

</EDITS>

比如该文件中记录的操作为创建了/20180716目录