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种策略进行规避:
-
删除.crc文件
扫描二维码关注公众号,回复: 10382519 查看本文章 -
将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("上传成功!");