在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文件,里面记录了每个文件的相信信息。
三、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
比如该文件中记录的操作为创建了/20180716目录