【问题标题】:Deciding key value pair for deduplication using hadoop mapreduce使用 hadoop mapreduce 确定重复数据删除的键值对
【发布时间】:2014-05-09 13:27:09
【问题描述】:

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

Hadoop中的mapper默认是key是行号,value是文件的内容。

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

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

【问题讨论】:

  • 您的文件有多大?我的意思是大小......它们是文本文件吗?
  • 它们是文本文件,可能在几 KB 到 100 MB 之间。
  • WholeFileInputFormat(不是hadoop代码的一部分)可以在这里使用。您可以在线获取实现,也可以在 Hadoop: The Definitive Guide book 中获得实现。这将使整个文件映射为值。对此值执行 MD5 并作为键发出。值可以是文件名。在 Context 实例上调用 getInputSplit() 将为您提供可以转换为文件拆分的输入拆分。然后 fileSplit.getPath().getName() 将为您生成文件名。这将为您提供文件名,该文件名可以作为值发出。
  • @Arun A K,写下同样的东西作为答案,这样对其他人也有帮助。
  • @Jay K,感谢您的建议。我只是不使用“答案”部分,因为这可能只是完成要求的一种粗略方式。我认为会有更好的人可以发布更好的解决方案。

标签: hadoop mapreduce deduplication


【解决方案1】:

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

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

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

我还没有解决这个问题 - org.apache.hadoop.hdfs.util.MD5FileUtils,但 javadocs 说这可能对你有用。

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

1) WholeFileInputFormat

2) WholeFileRecordReader

还包括 grepcode link 到 MD5FileUtils

【讨论】:

    猜你喜欢
    • 2013-07-18
    • 2011-07-28
    • 1970-01-01
    • 2017-01-13
    • 2019-04-09
    • 2011-04-07
    • 2015-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多