
# 更改DataNode的存储目录
#### 操作场景
HDFS DataNode定义的存储目录不正确或HDFS的存储规划变化时，MRS集群管理员需要在FusionInsight Manager中修改DataNode的存储目录，以保证HDFS正常工作。适用于以下场景：
- 更改DataNode角色的存储目录，所有DataNode实例的存储目录将同步修改。
- 更改DataNode单个实例的存储目录，只对单个实例生效，其他节点DataNode实例存储目录不变。
#### 约束与限制
本章节适用于MRS 3.x及后续版本。
#### 对系统的影响
- 更改DataNode角色的存储目录需要停止并重新启动HDFS服务，集群未完全启动前无法提供服务。
 
- 更改DataNode单个实例的存储目录需要停止并重新启动实例，该节点DataNode实例未启动前无法提供服务。
- 服务参数配置如果使用旧的存储目录，需要更新为新目录。
#### 前提条件
- 在各个数据节点准备并安装好新磁盘，并格式化磁盘。
 
- 规划好新的目录路径，用于保存旧目录中的数据。
- 已安装好HDFS客户端。
- 准备好业务用户**hdfs**。
- 更改DataNode单个实例的存储目录时，保持活动的DataNode实例数必须大于"dfs.replication"的值。
#### 操作步骤
**检查环境**
1. 以**root** 用户登录安装HDFS客户端的服务器，执行以下命令配置环境变量。
   
   ```
   source HDFS客户端安装目录/bigdata_env
   ```
   
   
2. 如果集群为安全模式，执行以下命令认证用户身份。 
   ```
   kinit hdfs
   ```
   
   
3. 在HDFS客户端执行以下命令，检查HDFS根目录下全部目录和文件是否状态正常。 
   ```
   hdfs fsck /
   ```
   检查fsck显示结果：
   - 显示如下信息，表示无文件丢失或损坏，执行[4]。
     ```
     The filesystem under path '/' is HEALTHY
     ```
     
   
   - 显示其他信息，表示有文件丢失或损坏，执行[5]。
   
   
   
   
