
# 配置DataNode节点容量不一致时的副本放置策略
#### 操作场景
默认情况下，NameNode会随机选择DataNode节点写入文件。当集群内某些数据节点的磁盘容量大小不一致，会导致磁盘总容量小的节点先写满。通过修改集群默认的DataNode写数据时的磁盘选择策略为"节点磁盘可用空间块放置策略"，可提高将块数据写到磁盘可用空间较大节点的概率，解决因为数据节点磁盘容量不一致导致的节点使用率不均衡的情况，显著提升HDFS的数据可靠性和读写性能。
**NameNode默认的副本存储策略为**：
- 第一副本：存放到客户端所在节点。
- 第二副本：远端机架的数据节点。
- 第三副本：存放到客户端所在节点的相同机架的不同节点。
如还有更多副本，则随机选择其它DataNode。
**"节点磁盘可用空间块放置策略"的副本选择机制为**：
- 第一个副本：存放在客户端所在DataNode（和默认的存放策略一样）。
- 第二个副本：
  - 选择存储节点的时候，先挑选2个满足要求的数据节点。
  
  - 比较这2个节点磁盘空间使用比例，如果磁盘空间使用率的相差小于5%，随机存放到第一个节点。
  
  - 如果磁盘空间使用率相差超过5%，即有60%（由dfs.namenode.available-space-block-placement-policy.balanced-space-preference-fraction指定，默认值0.6）的概率写到磁盘空间使用率低的节点。
   
- 第三副本等其他后续副本的存储情况，也参考第二个副本的选择方式。
 
#### 对系统的影响
调整HDFS数据的磁盘选择策略可能会对HDFS写文件性能产生影响。
#### 前提条件
MRS集群内DataNode节点的磁盘总容量偏差不能超过100%。
#### 操作步骤
1. 登录FusionInsight Manager。 
   登录集群Manager具体操作，请参考[访问MRS集群Manager](https://support.huaweicloud.com/usermanual-mrs/mrs_01_0128.html)。
   
   
2. 选择"集群 \> 服务 \> HDFS \> 配置 \> 全部配置"。
3. 调整HDFS写数据时的依据的磁盘选择策略参数。 
   表1磁盘选择策略参数描述 
   | 参数                             | 参数说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | 配置示例                                                                             |
   |:---|:---|:---|
   | dfs.block.replicator.classname | 选择副本放置的DataNode的策略。 - org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicyDefault：Hadoop标准副本放置逻辑，它采用机架感知（Rack Awareness）策略，在可靠性、网络效率和读写性能之间取得平衡。  - org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicyWithRackGroup：在标准机架感知的基础上，引入了机架组（Rack Group）的概念，允许将多个机架划分为一个逻辑组，从而提供更细粒度的副本放置控制。 需要同步设置"dfs.use.dfs.network.topology"配置项的值为"false"，以及"net.topology.impl"配置项的值为"org.apache.hadoop.net.NetworkTopologyWithRackGroup"，方可启用基于机架组存储策略。   - org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicyWithNodeLabel：通过节点标签（Node Labels）实现对数据块存储位置的精细化控制。该策略允许管理员根据节点的硬件特性（如SSD/HDD）、位置（机架/数据中心）或角色为节点打标签，并基于标签定义存储策略，从而优化数据分布和资源利用率。  - org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicyWithNodeGroup：在标准机架感知的基础上，引入了节点组（Node Group）的概念，允许更灵活地定义故障域和数据冗余规则。该策略适用于复杂网络拓扑（如多数据中心、混合云）或需要更精细故障隔离的场景。  - org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicyWithNonAffinityNodeGroup：在节点组（Node Group）概念的基础上，强制副本不放置在同一节点组内，从而提供更强的故障隔离能力。该策略适用于需要跨数据中心、跨区域部署的高可用性场景，确保即使整个节点组故障，数据仍然可用。  - org.apache.hadoop.hdfs.server.blockmanagement.AvailableSpaceBlockPlacementPolicy：默认值，在Hadoop标准副本放置逻辑的基础上，增加了对DataNode可用空间的感知能力，优先将数据块分配到存储空间充足的节点上，避免因个别节点空间不足导致的写入失败或数据倾斜问题。  - org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicyRackFaultTolerant：通过优化副本在机架间的分布方式，确保在多个机架同时故障时仍能保证数据可用性，适用于对可靠性要求极高的大规模集群。   | org.apache.hadoop.hdfs.server.blockmanagement.AvailableSpaceBlockPlacementPolicy |
      
   
   
4. 保存修改的配置。保存完成后请重新启动配置过期的服务或实例以使配置生效。
 
