
# 规划HDFS容量
#### 操作场景
HDFS DataNode以Block的形式，保存用户的文件和目录，同时在NameNode中生成一个文件对象，对应DataNode中每个文件、目录和Block。
NameNode文件对象需要占用一定的内存，消耗内存大小随文件对象的生成而线性递增。DataNode实际保存的文件和目录越多，NameNode文件对象总量增加，需要消耗更多的内存，使集群现有硬件可能会难以满足业务需求，且导致集群难以扩展。
规划存储大量文件的HDFS系统容量，就是规划NameNode的容量规格和DataNode的容量规格，并根据容量设置参数。
配置期间需查看ID为14007、14008、14009的告警是否产生，如果有，请根据业务需要修改告警阈值。
#### 相关概念
- **名称配额** （Name Quotas）
  名称配额是对目录树中文件和目录名称**数量**的硬性限制。
  - 创建文件和目录时如果数量超出配额，创建操作将会失败。用户对目录进行重命名后，该目录原有的名称配额设置会继续生效。如果重命名操作与配额冲突，则重命名操作会失败。即使目录与新配额冲突，设置配额的操作仍会成功。新创建的目录没有关联的配额。如果目录的配额设置为1，会使该目录保持为空状态，因为该目录本身占用一个配额。
  
  - 配额会随fsimage持久保存。系统启动时，如果fsimage与配额冲突（可能是fsimage变更），系统会上报异常。设置或删除配额操作会生成日志记录。
   
- **空间配额** （Space Quotas）
  空间配额是对目录树中文件所使用的**字节数量**的硬性限制。
  - 如果设置的配额大小不允许写入一个完整的块，则块分配会失败。数据块的每个副本都会计入配额。用户对目录进行重命名后，该目录原有的空间配额设置会继续生效。如果重命名操作与配额冲突，则重命名操作会失败。配额为0时仍允许创建文件，但是不能将任何块添加到文件中。目录不使用主机文件系统空间，也不计入空间配额。用于保存文件元数据的主机文件系统空间不计入配额。
  
  - 配额会随fsimage持久保存。系统启动时，如果fsimage与配额冲突（可能是fsimage变更），系统会上报异常。设置或删除配额操作会生成日志记录。
   
