引入
通过前面的学习积累,我们对HDFS已经有了不错的理解,但是学习技术,还是要从细微处见真章!
今天就通过深入NameNode源码,深入看看HDFS是如何实现元数据管理的。
关于源码阅读,我常用的思路是:
- 先对相关技术有一个大致的了解,
- 针对里面感兴趣,或者疑惑的地方,换位思考一下自己来会怎么设计
- 最后再针对性的阅读相关源码
- 首先看源码注释!!!
- 然后找自己的目标代码实现逻辑
- 总结反思自己的设计和源码的设计的区别
NameNode
梳理准备
首先,通过前面对HDFS核心设计的学习,我们知道NameNode的主要职责如下:
- 元数据管理:维护和管理文件系统元数据,如文件/目录信息、文件的Block索引、访问权限等
- Block块管理:负责Block与 DataNode 的映射关系,跟踪Block的存储位置。
- 客户端请求处理:响应客户端的文件操作请求,比如创建、删除、读取和写入文件等。
- 集群状态监控:监控整个 HDFS 集群的健康状况和数据存储状态。
有上一篇对RPC的学习,后面3个职责,我们可以很容易想到,可以通过利用RPC节点间通信的能力去实现,由于本文重点是元数据管理,所以下面我们重点看看元数据管理这块。
NameNode就像一个公司的领导者,它要管理整个公司,那自然得清楚手下有些什么人,有些什么资源,而这些信息就是所谓的元数据。所以如果我们要设计NameNode这么一个角色的话,那如何管理元数据就至关重要了。
在设计之前,我们先梳理一下对于元数据管理的核心需求:
- 能高效管理元数据信息;
- 能实时响应客户端的文件操作请求;
- 能保证元数据的数据质量。
针对核心需求,我们可以如下设计:
- 考虑到要高效管理,我们对于元数据增删改查都很频繁,可以考虑采用多层级的树形结构(如 B + 树)来组织目录结构,方便快速的处理;
- 考虑到网络瓶颈,可以用更紧凑的数据结构来存储元数据;
- 要能实时处理客户端的请求,那最好得把元数据放到内存里面;
- 要保证元数据质量,那引入WAL(Write-Ahead Logging)机制也就很必要了,把修改操作日志写入到磁盘,做持久化处理,能很好的保障元数据的完整性和可靠性。
深入源码
接下来,我们就进入HDFS的源码,去验证一下我们的思路对不对。
先从NameNode对应的核心实现类(org.apache.hadoop.hdfs.server.namenode.NameNode)开始,可以看到源码备注里面写着如下内容:
NameNode serves as both directory namespace manager and "inode table" for the Hadoop DFS. There is a single NameNode running in any DFS deployment. (Well, except when there is a second backup/failover NameNode, or when using federated NameNodes.)
The NameNode controls two critical tables:
1) filename-> blocksequence (namespace)
2) block-> machinelist ("inodes")
The first table is stored on disk and is very precious.
The second table is rebuilt every time the NameNode comes up.
'NameNode' refers to both this class as well as the 'NameNode server'.The 'FSNamesystem' class actually performs most of the filesystem management. The majority of the 'NameNode' class itself is concerned with exposing the IPC interface and the HTTP server to the outside world,plus some configuration management.
翻译:
NameNode 充当 Hadoop DFS 的目录命名空间管理器和 “inode table”。在部署的任何 DFS 集群中,都只有一个 NameNode 在运行。(好吧,除非有第二个备份 / 故障转移的 NameNode,或者使用联邦时除外。)
NameNode 控制两个关键的表:
1)文件名 -> block块序列(命名空间)
2)数据块 -> 机器列表(“索引节点”)第一个表非常珍贵,所以存储在磁盘上。(因为文件与block块之间的关系是不会发生变化的)
第二个表在每次 NameNode 启动时都会重新构建。
“NameNode”既指这个类,也指“NameNode 服务器”。“FSNamesystem”类实际上执行了大部分的文件系统管理。“NameNode”类本身的大部分内容都与向外部世界公开 IPC 接口和 HTTP 服务器有关,再加上一些配置管理。
ps:可以看到源码备注用词还是很简单的,我这刚过四级的水平也能轻松读懂
标签:HDFS,文件,文件系统,数据管理,深入,NameNode,inode,源码 From: https://blog.csdn.net/qq_41478243/article/details/145117332