2013-07-18 97 views
3

我有大量含有重複項的攝入設備數據。我還有一個單獨的攝取元數據歷史列表(以唯一標識攝取的文件)。我正在尋找與歷史記錄重複數據消除我的設備數據。這個歷史文件不是很小,因此我沒有把它加載到內存中。我也考慮過減少邊連接,但這會通過網絡傳遞大量數據。Hadoop中的重複數據刪除

布盧姆過濾器是我正在尋找的東西,以減少我的歷史文件的大小。但它給了我的反面意見,即它可能會報告我沒有時有副本。

重複數據刪除似乎是一個相當普遍的問題,我期待着看看其他人是否有可能的想法。

回答

4

如果你要使用的Map/Reduce的重複數據刪除和要使用多臺機器的任務,你必須所有的數據通過網絡發送。這就是Hadoop所做的!

當然,你也可以在一臺機器上運行所有的東西,它只需要更長的時間。在覈心上,重複數據刪除是Hadoop自然而然地實現的功能之一,您可以免費獲得大部分功能:Hadoop在映射步驟中散列所有「鍵」,並確保屬於「鍵」的所有「值」最終結束相同的減速機。

該任務本身相當簡單,實際上它與WordCount示例(最簡單的Map/Reduce作業之一)幾乎相同。只需跳過輸出計數並僅輸出密鑰(使用NullWritable作爲該值)。我已經在下面包含了地圖和縮小功能。注意:如果您爲Reducers使用N臺多臺機器,則需要連接每臺Reducer生成的N個輸出文件以獲取單個文件。下面是代碼:

public void map(LongWritable key, Text value, Context context) 
    throws IOException, InterruptedException { 
    String line = value.toString(); //process your data here 
    context.write(line, NullWritable.get()); 
} 


public void reduce(Text key, Iterable<IntWritable> values, Context context) 
    throws IOException, InterruptedException { 
    context.write(key, NullWritable.get()); 
} 

編輯1:如果你想使用一個組合被對方回答的建議,你可以這樣做很容易。在數據通過網絡發送之前運行Combiner,您可以將其視爲本地Reducer。剛剛設置

job.setCombinerClass(Reduce.class); 

其中Reduce是包含reduce()方法的類。


編輯2:由於每一個建議,我收到:該value.toString()是多餘的,沒有必要,如果你只有字符串處理,並不需要做任何處理的。然後,您可以簡化Mapper位:

public void map(LongWritable key, Text value, Context context) 
    throws IOException, InterruptedException { 
    context.write(value, NullWritable.get()); 
} 
1

不要忘記,一個Combiner是爲了減少網絡流量,如果你有很多很多重複的,足夠的最好方式,集羣中的一臺主機就已經有很多重複。