Hadoop put file 错误:fs.FSInputChecker: Found checksum error

Hadoop put file 错误:fs.FSInputChecker: Found checksum error

参考网址:

https://www.cnblogs.com/gpcuster/archive/2011/01/26/1945363.html

错误原因:

启动任务的命令中包含一个参数“-files tb_steps_url_path_dim.txt”

Hadoop客户端需要将机器本地磁盘中的tb_steps_url_path_dim.txt文件上传到DFS中。

在上传的过程中,Hadoop将通过FSInputChecker判断需要上传的文件是否存在进行校验的crc文件,即.tb_steps_url_path_dim.txt.crc,如果存在crc文件,将会对其内容一致性进行校验,如果校验 失败,则停止上传该文件。最终导致整个MR任务无法执行。

crc文件来源

DFS命令

:hadoop fs -getmerge srcDir destFile

这类命令在执行的时候,会将srcDir目录下的所有文件合并成一个文件,保存在destFile中,同时会在本地磁盘生成一个. destFile.crc的校验文件。

DFS命令

:hadoop fs -get -crc src dest

这类命令在执行的时候,会将src文件,保存在dest中,同时会在本地磁盘生成一个. dest.crc的校验文件。

如何避免

在使用hadoop fs -getmerge srcDir destFile命令时,本地磁盘一定会(没有参数可以关闭)生成相应的.crc文件。

所以如果需要修改getmerge获取的文件的内容,再次上传到DFS时,可以采取以下2种策略进行规避:

  1. 删除.crc文件

  2. 将getmerge获取的文件修改后重新命名,如使用mv操作,再次上传到DFS中。

我的解决方式

1.先在linux rm -rf .xxx.crc(别忘记有个点)
2.顺利上传

//先验证有没有crc再进行上传操作
      if(fs.exists(path_FromLocalSourseCRC)){
    	  System.out.println("CRC文件已经存在!,开始删除!");
    	  fs.delete(path_FromLocalSourseCRC, true);
    	  System.out.println("删除成功!");
      }
      System.out.println("开始上传文件:源地址:"+uriFromLocalSourse+"目标地址:"+uriFromLocalTarget);
      
      fs.copyFromLocalFile(false,true,path_FromLocalSourse, path_FromLocalTarget);
      System.out.println("上传成功!");
发布了6 篇原创文章 · 获赞 0 · 访问量 31

猜你喜欢

转载自blog.csdn.net/weixin_41487978/article/details/105205338