HDFS的NameNode中的Namespace管理
在NameNode中的Namespace管理层是负责管理整个HDFS集群文件系统的目录树以及文件与数据块的映射关系。以下就是Namespace的内存结构:

以上是一棵文件目录树,可见Namespace本身其实是一棵巨大的树。在这棵树中INodeFile表示文件,INodeDirectory表示文件目录。在HDFS中的实现中,INodeFile和INodeDirectory都是继承INode的,以下是INode的继承关系:

目录树数据结构详细解释
- INode
INode是INodeFile和INodeDirectory父类,有一个关键的属性,就是parent,这个表示当前的INode的父亲INode,每一个文件或者文件目录都会记录它的父亲节点,这样根据这个父子关系就可以构建出一个文件目录树。这个目录树的根节点是/
- INodeWithAdditionalFields
这个类中包含了文件和目录的共同的属性,比如:唯一标识id、INode名称、权限、修改时间、访问时间等基础信息。除常用基础属性外,其中还提供了扩展属性features,如Quota、Snapshot等均通过Feature增加,如果以后出现新属性也可通过Feature方便扩展
- INodeFile
INodeFile表示一个文件,除了继承INode和INodeWithAdditionalFields中的属性外,还有两个文件特殊的属性:
- header:标识存储策略ID、副本数和数据块大小的信息
- blocks:该文件包含的数据块数组
- INodeDirectory
INodeDirectory则持有子节点的列表children。这里需要特别说明children是默认大小为5的ArrayList,按照子节点name有序存储,虽然在插入时会损失一部分写性能,但是可以方便后续快速二分查找提高读性能,对一般存储系统,读操作比写操作占比要高
Namespace内存估算
Namespace管理的文件目录树是存储在NameNode的内存中的,这样是为了提高访问速度。那么我们怎么样来估算Namespace管理的文件目录树占多大内存呢?我们下面从几个关键数据结构所占的内存来估算。
目录和文件结构在继承关系中各属性的内存占用情况如下表所示:

