hadoop 上传文件时报 Checksum error

今天在用 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 种策略进行规避:

  1. 删除 .crc 文件

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