添加namenode详解

This commit is contained in:
LingZhaoHui 2023-11-02 23:44:40 +08:00
parent 7347cd5633
commit 0d2ca989e7
Signed by: zeekling
GPG Key ID: D96E4E75267CA2CC

View File

@ -100,9 +100,43 @@ BlockManager内部的ReplicationMonitor线程会持续从其中取出数据并
NameNode不仅需要管理所有DataNode由于数据写入前需要确定数据块写入位置NameNode还维护着整个机架拓扑NetworkTopology。
![pic](https://pan.zeekling.cn/zeekling/hadoop/nn_0008.png)
包含两个部分机架拓扑结构NetworkTopology和DataNode节点信息。
其中树状的机架拓扑是根据机架感知一般都是外部脚本计算得到在集群启动完成后建立起来整个机架的拓扑结构在NameNode的生命周期内一般不会发生变化
另一部分是比较关键的DataNode信息BlockManager已经提到每一个DataNode上的Blocks集合都会形成一个双向链表
更准确的应该是DataNode的每一个存储单元DatanodeStorageInfo上的所有Blocks集合会形成一个双向链表这个链表的入口就是机架拓扑结构叶子节点即DataNode管理的DatanodeStorageInfo。
## LeaseManager
Lease 机制是重要的分布式协议广泛应用于各种实际的分布式系统中。HDFS支持Write-Once-Read-Many对文件写操作的互斥同步靠Lease实现。
Lease实际上是时间约束锁其主要特点是排他性。客户端写文件时需要先申请一个Lease一旦有客户端持有了某个文件的Lease其它客户端就不可能再申请到该文件的Lease,
这就保证了同一时刻对一个文件的写操作只能发生在一个客户端。NameNode的LeaseManager是Lease机制的核心
维护了文件与Lease、客户端与Lease的对应关系这类信息会随写数据的变化实时发生对应改变。
![pic](https://pan.zeekling.cn/zeekling/hadoop/nn_0009.png)
上图为为LeaseManager内存结构包括以下三个主要核心数据结构
- sortedLeasesLease集合按照时间先后有序组织便于检查Lease是否超时
- leases客户端到Lease的映射关系
- sortedLeasesByPath文件路径到Lease的映射关系
其中每一个写数据的客户端会对应一个Lease每个Lease里包含至少一个标识文件路径的Path。
Lease本身已经维护了其持有者客户端及该Lease正在操作的文件路径集合之所以增加了leases和sortedLeasesByPath为提高通过Lease持有者或文件路径快速索引到Lease的性能。
当Lease发生超时后需要强制回收内存中与该Lease相关的内容要被及时清除。超时检查及超时后的处理逻辑由LeaseManager.Monitor统一执行。
LeaseManager中维护了两个与Lease相关的超时时间软超时softLimit和硬超时hardLimit使用场景稍有不同。
客户端向集群写文件前需要向NameNode的LeaseManager申请Lease写文件过程中定期更新Lease时间以防Lease过期周期与softLimit相关写完数据后申请释放Lease。
整个过程可能发生两类问题:
1写文件过程中客户端没有及时更新Lease时间
2写完文件后没有成功释放Lease。
两个问题分别对应为softLimit和hardLimit。两种场景都会触发LeaseManager对Lease超时强制回收。
如果客户端写文件过程中没有及时更新Lease超过softLimit时间后另一客户端尝试对同一文件进行写操作时触发Lease软超时强制回收
如果客户端写文件完成但是没有成功释放Lease则会由LeaseManager的后台线程LeaseManager.Monitor检查是否硬超时后统一触发超时回收。
转自https://tech.meituan.com/2016/08/26/namenode.html