mapreduce—hadoop中的重复数据消除

9njqaruj  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(723)

我接收了大量包含重复项的设备数据。我还有一个单独的摄取元数据历史记录列表(用于唯一标识摄取的文件)。我希望使用历史记录对摄取的设备数据进行重复数据消除。这个历史文件不小,因此我不打算把它加载到内存中。我也曾考虑过reduce-side-join,但那会通过网络传递大量数据。
布鲁姆过滤器是我正在寻找的东西,以减少我的历史文件的大小。但它给了我相反的结果,也就是说,它可能会报告我有一个副本,而我没有。
重复数据消除似乎是一个相当普遍的问题,我想看看是否有其他人有可能的想法。

68de4m5k

68de4m5k1#

如果要使用map/reduce进行重复数据消除,并且要使用多台计算机执行此任务,则必须通过网络发送所有数据。hadoop就是这么做的!
当然,你也可以在一台机器上运行所有的东西,只需要更长的时间。在其核心,重复数据消除是hadoop自然做的事情之一,您可以免费获得大部分功能:hadoop在map步骤中散列所有“键”,并确保属于一个“键”的所有“值”最终都在同一个reducer上。
任务本身相当简单,实际上它与wordcount示例(最简单的map/reduce作业之一)几乎相同。只需跳过输出计数并只输出键(对值使用nullwritable)。我已经包括了下面的map和reduce函数。注意:如果您使用n台多台机器作为减速机,则需要将每个减速机产生的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:如果你想按照另一个答案的建议使用合路器,你可以很容易地做到。在通过网络发送数据之前运行组合器,可以将其视为本地减速机。就这么定了

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());
 }
pdkcd3nj

pdkcd3nj2#

不要忘记,如果您有大量的重复数据,组合器是减少网络通信量的最佳方法,这足以让集群中的单个主机已经有许多重复数据。

相关问题