如果您打算使用 Map/Reduce 进行重复数据删除,并且您希望使用多台机器来执行该任务,那么您必须通过网络发送所有数据。这就是 Hadoop 所做的!
当然你也可以在一台机器上运行所有东西,只是需要更长的时间。在它的核心,重复数据删除是 Hadoop 自然地做的事情之一,您可以免费获得大部分功能:Hadoop 在 Map 步骤中散列您的所有“键”,并确保属于“键”的所有“值”最终都在同一个减速机。
任务本身相当简单,实际上它与WordCount 示例(最简单的 Map/Reduce 作业之一)几乎相同。只需跳过输出计数并仅输出键(使用NullWritable 作为值)。我在下面包含了 map 和 reduce 函数。注意:如果您为 Reducer 使用 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:如果您想按照其他答案的建议使用组合器,您可以很容易地做到这一点。在通过网络发送数据之前运行组合器,您可以将其视为本地化简器。设置好了
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());
}