我想使用Hadoop Mapreduce实现文件的重复数据删除。我计划通过计算mapper函数中输入目录中存在的所有文件的MD5总和来实现。这些MD5哈希将是reducer的关键,因此具有相同哈希值的文件将转到同一个reducer。
Hadoop中映射器的默认值是键是行号,值是文件的内容。
另外我读到如果文件很大,那么它会被分成64 MB的块,这是Hadoop中的最大块大小。
如何将键值设置为文件的名称,以便在我的映射器中我可以计算文件的哈希值?另外,如何确保没有两个节点计算同一文件的哈希值?
答案 0 :(得分:3)
如果您需要将整个文件作为一个映射器的输入,那么您需要保持isSplitable
为false。在这种情况下,您可以将整个文件作为映射器的输入并在其上应用MD5并将其作为键发出。
WholeFileInputFormat
(不是hadoop代码的一部分)可以在这里使用。您可以在线获取实现,也可以在Hadoop:The Definitive Guide一书中找到它。
值可以是文件名。在Context实例上调用getInputSplit()
将为您提供输入拆分,可以将其转换为filesplits。然后fileSplit.getPath().getName()
将为您提供文件名。这会给你filename
,它可以作为值发出。
我没有做过这个 - org.apache.hadoop.hdfs.util.MD5FileUtils
,但是javadocs说这可能对你有用。
包含WholeFileInputFormat和相关RecordReader的教科书src链接以供参考
还包括grepcode link到MD5FileUtils