今天在用 hadoop 上传文件到 HDFS 时,报错:put: Checksum error: file:/home/magneto/fb_friend.csv at 0 exp: 1005486446 got: 441437096
。
经过 Google 发现是因为当前目录下存在一个名为:.fb_friend.csv.crc
的文件,将此文件删除后即可成功上传。
究其原因是因为 Hadoop 的 CRC 数据校验机制,Hadoop 系统为了保证数据的一致性,会对文件生成相应的校验文件,并在读写的时候进行校验,确保数据的准确性。
在上传的过程中,Hadoop 将通过 FSInputChecker 判断需要上传的文件是否存在进行校验的 crc 文件,即 .fb_friend.csv.crc
,如果存在 crc 文件,将会对其内容一致性进行校验,如果校验失败,则停止上传该文件。
在使用 hadoop fs -getmerge srcDir destFile
命令时,本地磁盘一定会生成相应的 .crc
文件。
所以如果需要修改 getmerge
获取的文件的内容,再次上传到 DFS 时,可以采取以下 2 种策略进行规避:
删除
.crc
文件将
getmerge
获取的文件修改后重新命名,如使用mv
操作,再次上传到 DFS 中。