2014-03-30 57 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