除图中提到的属性信息外,一些附加如ACL等非通用属性,没有在统计范围内
以上每个对象所占内存的大小的估算是在64位操作系统上且没有开启指针压缩功能场景下
根据前面的分析,假设HDFS目录和文件数分别为1亿,Block总量在1亿情况下,整个Namespace在JVM中内存使用情况:
- Total(Directory) = (8 + 72 + 80) ∗ 100M + 8 ∗ num(total children)
- Total(Files) = (8 + 72 + 56) ∗ 100M + 8 ∗ num(total blocks)
- 内存总大小是:Total(Directory) + Total(Files)
上面为什么是乘以100M呢? 因为100M = 100 * 1024 * 1024 bytes = 104857600 bytes,约等于1亿字节,而上面的内存的单位都是字节的,我们乘以100M,就相当于1亿个目录或者1亿个文件了
从整个目录树的父子关系上看,num(total children)就是目录节点数和文件节点数之和。num(total blocks)是1亿。所以上面的场景的Namespace占用的总内存是: Total(Directory) + Total(Files) = (8 + 72 + 80) ∗ 100M + 8 * 200M + (8 + 72 + 56) ∗ 100M + 8 * 100M = 31.25G
Namespace在JVM堆内存空间中常驻,在NameNode的整个生命周期一直在内存存在,同时为保证数据的可靠性,NameNode会定期对其进行Checkpoint,将Namespace物化到外部存储设备(也就是FSImage和EditsLog机制了)。随着数据规模的增加,文件数/目录树也会随之增加,整个Namespace所占用的JVM内存空间也会基本保持线性同步增加。
HDFS的NameNode中的Namespace管理的更多相关文章
- hadoop中HDFS的NameNode原理
1. hadoop中HDFS的NameNode原理 1.1. 组成 包括HDFS(分布式文件系统),YARN(分布式资源调度系统),MapReduce(分布式计算系统),等等. 1.2. HDFS架构 ...
- Hadoop(八)Java程序访问HDFS集群中数据块与查看文件系统
前言 我们知道HDFS集群中,所有的文件都是存放在DN的数据块中的.那我们该怎么去查看数据块的相关属性的呢?这就是我今天分享的内容了 一.HDFS中数据块概述 1.1.HDFS集群中数据块存放位置 我 ...
- HDFS的NameNode堆内存估算
NameNode堆内存估算 在HDFS中,数据和元数据是分开存储的,数据文件被分割成若干个数据块,每一个数据块默认备份3份,然后分布式的存储在所有的DataNode上,元数据会常驻在NameNode的 ...
- Hadoop之HDFS及NameNode单点故障解决方案
Hadoop之HDFS 版权声明:本文为yunshuxueyuan原创文章.如需转载请标明出处: http://www.cnblogs.com/sxt-zkys/QQ技术交流群:299142667 H ...
- HDFS:NameNode、DataNode、SecondaryNameNode
可以一句话描述 HDFS:把客户端的大文件存放在很多节点的数据块中. HDFS设计原则: 1,文件以块(block)方式存储: 2,通过副本机制提高可靠度和读取吞吐量: 3,每个区块至少分到三台Dat ...
- 初识HDFS(10分钟了解HDFS、NameNode和DataNode)
概览 首先我们来认识一下HDFS, HDFS(Hadoop Distributed File System )Hadoop分布式文件系统.它其实是将一个大文件分成若干块保存在不同服务器的多个节点中.通 ...
- HDFS的NameNode与SecondaryNameNode的工作原理
原文:https://blog.51cto.com/xpleaf/2147375 看完之后确实对nameNode的工作更加清晰一些 在Hadoop中,有一些命名不好的模块,Secondary Name ...
- linux中的namespace
本文将就namespace这个知识点,进行简单的归纳总结,力求通俗易通.在资料汇总的过程中,参考了许多网上的博客资料,在文章尾部给出相关链接. namespace,命名空间,从名字 ...
- Cocos2d-x开发中C++内存管理
由于开始并没有介绍C++语言,C++的内存管理当然也没进行任何的说明,为了掌握Cocos2d-x中的内存管理机制,是有必要先了解一些C++内存管理的知识.C++内存管理非常复杂,如果完全地系统地介绍可 ...
随机推荐
- jenkins自动打tag
思路: 1.手动输入需要tag的版本号,如“build001”,填写svn有权限的密码(账号默认值),填写打tag的说明 2.脚本根据tag的版本号,自动创建目录(版本号为目录名称) 3.将需要打ta ...
- SpringBoot + Mybaties的逆向工程有数据库生成domain的过程
环境: jdk1.8 (适合springboot2.X以上版本) Maven(3.3.X以上) spring boot 2.1.6 Idea 2019.1\ 这里随便填 选择相应的Jar,如以下的勾 ...
- GroupBy之后加ToList和不加ToList有什么区别吗?
class Program { static void Main(string[] args) { List<Person> ...
- CRT远程连接centos7,连接超时
CRT远程连接centos7,连接超时 问题原因: 宿主机(win10)和虚拟机(centos7)不在同一个网段 在宿主机无法ping通虚拟机, 首先在cmd窗口ipconfig查看一下vmnet的i ...
- MapReduce面试题
什么是mapreduce Mapreduce是一个分布式运算程序的编程框架,是用户开发“基于hadoop的数据分析应用”的核心框架.容错高,扩展好,适合pB数据处理 MapReduce 执行过程分析 ...
- 一分钟 - 创建python虚拟环境
python创建虚拟环境 python安装第三方库大都是通过pip命令安装,这个命令确实是很简便的,而对于每个独立的项目来说,需要用到的库或许会不同,如果删除或更新原来已有的版本库,或许会导致其他的项 ...
- 本地yum源 、阿里yum源、163yum源的配置安装
一.本地yum源 (我使用的7.3版本) 1..添加一个新的yum源配置文件dvd.repo(文件名字自定义) vi etc/yum.repos.d 添加新的内容: name=rhel_dvd ...
- PAT(B) 1050 螺旋矩阵(Java:24分)
题目链接:1050 螺旋矩阵 (25 point(s)) 题目描述 本题要求将给定的 N 个正整数按非递增的顺序,填入"螺旋矩阵".所谓"螺旋矩阵",是指从左上 ...
- vue使用基础
1. 首先下载node.js安装 下载地址:https://nodejs.org/en/download/ 2. 安装vue脚手架 在cmd命令里面输入 npm install -g @vue/cli ...
- Bootstrap-table 使用总结,和其参数说明
转载于:https://www.cnblogs.com/laowangc/p/8875526.html 一.什么是Bootstrap-table? 在业务系统开发中,对表格记录的查询.分页.排序等处理 ...