我有大量含有重複項的攝入設備數據。我還有一個單獨的攝取元數據歷史列表(以唯一標識攝取的文件)。我正在尋找與歷史記錄重複數據消除我的設備數據。這個歷史文件不是很小,因此我沒有把它加載到內存中。我也考慮過減少邊連接,但這會通過網絡傳遞大量數據。Hadoop中的重複數據刪除
布盧姆過濾器是我正在尋找的東西,以減少我的歷史文件的大小。但它給了我的反面意見,即它可能會報告我沒有時有副本。
重複數據刪除似乎是一個相當普遍的問題,我期待着看看其他人是否有可能的想法。
我有大量含有重複項的攝入設備數據。我還有一個單獨的攝取元數據歷史列表(以唯一標識攝取的文件)。我正在尋找與歷史記錄重複數據消除我的設備數據。這個歷史文件不是很小,因此我沒有把它加載到內存中。我也考慮過減少邊連接,但這會通過網絡傳遞大量數據。Hadoop中的重複數據刪除
布盧姆過濾器是我正在尋找的東西,以減少我的歷史文件的大小。但它給了我的反面意見,即它可能會報告我沒有時有副本。
重複數據刪除似乎是一個相當普遍的問題,我期待着看看其他人是否有可能的想法。
如果你要使用的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());
}
不要忘記,一個Combiner是爲了減少網絡流量,如果你有很多很多重複的,足夠的最好方式,集羣中的一臺主機就已經有很多重複。