NameNode堆内存估算

在HDFS中,数据和元数据是分开存储的,数据文件被分割成若干个数据块,每一个数据块默认备份3份,然后分布式的存储在所有的DataNode上,元数据会常驻在NameNode的内存中,而且随着数据量的增加,在NameNode中内存的元数据的大小也会随着增加,那么这个时候对NameNode的内存的估算就变的非常的重要了。

这里说的内存就是指NameNode所在JVM的堆内存

NameNode内存数据结构非常丰富,除了我们前面讲到的Namespace tree和BlocksMap外,其实还包括如LeaseManager/SnapShotManager/CacheManager/NetworkTopology等管理的数据,但是这些管理数据占用的内存非常的小,我们在估算NameNode内存的时候一般都忽略这些数据所占内存大小。所以在NameNode内存中,主要的内存分别被Namespace tree和BlocksMap占有,那么我们现在只要估算Namespace tree和BlocksMap所占内存即可。

我们在Namespace tree中估算了假设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) = (8 + 72 + 80) ∗ 100M + 8 * 200M + (8 + 72 + 56) ∗ 100M + 8 * 100M = 31.25G

我们在BlocksMap中估算了假设集群中共1亿Block,NameNode可用内存空间固定大小128GB,则BlocksMap占用内存情况:

  • BlocksMap直接内存大小 + (Block直接内存大小 + BlockInfoContiguous直接内存大小) * 100M + LightWeightGSet直接内存大小
  • 28字节 + (40字节 + 136字节) * 100M + 60字节 + (2%*128G) = 19.7475GB

那么综上,假设整个HDFS集群中目录和文件数分别为1亿,Block总量在1亿情况下,NameNode可用内存空间固定大小128GB,总共占用的内存为:

  • Namespace tree所占内存大小 + BlocksMap所占内存大小 = 31.25G + 19.7475GB = 50.9975GB

我们上面已经提供了估算NameNode内存的方式,接下来我们再站在Files和Blocks的粒度上来估算NameNode需要的内存

Files和Blocks

在NameNode内存其实主要的就是存储着两种类型的对象,一个是File对象,一个是Block对象。

从Namespace tree中我们可以得到:

  • 一个File对象的大小大概为:8 + 72 + 56 = 136字节
  • 一个Directory对象的大小大概为:8 + 72 + 80 = 160字节

从BlocksMap中我们可以得到:

  • 一个Block对象的大小大概为:40字节 + 136字节 = 176字节

为了方便计算,我们现在假设不管是File对象还是Block对象,他们每一个占用的内存大约为150字节。

假设现在有一个192MB的文件,数据块的大小是默认的128M,那么这个192MB的文件会被切分成两个数据块,一个数据块的大小是128MB,另一个数据块的大小是64MB。就会有3个对象(1个File对象和2个Block对象)存在于NameNode的内存中,占用的内存的大小大约为 3 * 150字节 = 450字节。

大文件被切分成的数据块越少,那么占用NameNode的内存就越少。比如一个128MB大小文件被切分成一个数据块的时候占用的内存大约是300字节(一个File对象和一个Block对象);相反,128个1MB的文件在NameNode的内存中会产生256个对象(128个File对象 + 128个Block对象),这样的话则会占用256 * 150字节 = 38400字节的内存

节 = 38400字节的内存

Replication(备份)

我们知道HDFS的数据块的默认的备份数是3,我们需要知道的是备份数的设置会影响磁盘容量而不会影响NameNode中内存容量。

如果我们现在设置备份数为1,数据块的大小是128MB。那么一个192MB的文件需要集群的192MB大小的磁盘容量和450字节的内存容量;假设有192TB的数据,这些数据包括了一百万文件和两百万数据块,那么需要集群的192TB磁盘容量和(一百万File对象 + 两百万Block对象) * 150字节 = 450MB的内存容量。

