如何判断一个大文件是否已经在我的hdfs集群中?

kqhtkvqz  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(413)

我有一个大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集群中,任何方法都是受欢迎的。

ifsvaxew

ifsvaxew1#

为什么不自己写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();

java中的md5校验和

cdmah0mi

cdmah0mi2#

hgfs校验和是相对简单的实现自己。这是它的源代码。java:703. 代码中的所有复杂性都与从不同的数据节点提取文件块和处理错误有关。在本地文件系统上计算您只需将文件切块,计算每个块的crc,将所有crc收集在一起,并计算结果的md5sum。只需确保使用与hdfs相同的块大小。

相关问题