【发布时间】: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