HDFS文件因Hadoop版本原因导致append操作失败的问题

发布时间 2023-05-24 21:42:17作者: 辰南以北

问题重现: 2023.05.24练习B站尚硅谷Hadoop3里的HDFS的Shell操作(append)
[atguigu@hadoop102 hadoop-3.3.4]$ hadoop fs -appendToFile liubei.txt /sa

点击查看代码
[atguigu@hadoop102 hadoop-3.3.4]$ hadoop fs -appendToFile liubei.txt /sa
2023-05-24 20:30:37,303 WARN hdfs.DataStreamer: DataStreamer Exception
java.io.IOException: Failed to replace a bad datanode on the existing pie to try. (Nodes: current=[DatanodeInfoWithStorage[192.168.10.102:9866,Dinal=[DatanodeInfoWithStorage[192.168.10.102:9866,DS-29fd6973-aa05-439e-ode replacement policy is DEFAULT, and a client may configure this via 'policy' in its configuration.
	at org.apache.hadoop.hdfs.DataStreamer.findNewDatanode(DataStrea
	at org.apache.hadoop.hdfs.DataStreamer.addDatanode2ExistingPipel
	at org.apache.hadoop.hdfs.DataStreamer.handleDatanodeReplacement
	at org.apache.hadoop.hdfs.DataStreamer.setupPipelineInternal(Dat
	at org.apache.hadoop.hdfs.DataStreamer.setupPipelineForAppendOrR
	at org.apache.hadoop.hdfs.DataStreamer.run(DataStreamer.java:717
appendToFile: Failed to replace a bad datanode on the existing pipeline y. (Nodes: current=[DatanodeInfoWithStorage[192.168.10.102:9866,DS-29fd6atanodeInfoWithStorage[192.168.10.102:9866,DS-29fd6973-aa05-439e-ba74-8elacement policy is DEFAULT, and a client may configure this via 'dfs.cli in its configuration.
Claude回答如下:

这个错误表示在执行HDFS的文件复制操作时发生了错误。具体原因是:

  1. 要复制的文件/wcinput/word.txt不存在1个以上的数据节点可以复制。
  2. 当前HDFS集群中有0个可用的数据节点,且0个节点被排除在此次操作之外。
    导致这个错误的最常见原因是:
  3. 文件word.txt仅存在于一个数据节点上,其它数据节点不具有该文件块的副本,所以无法达到最小副本数minReplication。
  4. HDFS集群的部分或全部数据节点处于不可用状态,所以无法找到足够的节点来完成文件复制操作。
    要解决这个问题,可以从以下几个方面着手:
  5. 检查文件/wcinput/word.txt的副本数是否达到HDFS的默认最小副本数3,如果没有可以手动完成文件复制以达到3个副本。
    hdfs fsck /wcinput/word.txt -files -blocks #检查副本数
    hdfs fs -cp /wcinput/word.txt /wcinput/word.txt #手动复制文件
    2. 检查HDFS集群的数据节点状态,重启处于不可用状态的节点。
  6. 如果有数据节点发生故障,等待其恢复或替换后重新复制文件。
  7. 如有必要,可以临时调整HDFS的最小副本数配置,但需要尽快恢复默认配置。
    hdfs getConf -namenode srv1.example.com -confKey dfs.namenode.replication.min #获取最小副本数
    hdfs setConf -namenode srv1.example.com -confKey dfs.namenode.replication.min -value 2 #临时设置为2

重启服务后 myhadoop.sh stop myhadoop.sh start
报错如下:
[atguigu@hadoop102 hadoop-3.3.4]$ hadoop fs -appendToFile liubei.txt /sa appendToFile: Failed to APPEND_FILE /sanguo/shuguo.txt for DFSClient_NONuse lease recovery is in progress. Try again later.
Claude:
使用-ignoreCrc参数跳过CRC校验。有时CRC校验也会触发短暂的租约恢复过程。
shell
hadoop fs -appendToFile -ignoreCrc liubei.txt /sanguo/shuguo.txt
继续报第一个错误信息,发现DataNode三个挂了俩,本质是hadoop的升级功能需要data-node在它的版本文件里存储一个永久性的clusterID,当datanode启动时会检查并匹配namenode的版本文件里的clusterID,如果两者不匹配,就会出现"Incompatible clusterIDs"的异常.
image<查看DataNode状态>

找到参看博客如下:
DataNode 启动失败报错 Incompatible clusterIDs
1.查看DataNode 目录 /opt/module/hadoop-3.3.1/data/dfs/data/current下的 VERSION 文件中的 clusterID
2.查看 NamaNode 目录 /opt/module/hadoop-3.3.1/data/dfs/name/current 下的 VERSION 文件中的 clusterID.
将启动失败的 DataNode 的 ClusterID 值 修改为 NameNode 的 ClusterID.