- **存储类型配额** （Storage Type Quotas）
  存储类型配额是对目录树中的文件使用特定存储类型（SSD，DISK，ARCHIVE）的硬性限制。它在许多方面类似于存储空间配额，但可以对集群存储空间使用情况进行细粒度控制。如果要为某个目录设置存储类型配额，必须先为该目录配置存储策略，这样才能根据存储策略将文件存储在不同的存储类型中。有关更多信息，请参见[HDFS Storage Policy Documentation](https://hadoop.apache.org/docs/stable2/hadoop-project-dist/hadoop-hdfs/ArchivalStorage.html)。
  可以将存储类型配额与空间配额和名称配额结合使用，以有效地管理集群存储使用情况。例如：
  - 对于配置了存储策略的目录，管理员应为资源受限的存储类型（例如SSD）设置存储类型配额，并为其他存储类型和整体空间配额保留配额限制较小或默认为无限制。HDFS将根据存储策略和整体空间配额从目标存储类型中扣除实际使用的配额。
  
  - 对于未配置存储策略的目录，管理员不应配置存储类型配额。即使某种特定的存储类型不可用（或虽然可用但存储类型信息配置不正确），也可以配置存储类型配额。但是在这种情况下，由于存储类型信息缺失或不准确，无法有效实施存储类型配额，因此建议使用整体空间配额。
  
  - 如果集群主要的存储类型为DISK时，不推荐使用存储类型配额。
   
更多相关介绍请参见[HDFS Quotas Guide](https://hadoop.apache.org/docs/stable2/hadoop-project-dist/hadoop-hdfs/HdfsQuotaAdminGuide.html)。
#### NameNode容量规格及参数配置
- NameNode容量规格 在NameNode中，每个文件对象对应DataNode中的一个文件、目录或Block。
  一个文件至少占用一个Block，默认每个Block大小为"134217728"字节即128MB，可通过参数"dfs.blocksize"设置（参数路径：客户端安装目录/HDFS/hadoop/etc/hadoop/hdfs-site.xml），参数说明请参见[表2]。
  默认情况下一个文件小于128MB时，只占用一个Block；文件大于128MB时，占用Block数为：文件大小/128MB。目录不占用Block。
  根据"dfs.blocksize"，NameNode的文件对象数计算方法如下：
  表1NameNode文件对象数计算 
  | 单个文件大小          | 文件对象数                                         |
  |:---|:---|
  | 小于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"规定当前系统可生成的文件对象数（可通过登录FusionInsight Manager，选择"集群 \> 服务 \> HDFS \> 配置 \> 全部配置"，搜索该参数查看），默认值为"0"表示不限制，参数说明请参见[表2]。
   表2HDFS参数说明 
  | 参数名称                     | 参数解释                                                                                                                                                    | 默认值       |
  |:---|:---|:---|
  | dfs.blocksize            | 新文件的默认块大小。 单位：字节。需提供完整的字节数（如果128MB则需设置为134217728）。配置的块大小必须是512字节的倍数。 取值范围：512\~1073741824 | 134217728 |
  | dfs.namenode.max.objects | dfs所支持的最大文件、目录及块数。 如果设置为0，则表示对dfs所支持的对象数无限制。 取值范围：0\~1000000000                              | 0         |
     
  
- NameNode JVM参数配置规则 NameNode JVM参数为"GC_OPTS"，参数说明请参见[表3]。可以参考如下操作修改。
  1. 登录FusionInsight Manager。
  
  2. 选择"集群 \> 服务 \> HDFS \> 配置 \> 全部配置"。
  
  3. 搜索并修改"HDFS-\>NameNode"的"GC_OPTS"参数。
      表3NameNode的"GC_OPTS"参数说明 
     | 参数名称    | 参数解释                                                                                                                                     | 默认值                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
     |:---|:---|:---|
     | GC_OPTS | JVM用于GC的参数。 仅当"GC_PROFILE"参数设置为"custom"时该配置才会生效。 需确保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"。参考值如下表所示。
     表4NameNode 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 |
        
     
  
  4. 单击"保存"，确认操作影响后单击"确定"。
  
  5. 等待界面提示"操作成功"，单击"完成"，配置已修改。 查看集群是否存在配置过期的服务，如果存在，需重启对应服务或角色实例使配置生效。
     
   
- 查看NameNode容量信息
  1. 使用HDFS业务用户登录FusionInsight Manager。
  
  2. 选择"集群 \> 服务 \> HDFS \> NameNode(*xxx*，主)"，进入HDFS WebUI页面。
  
  3. 单击"Overview"，查看"Summary"显示的当前HDFS文件对象、文件数量、目录数量和Block数量信息。
     图1Summary信息   
     ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000002280632257.png "点击放大") 
   
 
#### DataNode容量规格及参数配置
- DataNode容量规格 在HDFS中，Block以副本的形式存储在DataNode中，默认副本数为"3"，对应参数为"dfs.replication"。
  
  表5dfs.replication参数说明 
  | 参数名称            | 参数解释                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                | 默认值 |
  |:---|:---|:---|
  | dfs.replication | 默认的块副本数。 实际的块副本数可在创建文件时指定。如果不指定，将创建当前参数所指定的个数的块备份。 取值范围：1\~16 - 请慎重修改该配置项。当设置为1时，会导致文件存储可靠性下降，故障发生时会出现数据丢失、HDFS服务不可用等异常场景。当丢失的块数超过"dfs.namenode.safemode.threshold-pct"参数设置的容忍阈值，会导致HDFS重启失败。  - 如果一定要设置为1，则必须同时开启"dfs.single.replication.enable"，并将"dfs.namenode.decommission.force.replication.min"的值设置为1；否则，可能导致HDFS服务不可用。   | 3   |
     
  集群中所有DataNode角色实例保存的Block总数为：HDFS Block \* 3。集群中每个DataNode实例平均保存的Blocks= HDFS Block \* 3/DataNode节点数。
  表6DataNode支持规格 
  | 项目                             | 规格        |
  |:---|:---|
  | 单个DataNode实例支持最大Block数         | 5,000,000 |
  | 单个DataNode实例上单个磁盘支持最大Block数    | 500,000   |
  | 单个DataNode实例支持最大Block数需要的最小磁盘数 | 10        |
     
  表7DataNode节点数规划 
  | 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 |
     
  
- DataNode JVM参数配置规则 DataNode JVM参数为"GC_OPTS"，参数说明请参见[表8]。可以参考如下操作修改。
  1. 登录FusionInsight Manager。
  
  2. 选择"集群 \> 服务 \> HDFS \> 配置 \> 全部配置"。
  
  3. 搜索并修改"HDFS-\>DataNode"的"GC_OPTS"参数。
      表8DataNode的"GC_OPTS"参数说明 
     | 参数名称    | 参数解释                                                                                                                                     | 默认值                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
     |:---|:---|:---|
     | GC_OPTS | JVM用于GC的参数。 仅当"GC_PROFILE"参数设置为"custom"时该配置才会生效。 需确保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"。参考值如下表所示。
     表9DataNode 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块数，用户可根据需要调整内存值。
     
  
  4. 单击"保存"，确认操作影响后单击"确定"。
  
  5. 等待界面提示"操作成功"，单击"完成"，配置已修改。 查看集群是否存在配置过期的服务，如果存在，需重启对应服务或角色实例使配置生效。
     
   
- 查看DataNode容量信息 登录FusionInsight Manager，选择"集群 \> 服务 \> HDFS \> NameNode(主)"，单击"DataNodes"，查看所有告警DataNode节点的Block数量信息。
  1. 使用HDFS业务用户登录FusionInsight Manager。
  
  2. 选择"集群 \> 服务 \> HDFS \> NameNode(*xxx*，主)"，进入HDFS WebUI页面。
  
  3. 单击"Datanodes"，查看所有告警DataNode节点的Block数量信息。
     图2Datanodes信息   
     ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000002245765988.png "点击放大") 
   
 
#### 相关文档
- 给某目录设置quota后，往目录中写文件失败，报错"The DiskSpace quota of /tmp/tquota2 is exceeded"，处理步骤请参考[HDFS目录配额不足导致写文件失败](https://support.huaweicloud.com/trouble-mrs/mrs_03_0088.html)
- 在HDFS上设置配额后，HBase启动失败，处理步骤请参考[HDFS上设置配额导致HBase启动失败](https://support.huaweicloud.com/trouble-mrs/mrs_03_0113.html)。
 
