gpt4 book ai didi

java - Hadoop:识别映射器中输入拆分的结束

转载 作者:可可西里 更新时间:2023-11-01 15:27:50 25 4
gpt4 key购买 nike

我已经在 Hadoop 中编写了一些代码来完成以下任务:

在 Mapper 中: 从输入拆分中一条一条地读取记录,并对它们执行一些处理。然后,根据完成的工作结果,一些记录被修剪并保存在一个集合中。在映射器的末端,这个集合必须被发送到reducer。

在 Reducer 中:处理所有从所有 Mappers 接收到的集合并生成最终结果。

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

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

这是作业的流程图:

enter image description here

最佳答案

如果您查看 Mapper class ( Javadoc ) 你可以看到它有四种可用的方法:

  • 清理(org.apache.hadoop.mapreduce.Mapper.Context 上下文)
  • map(KEYIN 键,VALUEIN 值,org.apache.hadoop.mapreduce.Mapper.Context 上下文)
  • 运行(org.apache.hadoop.mapreduce.Mapper.Context 上下文)
  • 设置(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() 在所有键/值都已处理后输出一次值集。

关于java - Hadoop:识别映射器中输入拆分的结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41039376/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com