当我们设置备份数为默认备份数(即3)的时候,对于192TB的数据,需要集群的192 TB * 3 = 576 TB的磁盘容量,但是需要的NameNode中的内存容量还是450MB。所以说NameNode中的内存大小和备份数多少关系并不是太大

例子

接下来我们看下两个估算NameNode内存的例子,在看这两个例子之前,我们先记住一个经验值:每一百万个Block需要NameNode的1G内存。

上面的是一个经验值,你可以按照一百万个Block伴随着有一百万个文件和一百万个目录来进行估算下,不管怎么样,这个是一个比较靠谱的经验者,我们可以使用这个经验值进行估算我们的集群需要多少NameNode的内存

例子一

假设有1GB(1024MB)的数据,我们将它切分成不同数量文件和数据块(数据块大小为128M),然后分别来看下NameNode需要消耗多少内存:

一个 1GB 的文件

  • 1个File对象
  • 8个Block对象(1024MB / 128M)

Total = 9个对象 * 150字节 = 1350 bytes

8个文件,每个文件128MB

  • 8个File对象
  • 8个Block对象

Total = 16个对象 * 150字节 = 2400字节

1024个1MB的文件

  • 1024个File对象
  • 1024个Block对象

Total = 2048个对象 * 150字节 = 307200字节

例子二

在这个例子中,我们假设有两个HDFS集群,两个集群的总磁盘容量都是4800 TB。其中集群A的数据块的备份数设置为1,集群B的数据块的备份数设置为3;两个集群的数据块大小都是128M。那么两个集群的NameNode分别需要的最大的堆内存是多少呢?

集群A:200台主机,每台主机的磁盘容量是24 TB,总共的磁盘容量大小是4800 TB
  • 数据块大小是128M,备份数是1
  • 集群的磁盘容量:200 * 24,000,000 MB = 4,800,000,000 MB (4800 TB)
  • 每一个数据块需要的磁盘容量是:128 MB per block * 1 = 128 MB
  • 集群可以容纳的数据块的数量:4,800,000,000 MB / 128 MB = 36,000,000 blocks

我们上面提到,一般情况下,一百万的数据块需要1G的内存,那么36,000,000的数据块就需要36GB的内存

集群B:200台主机,每台主机的磁盘容量是24 TB,总共的磁盘容量大小是4800 TB
  • 数据块大小是128M,备份数是3
  • 集群的磁盘容量:200 * 24,000,000 MB = 4,800,000,000 MB (4800 TB)
  • 每一个数据块需要的磁盘容量是:128 MB per block * 3 = 384 MB
  • 集群可以容纳的数据块的数量:4,800,000,000 MB / 384 MB = 12,000,000 blocks

一般情况下,一百万的数据块需要1G的内存,那么12,000,000的数据块就需要12GB的内存

集群A和集群B的磁盘存储容量都是一样的,但是集群B因为备份数的增加,使得可以存储的数据块的数量变少了,所以集群B的NameNode需要的内存相应的也变小了。

