HDFS namenode(1)

原文链接: https://tech.meituan.com/2016/08/26/namenode.html

HDFS NameNode内存全景(美团技术团队)

1.概述

NameNode管理着整个HDFS文件系统的元数据。从架构设计上看,元数据大致分成两个层次:

  • Namespace管理层: 负责管理文件系统中的树状目录结构以及文件与数据块的映射关系;
  • 块管理层: 负责管理文件系统中文件的物理块与实际存储位置的映射关系BlocksMap。
  1. Namespace管理的元数据除内存常驻外,也会周期Flush到持久化设备上FsImage文件
  2. BlocksMap元数据只在内存中存在

当NameNode发生重启,首先从持久化设备中读取FsImage构建Namespace,之后根据DataNode的汇报信息重新构造BlocksMap。
这两部分数据结构是占据了NameNode大部分JVM Heap空间。

除了对文件系统本身元数据的管理之外,NameNode还需要维护整个集群的机架及DataNode的信息、Lease管理以及集中式缓存引入的缓存管理等等。这几部分数据结构空间占用相对固定,且占用较小。

测试数据显示,Namespace目录和文件总量到2亿,数据块总量到3亿后,常驻内存使用量超过90GB。

2.内存全景

在这里插入图片描述
如前述,NameNode整个内存结构大致可以分成四大部分:

  • Namespace
  • BlocksMap
  • NetworkTopology
  • 其它

Namespace:维护整个文件系统的目录树结构及目录树上的状态变化; BlockManager:维护整个文件系统中与数据块相关的信息及数据块的状态变化; NetworkTopology:维护机架拓扑及DataNode信息,机架感知的基础; 其它: LeaseManager:读写的互斥同步就是靠Lease实现,支持HDFS的Write-Once-Read-Many的核心数据结构; CacheManager:Hadoop 2.3.0引入的集中式缓存新特性,支持集中式缓存的管理,实现memory-locality提升读性能; SnapshotManager:Hadoop 2.1.0引入的Snapshot新特性,用于数据备份、回滚,以防止因用户误操作导致集群出现数据问题; DelegationTokenSecretManager:管理HDFS的安全访问; 另外还有临时数据信息、统计信息metrics等等。

NameNode常驻内存主要被NamespaceBlockManager使用,二者使用占比分别接近50%。其它部分内存开销较小且相对固定,与Namespace和BlockManager相比基本可以忽略。

3. 内存分析

3.1 Namespace

与单机文件系统相似,HDFS对文件系统的目录结构也是按照树状结构维护,Namespace保存了目录树及每个目录/文件节点的属性。除在内存常驻外,这部分数据会定期flush到持久化设备上,生成一个新的FsImage文件,方便NameNode发生重启时,从FsImage及时恢复整个Namespace。图3所示为Namespace内存结构。前述集群中目录和文件总量即整个Namespace目录树中包含的节点总数,可见Namespace本身其实是一棵非常巨大的树。

图1:namespace

在整个Namespace目录树中存在两种不同类型的INode数据结构:INodeDirectory和INodeFile。其中INodeDirectory标识的是目录树中的目录,INodeFile标识的是目录树中的文件。由于二者均继承自INode,所以具备大部分相同的公共信息INodeWithAdditionalFields,除常用基础属性外,其中还提供了扩展属性features,如Quota、Snapshot等均通过Feature增加,如果以后出现新属性也可通过Feature方便扩展。不同的是,INodeFile特有的标识副本数和数据块大小组合的header(2.6.1之后又新增了标识存储策略ID的信息)及该文件包含的有序Blocks数组;INodeDirectory则特有子节点的列表children。这里需要特别说明children是默认大小为5的ArrayList,按照子节点name有序存储,虽然在插入时会损失一部分写性能,但是可以方便后续快速二分查找提高读性能,对一般存储系统,读操作比写操作占比要高。具体的继承关系见图4所示。


猜你喜欢

转载自blog.csdn.net/answer100answer/article/details/99444891