1.NameNode分析
namenode节点主要包含fsimage、edits、seen_txid、VERSION文件;
1.1 fsimage主要存储文件最新的快照数据(元信息以及文件存储的目录树),如下为查看fsimage内容的命令以及对应的内容样例:
bash /home/hadoop3.3.1/hadoop-3.3.1/bin/hdfs oiv -p XML -i fsimage_0000000000000000016 -o /home/fsimage16.xml
16389 FILE hadoop-3.3.1.tar.gz 2 1639018837819 1639018793827 134217728 root:supergroup:0644 1073741827 1003 134217728 1073741828 1004 134217728 1073741829 1005 134217728 1073741830 1006 134217728 1073741831 1007 68316367 0
1.2 edits文件主要存储的是文件操作的详细步骤(实时过程数据)(edits的文件会定期的同步到fsimage中–通过secondaryNameNode来同步,这也是secondaryNameNode的唯一作用),如下为查看edits内容的命令以及对应的内容样例:
bash /home/hadoop3.3.1/hadoop-3.3.1/bin/hdfs oev -i edits_inprogress_0000000000000000044 -o /home/edits.xml
OP_ADD 24 0 16389 /hadoop-3.3.1.tar.gz._COPYING_ 2 1639018793827 1639018793827 134217728 DFSClient_NONMAPREDUCE_-816749945_1 192.168.136.103 true root supergroup 420 0 eac04cbe-68b6-41d2-aabc-f41b781cff4b 3 OP_ALLOCATE_BLOCK_ID 25 1073741827 OP_SET_GENSTAMP_V2 26 1003 OP_ADD_BLOCK 27 /hadoop-3.3.1.tar.gz._COPYING_ 1073741827 0 1003 -2 OP_ALLOCATE_BLOCK_ID 28 1073741828 OP_SET_GENSTAMP_V2 29 1004 OP_ADD_BLOCK 30 /hadoop-3.3.1.tar.gz._COPYING_ 1073741827 134217728 1003 1073741828 0 1004 -2 OP_ALLOCATE_BLOCK_ID 31 1073741829 OP_SET_GENSTAMP_V2 32 1005 OP_ADD_BLOCK 33 /hadoop-3.3.1.tar.gz._COPYING_ 1073741828 134217728 1004 1073741829 0 1005 -2 OP_ALLOCATE_BLOCK_ID 34 1073741830 OP_SET_GENSTAMP_V2 35 1006 OP_ADD_BLOCK 36 /hadoop-3.3.1.tar.gz._COPYING_ 1073741829 134217728 1005 1073741830 0 1006 -2 OP_ALLOCATE_BLOCK_ID 37 1073741831 OP_SET_GENSTAMP_V2 38 1007 OP_ADD_BLOCK 39 /hadoop-3.3.1.tar.gz._COPYING_ 1073741830 134217728 1006 1073741831 0 1007 -2 OP_CLOSE 40 0 0 /hadoop-3.3.1.tar.gz._COPYING_ 2 1639018837819 1639018793827 134217728 false 1073741827 134217728 1003 1073741828 134217728 1004 1073741829 134217728 1005 1073741830 134217728 1006 1073741831 68316367 1007 root supergroup 420 OP_RENAME_OLD 41 0 /hadoop-3.3.1.tar.gz._COPYING_ /hadoop-3.3.1.tar.gz 1639018837823 eac04cbe-68b6-41d2-aabc-f41b781cff4b 13
1.3 seen_txid
存放当前最新的事务id,以此保证数据的完整性;
1.4 VERSION
存放当前namenode的版本信息
namespaceID=1091064552 clusterID=CID-1a520042-fc3d-428d-adf5-66b77af173f0 cTime=1638946985019 storageType=NAME_NODE blockpoolID=BP-223224798-192.168.136.103-1638946985019 layoutVersion=-66
2.SecondaryNameNode分析
主要负责定期把edits文件中的内容合并到fsimage中(checkpoint);
如果namenode为HA模式,则没有SecondaryNameNode进程,具体的合并工作由standby namenode负责,也就是SecondaryNameNode不是必须的进程;
3.NameNode总结
总体来说,NameNode保存了两部分数据:
1.file与block的关系,对应的关系信息存储在fsimage和edits文件中,当NameNode启动的时候会把文件中的元数据信息加载到内存中;
2.datanode与block的关系,对应的关系主要在集群启动的时候保存在内存中,当DataNode启动时会把当前节点上的Block信息和节点信息上报给NameNode;
block块存放在哪些datanode上,只有datanode自己知道,当集群启动的时候,datanode会扫描自己节点上面的所有block块信息,然后把节点和这个节点上的所有block块信息告诉给namenode。这个关系是每次重启集群都会动态加载的【这个其实就是集群为什么数据越多,启动越慢的原因】;
附:
1.注意了,刚才我们说了NameNode启动的时候会把文件中的元数据信息加载到内存中,然后每一个文件的元数据信息会占用150字节的内存空间,这个是恒定的,和文件大小没有关系,咱们前面在介绍HDFS的时候说过,HDFS不适合存储小文件,其实主要原因就在这里,不管是大文件还是小文件,一个文件的元数据信息在NameNode中都会占用150字节,NameNode节点的内存是有限的,所以它的存储能力也是有限的,如果我们存储了一堆都是几KB的小文件,最后发现NameNode的内存占满了,确实存储了很多文件,但是文件的总体大小却很小,这样就失去了HDFS存在的价值;
2.client读数据流程
3.client写数据流程



