更新时间:2024-10-28 GMT+08:00

规划HDFS容量

HDFS DataNode以Block的形式,保存用户的文件和目录,同时在NameNode中生成一个文件对象,对应DataNode中每个文件、目录和Block。

NameNode文件对象需要占用一定的内存,消耗内存大小随文件对象的生成而线性递增。DataNode实际保存的文件和目录越多,NameNode文件对象总量增加,需要消耗更多的内存,使集群现有硬件可能会难以满足业务需求,且导致集群难以扩展。

规划存储大量文件的HDFS系统容量,就是规划NameNode的容量规格和DataNode的容量规格,并根据容量设置参数。

容量规格

  • NameNode容量规格

    在NameNode中,每个文件对象对应DataNode中的一个文件、目录或Block。

    一个文件至少占用一个Block,默认每个Block大小为“134217728”即128MB,对应参数为“dfs.blocksize”。默认情况下一个文件小于128MB时,只占用一个Block;文件大于128MB时,占用Block数为:文件大小/128MB。目录不占用Block。

    根据“dfs.blocksize”,NameNode的文件对象数计算方法如下:
    表1 NameNode文件对象数计算

    单个文件大小

    文件对象数

    小于128MB

    1(对应文件)+1(对应Block)=2

    大于128MB(例如128G)

    1(对应文件)+1,024(对应128GB/128MB=1024 Block)=1,025

    主备NameNode支持最大文件对象的数量为300,000,000(最多对应150,000,000个小文件)。“dfs.namenode.max.objects”规定当前系统可生成的文件对象数,默认值为“0”表示不限制。

  • DataNode容量规格

    在HDFS中,Block以副本的形式存储在DataNode中,默认副本数为“3”,对应参数为“dfs.replication”。

    集群中所有DataNode角色实例保存的Block总数为:HDFS Block * 3。集群中每个DataNode实例平均保存的Blocks= HDFS Block * 3/DataNode节点数。

    表2 DataNode支持规格

    项目

    规格

    单个DataNode实例支持最大Block数

    5,000,000

    单个DataNode实例上单个磁盘支持最大Block数

    500,000

    单个DataNode实例支持最大Block数需要的最小磁盘数

    10

    表3 DataNode节点数规划

    HDFS Block数

    最少DataNode角色实例数

    10,000,000

    10,000,000 *3/5,000,000 = 6

    50,000,000

    50,000,000 *3/5,000,000 = 30

    100,000,000

    100,000,000 *3/5,000,000 = 60

内存参数设置

  • NameNode JVM参数配置规则

    NameNode JVM参数“GC_OPTS”默认值为:

    -Xms2G -Xmx4G -XX:NewSize=128M -XX:MaxNewSize=256M -XX:MetaspaceSize=128M -XX:MaxMetaspaceSize=128M -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=65 -XX:+PrintGCDetails -Dsun.rmi.dgc.client.gcInterval=0x7FFFFFFFFFFFFFE -Dsun.rmi.dgc.server.gcInterval=0x7FFFFFFFFFFFFFE -XX:-OmitStackTraceInFastThrow -XX:+PrintGCDateStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=1M -Djdk.tls.ephemeralDHKeySize=3072 -Djdk.tls.rejectClientInitiatedRenegotiation=true -Djava.io.tmpdir=${Bigdata_tmp_dir}

    NameNode文件数量和NameNode使用的内存大小成比例关系,文件对象变化时请修改默认值中的“-Xms2G -Xmx4G -XX:NewSize=128M -XX:MaxNewSize=256M”。参考值如下表所示。
    表4 NameNode JVM配置

    文件对象数量

    参考值

    10,000,000

    “-Xms6G -Xmx6G -XX:NewSize=512M -XX:MaxNewSize=512M”

    20,000,000

    “-Xms12G -Xmx12G -XX:NewSize=1G -XX:MaxNewSize=1G”

    50,000,000

    “-Xms32G -Xmx32G -XX:NewSize=3G -XX:MaxNewSize=3G”

    100,000,000

    “-Xms64G -Xmx64G -XX:NewSize=6G -XX:MaxNewSize=6G”

    200,000,000

    “-Xms96G -Xmx96G -XX:NewSize=9G -XX:MaxNewSize=9G”

    300,000,000

    “-Xms164G -Xmx164G -XX:NewSize=12G -XX:MaxNewSize=12G”

  • DataNode JVM参数配置规则

    DataNode JVM参数“GC_OPTS”默认值为:

    -Xms2G -Xmx4G -XX:NewSize=128M -XX:MaxNewSize=256M -XX:MetaspaceSize=128M -XX:MaxMetaspaceSize=128M -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=65 -XX:+PrintGCDetails -Dsun.rmi.dgc.client.gcInterval=0x7FFFFFFFFFFFFFE -Dsun.rmi.dgc.server.gcInterval=0x7FFFFFFFFFFFFFE -XX:-OmitStackTraceInFastThrow -XX:+PrintGCDateStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=1M -Djdk.tls.ephemeralDHKeySize=3072 -Djdk.tls.rejectClientInitiatedRenegotiation=true -Djava.io.tmpdir=${Bigdata_tmp_dir}

    集群中每个DataNode实例平均保存的Blocks= HDFS Block * 3/DataNode节点数,单个DataNode实例平均Block数量变化时请修改默认值中的“-Xms2G -Xmx4G -XX:NewSize=128M -XX:MaxNewSize=256M”。参考值如下表所示。

    表5 DataNode JVM配置

    单个DataNode实例平均Block数量

    参考值

    2,000,000

    “-Xms6G -Xmx6G -XX:NewSize=512M -XX:MaxNewSize=512M”

    5,000,000

    “-Xms12G -Xmx12G -XX:NewSize=1G -XX:MaxNewSize=1G”

    Xmx内存值对应DataNode节点块数阈值,每GB对应500000块数,用户可根据需要调整内存值。

查看HDFS容量状态

  • NameNode信息

    登录FusionInsight Manager,选择“集群 > 服务 > HDFS > NameNode(主)”,单击“Overview”,查看“Summary”显示的当前HDFS文件对象、文件数量、目录数量和Block数量信息。

  • DataNode信息

    登录FusionInsight Manager,选择“集群 > 服务 > HDFS > NameNode(主)”,单击“DataNodes”,查看所有告警DataNode节点的Block数量信息。

  • 告警信息

    监控ID为14007、14008、14009的告警是否产生,根据业务需要修改告警阈值。