2

我想使用 Hadoop Mapreduce 实现文件的重复数据删除。我计划通过在我的映射器函数中计算输入目录中存在的所有文件的 MD5 总和来做到这一点。这些 MD5 散列将是减速器的关键,因此具有相同散列的文件将转到同一个减速器。

Hadoop 中映射器的默认设置是键是行号,值是文件的内容。

我还读到如果文件很大,那么它会被分成 64 MB 的块,这是 Hadoop 中的最大块大小。

如何将键值设置为文件的名称,以便在我的映射器中计算文件的哈希?另外如何确保没有两个节点会计算同一个文件的哈希?

4

1 回答 1

3

如果您需要将整个文件作为一个映射器的输入,那么您需要保留isSplitablefalse。在这种情况下,您可以将整个文件作为映射器的输入,并将您的 MD5 应用于该文件并将其作为密钥发出。

WholeFileInputFormat(不是 hadoop 代码的一部分)可以在这里使用。您可以在线获取实现,也可以在 Hadoop: The Definitive Guide book 中获得实现。

值可以是文件名。调用getInputSplit()Context 实例将为您提供可以转换为文件拆分的输入拆分。然后fileSplit.getPath().getName()会给你文件名。这将为您提供filename,它可以作为值发出。

我还没有研究过这个 - org.apache.hadoop.hdfs.util.MD5FileUtils,但是 javadocs 说这可能对你有用。

已包含 WholeFileInputFormat 和相关 RecordReader 的教科书 src 链接以供参考

1)WholeFileInputFormat

2) WholeFileRecordReader

还包括指向MD5FileUtils的 grepcode链接

于 2014-03-31T04:45:49.390 回答