Java Hadoop:在mapper中识别输入端拆分

Java Hadoop:在mapper中识别输入端拆分,java,hadoop,mapreduce,Java,Hadoop,Mapreduce,我已经用Hadoop编写了一些代码,这些代码应该完成以下任务: 在映射器中:从输入拆分中逐个读取记录,并对其执行一些处理。然后,根据所做工作的结果,对一些记录进行修剪,并保存在集中。在映射器的端,必须将此集合发送到reducer 在Reducer中:处理从所有映射器接收的所有集,并生成最终结果 我的问题是:我如何延迟将所述集合发送到Reducer,直到处理每个映射器中的最后一条记录。默认情况下,在Mapper中编写的所有代码都将作为输入记录数运行(如果错误,则更正);因此,集合被多次发送到red

我已经用Hadoop编写了一些代码,这些代码应该完成以下任务:

在映射器中:从输入拆分中逐个读取记录,并对其执行一些处理。然后,根据所做工作的结果,对一些记录进行修剪,并保存在集中。在映射器的,必须将此集合发送到reducer

在Reducer中:处理从所有映射器接收的所有集,并生成最终结果

我的问题是:我如何延迟将所述集合发送到Reducer,直到处理每个映射器中的最后一条记录。默认情况下,在Mapper中编写的所有代码都将作为输入记录数运行(如果错误,则更正);因此,集合被多次发送到reducer(作为输入记录的数量)如何识别每个映射器中输入拆分的处理结束?

(现在我使用带有计数器的if条件来计算已处理记录的数量,但我认为一定有更好的方法。此外,如果我不知道文件中记录的总数,此方法不起作用)

这是作业的流程图:

如果您查看()可以看到它有四种可用方法:

  • cleanup(org.apache.hadoop.mapreduce.Mapper.Context)
  • map(KEYIN-key,VALUEIN-value,org.apache.hadoop.mapreduce.Mapper.Context)
  • run(org.apache.hadoop.mapreduce.Mapper.Context)
  • setup(org.apache.hadoop.mapreduce.Mapper.Context)
run()
的默认实现如下所示:

public void run(Context context) throws IOException, InterruptedException {
    setup(context);
    try {
        while (context.nextKeyValue()) {
            map(context.getCurrentKey(), context.getCurrentValue(), context);
        }
    } finally {
        cleanup(context);
    }
}
这说明了调用每个方法的顺序/时间。通常,您将重写
map()
方法。可以使用
setup()
cleanup()
在映射程序运行的开始/结束时执行一些工作

代码显示,对于进入映射器的每个键/值对,将调用一次
map()
方法
setup()
cleanup()
将在正在处理的键/值的开始和结束时分别调用一次


在您的情况下,可以使用
cleanup()。我测试了它,它工作了!我没有关于cleanup()方法的任何信息。写下细节作为答案(如果你愿意)@二元的