Linux下Hadoop HDFS中追加文件内容使用appendToFile(Shell)或fs.append()(Java),遇到的几种报错情况,分别给出自己使用并成功的解决方案:

  1. Shell中报错:appendToFile: Not supported
    这种情况在网上几乎搜不到,直到换了伪分布式配置才不报这个错,之前是单点式配置状态。所以怀疑是单点式配置不能使用appendToFile操作。换成伪分布式只需要修改几个配置文件,具体教程可自行搜索;
  2. (1)java.io.IOException Failed to replace a bad datanode on the existing pipeline due to no more good datanodes being available to try
    (2)org.apache.hadoop.ipc.RemoteException: Failed to APPEND_FILE /data/log for DESClient_NONMAPPERDUCE_1129064282_1 on 10.43.42.24 bacause this file lease is currently owned by Client_NONMAPPERDUCE_1129064282_1 on 10.43.42.24
    (3)org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.hdfs.protocol.RecoveryInProgressException): Failed to APPEND_FILE /surveillance/2018-01-02/host21-host.log for DFSClient_NONMAPREDUCE_-1806248259_128 on 192.168.1.121 because lease recovery is in progress. Try again later. at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.recoverLeaseInternal(FSNamesystem.java:3145)
    以上典型报错是从其他人的问题复制过来了,因为我自己的报错没有及时保存,只记住了几个关键词。Shell或者Java IDE中出现上面之一的报错,网上有相关的解决方案,就是在Java程序中增加下面两行(如果使用Shell就是修改配置文件内容):
    //Configuration conf = new Configuration();
    conf.set("dfs.client.block.write.replace-datanode-on-failure.policy", "NEVER");
    conf.setBoolean("dfs.client.block.write.replace-datanode-on-failure.enabled", true);
    
    接下来是关键了,很可能会发现即使修改了,运行之后,还会出现上面出现过的报错,解决方案就是:不要再用之前使用追加文件内容命令的源文件和目的文件了!如果仅仅测试,可以另建测试文件,重新上传,然后尝试追加;如果之前的文件还要用,那就复制到新文件里去,再追加。总之,修改程序和配置文件后,appendToFile和fs.append()的对象不能是你之前让程序报错的那俩文件。如果还不行就重启下Hadoop或系统即可。

参考:Hadoop爬坑记——HDFS文件因Hadoop版本原因导致的追加问题
https://community.cloudera.com/t5/Support-Questions/Failed-to-replace-a-bad-datanode-on-the-existing-pipeline/td-p/207711(这个需要那啥才能看,不过有完整的解决方法)

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