我们是否需要在通过Webhdfs从Linux服务器将文件移动到Hadoop(HDFS)后验证校验和?
我想确保HDFS上的文件在复制后没有损坏。但是检查校验和是否必要?
我读取客户端在将数据写入HDFS之前执行校验和
有人可以帮我理解如何确保Linux系统上的源文件与使用webhdfs的Hdfs上的摄取文件相同。
答案 0 :(得分:8)
如果您的目标是比较驻留在HDFS上的两个文件,我不会使用“hdfs dfs -checksum URI”,因为在我的情况下,它会为内容相同的文件生成不同的校验和。
在下面的示例中,我将比较两个位于不同位置的相同内容的文件:
Old-school md5sum方法返回相同的校验和:
$ hdfs dfs -cat /project1/file.txt | md5sum
b9fdea463b1ce46fabc2958fc5f7644a -
$ hdfs dfs -cat /project2/file.txt | md5sum
b9fdea463b1ce46fabc2958fc5f7644a -
但是,对于具有相同内容的文件,HDFS上生成的校验和不同:
$ hdfs dfs -checksum /project1/file.txt
0000020000000000000000003e50be59553b2ddaf401c575f8df6914
$ hdfs dfs -checksum /project2/file.txt
0000020000000000000000001952d653ccba138f0c4cd4209fbf8e2e
有点令人费解,因为我希望针对相同的内容生成相同的校验和。
答案 1 :(得分:7)
可以使用hadoop fs命令计算文件的校验和。
用法:hadoop fs -checksum URI
返回文件的校验和信息。
示例:
hadoop fs -checksum hdfs://nn1.example.com/file1 hadoop fs -checksum file:/// path / in / linux / file1
请参阅:Hadoop documentation了解更多详情
因此,如果你想在linux和hdfs中使用comapre file1,你可以使用上面的实用程序。
答案 2 :(得分:5)
我写了一个库,你可以用它来计算本地文件的校验和,就像hadoop在hdfs文件上做的那样。
因此,您可以将校验和与交叉检查进行比较。 https://github.com/srch07/HDFSChecksumForLocalfile
答案 3 :(得分:1)
如果您通过API进行此检查
import org.apache.hadoop.fs._
import org.apache.hadoop.io._
选项1:对于值b9fdea463b1ce46fabc2958fc5f7644a
val md5:String = MD5Hash.digest(FileSystem.get(hadoopConfiguration).open(new Path("/project1/file.txt"))).toString
选项2:对于值3e50be59553b2ddaf401c575f8df6914
val md5:String = FileSystem.get(hadoopConfiguration).getFileChecksum(new Path("/project1/file.txt"))).toString.split(":")(0)
答案 4 :(得分:0)
它确实crc检查。对于每个文件,它创建.crc以确保没有损坏。