4. 登录FusionInsight Manager，选择"集群 \>服务"查看HDFS的状态"运行状态"是否为"良好"。
   
   ![](https://support.huaweicloud.com/cmpntguide-mrs/zh-cn_image_0000001164270530.png)
   - 是，执行[6]。
   
   - 否，HDFS状态不健康，执行[5]。
   
   
   
   
5. 修复HDFS异常的具体操作，任务结束。
6. 确定修改DataNode的存储目录场景。
   
   - 更改DataNode角色的存储目录，执行[7]。
   
   - 更改DataNode单个实例的存储目录，执行[12]。
   
   
   
   
**更改DataNode角色的存储目录**
7. 选择"集群 \> 服务 \> HDFS \> 停止服务"，停止HDFS服务。
8. 以**root** 用户登录到安装HDFS服务的各个数据节点中，执行如下操作：
   
   1. 创建目标目录（data1,data2为集群原有目录）。 例如目标目录为"${BIGDATA_DATA_HOME}/hadoop/data3/dn"，执行以下命令：
      ```
      mkdir -p ${BIGDATA_DATA_HOME}/hadoop/data3/dn
      ```
      
   
   2. 挂载目标目录到新磁盘。例如挂载"${BIGDATA_DATA_HOME}/hadoop/data3"到新磁盘。
   
   3. 修改新目录的权限。 例如新目录路径为"${BIGDATA_DATA_HOME}/hadoop/data3/dn"，执行以下命令：
      ```
      chmod 700 ${BIGDATA_DATA_HOME}/hadoop/data3/dn -R
      ```
      ```
      chown omm:wheel ${BIGDATA_DATA_HOME}/hadoop/data3/dn -R
      ```
      
   
   4. 将数据复制到目标目录。
      例如旧目录为"${BIGDATA_DATA_HOME}/hadoop/data1/dn"，目标目录为"${BIGDATA_DATA_HOME}/hadoop/data3/dn"，执行以下命令：
      ```
      cp -af ${BIGDATA_DATA_HOME}/hadoop/data1/dn/* ${BIGDATA_DATA_HOME}/hadoop/data3/dn
      ```
      
   
   
   
   
9. 在FusionInsight Manager管理界面，选择"集群 \> 服务 \> HDFS \> 配置 \> 全部配置"，打开HDFS服务配置页面。 
   搜索"dfs.datanode.data.dir"参数，并修改为新的目标目录，例如"${BIGDATA_DATA_HOME}/hadoop/data3/dn"。
    表1参数解释 
   | 参数名称                  | 参数解释                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               | 取值样例                                 |
   |:---|:---|:---|
   | dfs.datanode.data.dir | 表示DataNode在本地文件系统中存储块的位置。默认值为"%{@auto.detect.datapart.dn}"。 - 如果设置为一个以逗号分隔的目录列表（比如 "/srv/BigData/hadoop/data1/dn"或"/srv/BigData/hadoop/data1/dn,/srv/BigData/hadoop/data2/dn"），那数据会存储在该列表上的所有目录中，通常是在不同的设备上。不存在的目录将被忽略。为保证磁盘IO负载均衡，建议提供几个路径且每个路径都对应一个单独的磁盘。  - 例如，原有的数据存储目录为"/srv/BigData/hadoop/data1"，"/srv/BigData/hadoop/data2"，如需将data1目录的数据迁移至新建的"/srv/BigData/hadoop/data3"目录，则将服务级别的此参数替换为现有的数据存储目录，如果有多个存储目录，用","隔开。则本示例中，为"/srv/BigData/hadoop/data2,/srv/BigData/hadoop/data3"。  - 请谨慎修改该项。如果配置不当，将造成服务不可用。当角色级别的该配置项修改后，所有实例级别的该配置项都将被修改。如果实例级别的配置项修改后，其他实例的该配置项的值保持不变。   | ${BIGDATA_DATA_HOME}/hadoop/data3/dn |
      
   
   
10. 单击"保存"。然后在"集群 \> 服务"界面启动集群中各个停止的服务。
11. 启动HDFS成功以后，在HDFS客户端执行以下命令，检查HDFS根目录下全部目录和文件是否复制正确。 
    ```
    hdfs fsck /
    ```
    检查fsck显示结果：
    - 显示如下信息，表示无文件丢失或损坏，数据复制成功，操作结束。
      ```
      The filesystem under path '/' is HEALTHY
      ```
      
    
    - 显示其他信息，表示有文件丢失或损坏，则检查[8.d]是否正确，并执行以下命令：
      ```
      hdfs fsck 损坏的文件名称 -delete
      ```
      
    
    
    
    
**更改DataNode单个实例的存储目录**
12. 选择"集群 \> 服务 \> HDFS \> 实例"，勾选需要修改存储目录的DataNode单个实例，选择"更多 \> 停止实例"。
    
    ![](https://support.huaweicloud.com/cmpntguide-mrs/zh-cn_image_0000001209210359.png)
    
    
13. 以**root** 用户登录到这个DataNode节点，执行如下操作。
    
    1. 创建目标目录。 例如目标目录为"${BIGDATA_DATA_HOME}/hadoop/data3/dn"，执行以下命令：
       ```
       mkdir -p ${BIGDATA_DATA_HOME}/hadoop/data3/dn
       ```
       
    
    2. 挂载目标目录到新磁盘。 例如挂载"${BIGDATA_DATA_HOME}/hadoop/data3"到新磁盘。
       
    
    3. 修改新目录的权限。 例如新目录路径为"${BIGDATA_DATA_HOME}/hadoop/data3/dn"，执行以下命令：
       ```
       chmod 700 ${BIGDATA_DATA_HOME}/hadoop/data3/dn -R
       ```
       ```
       chown omm:wheel ${BIGDATA_DATA_HOME}/hadoop/data3/dn -R
       ```
       
    
    4. 将数据复制到目标目录。 例如旧目录为"${BIGDATA_DATA_HOME}/hadoop/data1/dn"，目标目录为"${BIGDATA_DATA_HOME}/hadoop/data3/dn"，执行以下命令：
       ```
       cp -af ${BIGDATA_DATA_HOME}/hadoop/data1/dn/* ${BIGDATA_DATA_HOME}/hadoop/data3/dn
       ```
       
    
    
    
    
14. 在FusionInsight Manager管理界面，选择"集群 \> 服务 \> HDFS \> 实例"，单击指定的DataNode实例并切换到"实例配置"页签。 
    将配置项"dfs.datanode.data.dir"修改为新的目标目录，例如"${BIGDATA_DATA_HOME}/hadoop/data3/dn"。参数介绍请见[表1]。
    示例：原有的数据存储目录为"/srv/BigData/hadoop/data1,/srv/BigData/hadoop/data2"，此处如需将data1目录的数据迁移至新建的/srv/BigData/hadoop/data3目录，则将该参数修改为"/srv/BigData/hadoop/data2,/srv/BigData/hadoop/data3"。
    ![](https://support.huaweicloud.com/cmpntguide-mrs/zh-cn_image_0000001209412287.png)
    
    
15. 单击"保存"，单击"确定"。 
    界面提示"操作成功。"，单击"完成"。
    
    
16. 选择"更多 \> 重启实例"，重启DataNode实例。
 
