2014-03-30 52 views
2

我想使用Hadoop Mapreduce实现文件的重复数据删除。我打算通过计算我的映射函数中输入目录中存在的所有文件的MD5总和来完成此操作。这些MD5哈希将成为reducer的关键,因此具有相同哈希的文件将转到同一个reducer。使用hadoop mapreduce确定重复数据删除的键值对

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

另外我读到,如果文件很大,那么它将被拆分为64 MB的块,这是Hadoop中的最大块大小。

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

+1

有多大你的文件?我的意思是大小......他们是文本文件吗? –

+0

它们是文本文件,可能在几KB到几百MB之间。 – ManTor

+1

WholeFileInputFormat(不是hadoop代码的一部分)可以在这里使用。您可以在线获取实施或在Hadoop:权威指南手册中获得实施。这将使整个文件映射为值。对这个值做MD5并作为关键字发出。 值可以是文件名。在Context实例上调用getInputSplit()会为您提供可以作为文件分割转换的输入分割。然后fileSplit.getPath()。getName()会产生你的文件名。这会给你文件名,可以作为值发出。 –

回答

3

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

WholeFileInputFormat(不是hadoop代码的一部分)可以在这里使用。您可以在线获取实施或在Hadoop:权威指南手册中获得实施。

值可以是文件名。在Context实例上调用getInputSplit()会给你输入分割,可以将它们转换为文件分割。然后fileSplit.getPath().getName()会产生你的文件名。这会给你filename,它可以作为价值发射。

我还没有在这个 - org.apache.hadoop.hdfs.util.MD5FileUtils,但javadocs说,这可能是什么对你有好处。

教材SRC链接WholeFileInputFormat和相关RecordReader已列入参考

1)WholeFileInputFormat

2)WholeFileRecordReader

还包括grepcode link到MD5FileUtils