HDFS的NameNode堆内存估算的更多相关文章

  1. hdfs fsimage namenode 应该设置多少堆内存合适

    线上的fsimage 有1.8G左右了,设置了6G heap 不够用了 新生代:老年代=1:2=2G: 4G NameNode的内存主要由NameSpace和BlocksMap占用,其中NameSpa ...

  2. hadoop 小文件 挂载 小文件对NameNode的内存消耗 HDFS小文件解决方案 客户端 自身机制 HDFS把块默认复制3次至3个不同节点。

    hadoop不支持传统文件系统的挂载,使得流式数据装进hadoop变得复杂. hadoo中,文件只是目录项存在:在文件关闭前,其长度一直显示为0:如果在一段时间内将数据写到文件却没有将其关闭,则若网络 ...

  3. HDFS的NameNode中的Namespace管理

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

  4. Hadoop之HDFS及NameNode单点故障解决方案

    Hadoop之HDFS 版权声明:本文为yunshuxueyuan原创文章.如需转载请标明出处: http://www.cnblogs.com/sxt-zkys/QQ技术交流群:299142667 H ...

  5. Spark1.5堆内存分配

    这是spark1.5及以前堆内存分配图 下边对上图进行更近一步的标注,红线开始到结尾就是这部分的开始到结尾 spark 默认分配512MB JVM堆内存.出于安全考虑和避免内存溢出,Spark只允许我 ...

  6. HDFS之NameNode

    NameNode&Secondary NameNode工作机制 1)第一阶段:namenode启动 (1)第一次启动namenode格式化后,创建fsimage和edits文件.如果不是第一次 ...

  7. hadoop中HDFS的NameNode原理

    1. hadoop中HDFS的NameNode原理 1.1. 组成 包括HDFS(分布式文件系统),YARN(分布式资源调度系统),MapReduce(分布式计算系统),等等. 1.2. HDFS架构 ...

  8. HDFS的NameNode与SecondaryNameNode的工作原理

    原文:https://blog.51cto.com/xpleaf/2147375 看完之后确实对nameNode的工作更加清晰一些 在Hadoop中,有一些命名不好的模块,Secondary Name ...

  9. HDFS中NameNode和Secondary NameNode工作机制

    NameNode工作机制 0)启动概述 Namenode启动时,首先将映像文件(fsimage)载入内存,并执行编辑日志(edits)中的各项操作.一旦在内存中成功建立文件系统元数据的映像,则创建一个 ...

随机推荐

  1. 面试必备的10道MySQL题

    MySQL 事务,是我们去面试中高级开发经常会被问到的问题,很多人虽然经常使用 MySQL,SQL 语句也写得很溜,但是面试的时候,被问到这些问题,总是不知从何说起.下面我们先来了解一下什么是 MyS ...

  2. 第1/7Beta冲刺

    1.团队成员 成员姓名 成员学号 秦裕航 201731062432(组长) 刘东 201731062227 张旭 201731062129 王伟 201731062214 2.SCRU部分 2.1各成 ...

  3. Qt信号-槽原理剖析--(1)信号槽简介

    唯有创造才是快乐.只有创造的生灵才是生灵.--罗曼·罗兰 信号槽是观察者模式的一种实现,特性如下: A.一个信号就是一个能够被观察的事件,或者至少是事件已经发生的一种通知: B.一个槽就是一个观察者, ...

  4. Mysql中的读锁,写锁,乐观锁及事务隔离级别和并发问题

    mysql读锁,写锁,乐观锁 读锁,也叫共享锁(shared lock) SELECT * FROM table_name  WHERE ...  LOCK IN SHARE MODE 写锁,也叫排他 ...

  5. RDP Error: The Identity Of The Remote Computer Cannot Be Verified

    As i always need to remote to 20 servers at the same time, so i use a tool called Remote Desktop Con ...

  6. docker深入学习二

    dicker:数据管理 数据管理机制 docker使用union file system来管理数据,docker构建image和container也是采用了同样的技术. image层次 iamge由多 ...

  7. java实现rabbitMQ消息收发方式

    定义:消息队列(MQ)是一种应用程序对应用程序的通信方法是AMQP协议. jar包依赖: <!-- 加入mq消息依赖包 -->  <dependency>         &l ...

  8. Quartus II——工程建立和常用设置

    Quartus ii是针对Altera FPGA的一款EDA软件,在此以一个led闪烁工程来简单说一下基本操作: 一.注意事项 Quartus ii最大的注意事项就一点:工程名称以及工程里面的文件名称 ...

  9. 将ftp目录映射为本地盘符

    1.ftpuser 下载安装FTPUSE下载地址:http://www.ferrobackup.com/ftpuse/ 创建  FTPUSE F: www.xx.com pwd  /USER:admi ...

  10. WebClient 请求 https 页面出错:未能创建 SSL/TLS 安全通道

    ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | Securi ...