【问题标题】:Run a few lines after map & reduce在 map & reduce 之后运行几行
【发布时间】:2016-06-13 12:02:14
【问题描述】:

我有一个 MapReduce 程序(在 Java 中),它查找文档中的字数并将输出存储为:

word1 10
word2 20
...

我想知道如何在最终输出的末尾添加几行(类似于 try 和 catch 的 finally 块),即我想在最终输出中添加几个单词及其分数.

所以我的问题是,有没有办法添加一段在 reducer 执行后运行的代码,以便我可以在整个 Map & Reduce 完成后做一些事情?

【问题讨论】:

  • 你的 reducer 总是可以根据需要输出额外的行,我不确定是否有一种通用的方式可以说“完成后,对刚刚编写的文件做一些其他的事情”
  • @cricket_007 你能给我举个例子吗?我没有在任何地方看到过,但我想在我的应用程序中这样做。
  • 什么例子? context.write 应该已经存在于你的 reducer 中。我说我不确定是否有办法
  • 如果你只有一个reducer,你可以尝试追加到上下文中。 wordCount 有很多 reducer,所以我认为您必须在驱动程序端执行此操作。
  • 或者,让您的整个工作流程保持原样,然后创建一个辅助 mapreduce 读取该输出并进行聚合计算(假设这是您要查找的内容),然后写入其自己的文件(因为否则你会得到一个输出目录已经存在的错误)

标签: hadoop mapreduce


【解决方案1】:

一个 Reducer: 如果您有一个 reducer,那么您可以使用清理中的上下文对象来为每个单词编写排名/分数。但要做到这一点,您需要拥有已经写入输出文件的数据(字数)。我建议你在 reduce 函数中添加一个 Map 或其他一些对象来存储字数。使用该 Map 对象进行清理以查找排名/分数并通过上下文对象写入结果。

Multiple Reducer :如果你有多个 reducer,那么你只需要在 main/run 方法中做同样的事情。但在这种情况下,您必须读取输出文件数据,然后在附加到文件之前进行计算。我建议您使用组合器并使用上述建议的减速器来计算排名/分数。

【讨论】:

  • 好,试试这个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多