调整 NameNode 堆内存

网友投稿 412 2022-11-20

调整 NameNode 堆内存

每个工作负载都有一个唯一的字节分布配置文件。一些工作负载可以使用默认 JVM 设置进行堆内存和垃圾收集,但其他工作负载需要调整。如果动态堆设置导致瓶颈,本主题提供有关调整 NameNode JVM 大小的指南。

所有 Hadoop 进程都在 Java 虚拟机 (JVM) 上运行。JVM 的数量取决于您的部署模式:

​本地​(或独立)模式 - 没有守护程序,一切都在单个 JVM 上运行。​伪分布式​模式 - 每个守护进程(例如 NameNode 守护进程)在单个主机上的自己的 JVM 上运行。​分布式​模式 - 每个守护进程在其自己的 JVM 上跨主机集群运行。

标准 NameNode 配置是一个用于整个命名空间的活动(和主)NameNode,一个用于检查点(但不是故障转移)的​​辅助 NameNode 。​​​高可用性配置将辅助 NameNode 替换为​​备用 NameNode​​,以防止单点故障。每个 NameNode 都使用自己的 JVM。

环境变量

HADOOP_HEAPSIZE设置​所有​Hadoop 项目服务器(如 HDFS、YARN 和 MapReduce)的 JVM 堆大小。HADOOP_HEAPSIZE是作为最大内存 (Xmx) 参数传递给 JVM 的整数。例如:

HADOOP_HEAPSIZE=1024

HADOOP_NAMENODE_OPTS特定于 NameNode 并设置所有必须指定的 JVM 标志。HADOOP_NAMENODE_OPTS会覆盖 NameNode 的HADOOP_HEAPSIZE Xmx 值。例如:

HADOOP_NAMENODE_OPTS=-Xms1024m -Xmx1024m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSParallelRemarkEnabled -XX:+PrintTenuringDistribution -XX:OnOutOfMemoryError={{AGENT_COMMON_DIR}}/killparent.sh

HADOOP_NAMENODE_OPTS和HADOOP_HEAPSIZE都存储在/etc/hadoop/conf/hadoop-env.sh.

监控堆内存使用情况

您可以通过多种方式监控堆内存使用情况:

​Cloudera Manager:​查看 NameNode 图表了解堆内存使用情况。如果您需要从头开始构建图表,请运行:选择 jvm_max_memory_mb、jvm_heap_used_mb 其中 roleType="NameNode"​NameNode Web UI:​向下滚动到摘要并查找“使用的堆内存”。​命令行:​生成堆转储。

文件和块

在 HDFS 中,数据和元数据是解耦的。数据文件被分割成块文件,这些块文件在集群中的 DataNode 上存储和复制。文件系统命名空间树和相关元数据存储在 NameNode 上。

命名空间对象是指向 DataNode 上的块文件的文件 inode 和块。这些命名空间对象作为文件系统映像 (fsimage) 存储在 NameNode 的内存中,并在本地保存。对元数据的更新将写入编辑日志。当 NameNode 启动或​​检查点​​时,应用编辑,清除日志,并创建一个新的 fsimage。​重要提示:​ NameNode 将整个命名空间图像保存在内存中。​​辅助 NameNode​​在其自己的 JVM 上,在创建图像检查点时执行相同的操作。

​平均而言​,每个文件消耗 1.5 个存储块。也就是说,平均文件被分成两个块文件——一个消耗整个分配的块大小,另一个消耗一半。在 NameNode 上,同样的平均文件需要三个命名空间对象——一个文件 inode 和两个块。

磁盘空间与命名空间

CDH 默认块大小 ( dfs.blocksize ) 设置为 128 MB。NameNode 上的每个命名空间对象消耗大约 150 个字节。

在 DataNode 上,数据文件是通过消耗的磁盘空间(实际数据长度)来衡量的,而不一定是完整的块大小。例如,一个 192 MB 的文件占用 192 MB 的磁盘空间,而​不是​块大小的整数倍。使用 128 MB 的默认块大小,将 192 MB 的文件拆分为两个块文件,一个 128 MB 文件和一个 64 MB 文件。在 NameNode 上,命名空间对象是通过文件和块的数量来衡量的。相同的 192 MB 文件由三个命名空间对象(1 个文件 inode + 2 个块)表示,并消耗大约 450 字节的内存。

大文件分成较少的块通常比生成许多块的小文件消耗更少的内存。一个 128 MB 的数据文件由 NameNode 上的两个命名空间对象(1 个文件 inode + 1 个块)表示,并消耗大约 300 字节的内存。相比之下,128 个 1 MB 的文件由 256 个命名空间对象(128 个文件 inode + 128 个块)表示,占用大约 38,400 个字节。因此,最佳分割大小是块大小的整数倍,用于内存管理和​​数据局部性优化​​。

