我有一个大的jar包安装到我的hdfs集群,但是如果我以前安装过它我不想安装它两次,所以它需要一个方法来判断hdfs中的jar包是否是和我当地人一样。我想用校验和来解决这个问题。我的代码就像:
val fs = FileSystem.get(conf)
val lfs = FileSystem.getLocal(conf);
val localchecksum = lfs.getFileChecksum(src)
val hdfschecksum = fs.getFileChecksum(dst)
if(!localchecksum.equals(hdfschecksum)){
//upload the jar file
}
不幸的是,LocalFileSystem没有实现getFileChecksum,默认情况下返回null,因此我的代码不再起作用了。 那么,如何判断jar文件是否已经存在于hdfs集群中,欢迎使用任何方法。
答案 0 :(得分:0)
为什么不编写自己的md5校验和?从hdfs加载文件做校验和(你自己的版本),从本地加载文件,计算校验和并进行比较。
以下是执行此操作的代码,从另一个SOF问题复制
MessageDigest md = MessageDigest.getInstance("MD5");
try (InputStream is = Files.newInputStream(Paths.get("file.txt"))) {
DigestInputStream dis = new DigestInputStream(is, md);
/* Read stream to EOF as normal... */
}
byte[] digest = md.digest();
答案 1 :(得分:0)
HGFS校验和自己实现起来相对简单。以下是DFSClient.java:703的源代码。代码中的所有复杂性都与从不同数据节点中提取文件块并处理错误有关。在本地文件系统上计算,您只需要将文件切割成块,计算每个块的CRC,收集所有CRC并计算结果的MD5sum。只需确保使用与HDFS相同的块大小。