1.增加DataNode数据目录进行扩容

HDFS在使用过程中,随着使用时间的不断增长,存储的数据越来越多,可能会出现磁盘容量不够的情况,这时候可以进行扩容,增加DataNode的数据目录。笔者使用的是CDH环境,所以直接通过CLOUDERA MANAGER进行配置:
我要增加的目录为:/home/data/,所以首先第一步,在这个目录下新建 /home/data/dfs/dn 目录。
mkdir -p /home/data/dfs/dn
然后修改dn目录的权限:
chown -R hdfs:hadoop /home/data/dfs/dn
针对每个DataNode,重复上面的1、2步。完成后打开cloudera manager 管理页面,选择HDFS:
image.png
选择具体的DataNode实例,进入详情页,选择 “配置”,在 “DataNode” 选项中,选择 “DataNode Data Directory”,点击右侧加号,增加目录:
image.png
进入 “高级”(advanced) 选项,第一个“ DataNode Volume Choosing Policy ” 卷选择策略,选择 “available space可用空间” 。然后保存修改,重启该DataNode。
image.png

2.重启UUID不一致问题

在上面增加目录之后,重启的过程中报错:

  1. Failed to add storage directory [DISK]file:/home/data/dfs/dn/
  2. org.apache.hadoop.hdfs.server.common.InconsistentFSStateException:
  3. Directory /home/data/dfs/dn is in an inconsistent state:
  4. Root /home/data/dfs/dn: DatanodeUuid=22fec7f1-3b7f-45e2-8e14-76ad61510d68,
  5. does not match 7595807e-7c97-4f04-a01d-670cfdbd49b6 from other StorageDirectory.
  6. at org.apache.hadoop.hdfs.server.datanode.DataStorage.setFieldsFromProperties(DataStorage.java:702)
  7. at org.apache.hadoop.hdfs.server.datanode.DataStorage.setFieldsFromProperties(DataStorage.java:657)
  8. at org.apache.hadoop.hdfs.server.common.StorageInfo.readProperties(StorageInfo.java:232)
  9. at org.apache.hadoop.hdfs.server.datanode.DataStorage.doTransition(DataStorage.java:759)
  10. at org.apache.hadoop.hdfs.server.datanode.DataStorage.loadStorageDirectory(DataStorage.java:302)
  11. at org.apache.hadoop.hdfs.server.datanode.DataStorage.loadDataStorage(DataStorage.java:418)
  12. at org.apache.hadoop.hdfs.server.datanode.DataStorage.addStorageLocations(DataStorage.java:397)
  13. at org.apache.hadoop.hdfs.server.datanode.DataStorage.recoverTransitionRead(DataStorage.java:575)
  14. at org.apache.hadoop.hdfs.server.datanode.DataNode.initStorage(DataNode.java:1560)
  15. at org.apache.hadoop.hdfs.server.datanode.DataNode.initBlockPool(DataNode.java:1520)

3.问题分析及解决方法

查看对应的两个文件:
原生目录:/dfs/dn/current/VERSION
新增目录:/home/data/dfs/dn/current/VERSION
新增目录下的这个文件应该是第一次重启的过程中自动生成的
/dfs/dn/current/VERSION文件内容大致如下:

  1. #Thu Jun 16 17:12:18 CST 2022
  2. storageID=DS-cce84ae5-b79d-4467-ba29-e3469d701512
  3. clusterID=CID-7f9a222f-7655-4f5e-83b6-cb7c5003a267
  4. cTime=0
  5. datanodeUuid=7595807e-7c97-4f04-a01d-670cfdbd49b6
  6. storageType=DATA_NODE
  7. layoutVersion=-57

/home/data/dfs/dn/current/VERSION文件内容大致如下:

  1. #Thu Jun 16 17:33:17 CST 2022
  2. storageID=DS-9ac0227c-f48b-49f0-bfe6-ed561510fe46
  3. clusterID=CID-7f9a222f-7655-4f5e-83b6-cb7c5003a267
  4. cTime=0
  5. datanodeUuid=22fec7f1-3b7f-45e2-8e14-76ad61510d68
  6. storageType=DATA_NODE
  7. layoutVersion=-57

其中,有一个datanodeUuid,发现两个文件的datanodeUuid不一致,所以会报此错误,将原生目录下该文件的UUID复制到新增目录下文件对应的UUID,重启成功。注意不要整个文件复制,其他地方比如storageID这些是不一样的,不要修改。