如何通过hdfs MapReduce直接计算hdfs上文件的磁链?

How can I directly calculate the magnetlink of a file on hdfs through hdfs MapReduce?

如何通过MapReduce直接计算hdfs上文件或目录的磁链?

在磁铁中计算的难点 link 是 info-hash。信息哈希是 info-dictionary of the .torrent file. It is a bencoded 结构的 SHA1 哈希,它包含文件名、文件大小、片段大小和(重要的)所有片段的 SHA-1 哈希列表。构建信息字典的复杂部分是计算片段哈希,所以让我们专注于此。

此外,对于多文件 torrent,所有文件负载在逻辑上都被连接起来,以计算和验证片段哈希值。在你的情况下,听起来你最感兴趣的是单个文件的种子文件,这让事情变得更简单了,所以我们只关注它。

我对 HDFS 不是特别熟悉,但是可以并行计算 SHA-1 片段哈希。您决定块的大小,从技术上讲,它可以是任何大小,但我认为很多客户都希望是 2 的幂(或者至少它可以被 16 kiB 整除)。因此,必须在可被片段大小整除的文件块上计算哈希值。例如如果将片段大小设置为 1 MiB,则必须对文件的第 1 兆字节、文件的第 2 兆字节等进行哈希处理。这一切都可以并行完成。

对于多文件种子,这会变得有点复杂,因为这些片段边界不再落在可被片段大小整除的文件偏移量处。如果 HDFS 不提供对文件的任意并行访问,那可能是个问题。

一旦你有了片段散列,将它们放入信息字典,运行 最后一个 SHA-1 通过它,你就有了信息散列。

如果你想支持 bittorrent v2,文件由 merkle 哈希树验证,在文件中使用 SHA-256 和 16 kiB 叶块。这还有一个好处,即每个文件都是独立散列的,因此您可以避免片段对齐问题。

简而言之,只要您可以并行读取和散列 2 的幂的块,您的 reduce-step 就是简单地构建信息字典,将块散列放在那里,然后再次进行 SHA-1 散列.