默认情况下,Cloudera Manager 为每百万个块分配最大 1 GB 的堆空间(但绝不会少于 1 GB)。您实际需要多少内存取决于您的工作负载,尤其是每个命名空间中生成的文件、目录和块的数量。如果所有文件都按块大小进行拆分,则可以为每百万个​文件​分配 1 GB 。但考虑到每个文件 1.5 个块(2 个块对象)的历史平均值,更保守的估计是每百万​块​1 GB 内存。

​重要提示:​ Cloudera 建议每百万块使用 1 GB 的 NameNode 堆空间来解决命名空间对象、必要的簿记数据结构和远程过程调用 (RPC) 工作负载。在实践中,您的堆需求可能会低于这个保守估计。

复制

默认的块复制因子 ( dfs.replication ) 为 3。​复制会影响磁盘空间,但不会影响内存消耗。​复制会更改每个块所需的存储量,但不会更改块的数量。如果 DataNode 上的一个块文件,由 NameNode 上的一个块表示,被复制了 3 次,则块文件的数量增加了三倍,但代表它们的块的数量没有增加。

关闭复制后,一个 192 MB 的文件会占用 192 MB 的磁盘空间和大约 450 字节的内存。如果您有 100 万个这些文件,或者 192 TB 的数据,则需要 192 TB 的磁盘空间,并且在​不考虑 RPC 工作负载的情况下​,需要 450 MB 的内存:(100 万 inode + 200 万块)* 150 字节。启用默认复制后,您需要 576 TB 的磁盘空间:(192 TB * 3) 但内存使用量保持不变,为 450 MB。当您考虑到簿记和 RPC 并遵循每百万块 1 GB 堆内存的建议时,这种情况下更安全的估计是 2 GB 内存(有或没有复制)。

例子

示例 1:估计使用的 NameNode 堆内存

Alice、Bob 和 Carl 在磁盘上各有 1 GB (1024 MB) 的数据,但被分割成不同大小的文件。Alice 和 Bob 的文件是块大小的一部分,并且需要最少的内存。Carl 没有,并用不必要的命名空间对象填充堆。

​Alice:1 x 1024 MB 文件​

1个文件inode8 个块(1024 MB / 128 MB)

总计 = 9 个对象 * 150 字节 = ​1,350 字节​的堆内存​鲍勃:8 x 128 MB 文件​

8 个文件 inode8块

总计 = 16 个对象 * 150 字节 = ​2,400 字节​的堆内存​卡尔:1,024 x 1 MB 文件​

1,024 个文件 inode1,024 个区块

总计 = 2,048 个对象 * 150 字节 = ​307,200 字节​的堆内存

示例 2:估计所需的 NameNode 堆内存

在这个例子中,内存是通过考虑集群的容量来估计的。值是四舍五入的。两个集群物理存储 4800 TB,或大约 3600 万个​块文件​(默认块大小)。复制确定有多少命名空间块代表这些块文件。

​集群 A​:200 台主机,每台 24 TB = 4800 TB。

块大小=128 MB,​复制=1​集群容量(MB):200 * 24,000,000 MB = 4,800,000,000 MB (4800 TB)每块所需的磁盘空间:每块 128 MB * 1 =每块​128 MB​存储空间以块为单位的集群容量:4,800,000,000 MB / 128 MB =​36,000,000 个块​

在容量上,建议为每百万块分配 1 GB 内存,集群 A 需要 36 GB 的最大堆空间。​集群 B​:200 台主机,每台 24 TB = 4800 TB。

块大小=128 MB,​复制=3​集群容量(MB):200 * 24,000,000 MB = 4,800,000,000 MB (4800 TB)每块所需的磁盘空间:每块 128 MB * 3 =每块​384 MB​存储空间以块为单位的集群容量:4,800,000,000 MB / 384 MB =​12,000,000 个块​

在容量上,建议为每百万块分配 1 GB 内存,集群 B 需要 12 GB 的最大堆空间。

集群 A 和集群 B 都存储相同数量的​块文件​。然而,在集群 A 中,每个块文件都是唯一的,并且由 NameNode 上的一个块表示;在集群 B 中,只有三分之一是唯一的,三分之二是副本。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:JPA
下一篇:智能模拟设计套件解决高速模拟接口的混合信号设计
相关文章

 发表评论

暂时没有评论,来抢沙发吧~