Hadoop中的重复数据删除

时间:2013-07-18 22:27:38

标签: hadoop mapreduce bloom-filter

我有大量包含重复的摄取设备数据。我还有一个单独的摄取元数据历史列表(以唯一标识摄取的文件)。我希望用历史记录对我的摄取设备数据进行重复数据删除。这个历史文件不小,因此我不打算将其加载到内存中。我也考虑过Reduce side join,但这会通过网络传递大量数据。

Bloom Filter是我正在寻找的减少历史文件大小的东西。但它给了我相反的意思,即,当我不这样做时,它可能会报告我有重复。

重复数据删除似乎是一个相当普遍的问题,我希望看看是否有其他人有可能的想法。

2 个答案:

答案 0 :(得分:4)

如果您要使用Map / Reduce进行重复数据删除,并且希望使用多台计算机来完成任务,则 可以通过网络发送所有数据。这就是Hadoop的作用!

当然你也可以在一台机器上运行所有东西,只需要更长的时间。在它的核心,重复数据删除是Hadoop自然而然做到的事情之一,您可以免费获得大部分功能:Hadoop在Map步骤中散列所有“键”,并确保属于“键”的所有“值”最终都在相同的减速机。

任务本身相当简单,实际上它与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,您可以非常轻松地完成。在通过网络发送数据之前运行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}}

答案 1 :(得分:1)

不要忘记,如果您有大量重复项,Combiner是减少网络流量的最佳方法,那么群集中的单个主机已经有很多重复项。