【问题标题】:Write Reducer output of a Mapreduce job to a single File将 Mapreduce 作业的 Reducer 输出写入单个文件
【发布时间】:2013-07-11 06:03:25
【问题描述】:

我已经为 HBase 中的数据编写了一个 map-reduce 作业。它包含多个映射器和一个减速器。 Reducer 方法接收映射器提供的数据并对其进行一些分析。在 HBase 中的所有数据处理完成后,我想通过单个 Reducer 将数据写回 HDFS 中的文件。目前我每次获得新数据时都能将数据写入HDFS,但最终无法弄清楚如何将最终结论写入HDFS。

【问题讨论】:

  • 是否要将 HBase Table 数据导出到 HDFS 文件?
  • 我正在使用 Map-Reduce 作业并行读取数据。但我使用单个 reducer 进行分析,最后将其写回 HDFS。其中可能包含关于 HBASE 数据而不是元组的一些结论。
  • 检查一下,如果有帮助,我已经发布了答案。
  • 我不需要 HDFS 上的 Hbase 数据。我想对Reducer方法中的数据进行分析,所有结果的结论需要在最后一次处理后写入HDFS。
  • 所以,当你做一个job.setNumReduceTasks(1);它不是对你有用吗?这将强制使用单个减速器。

标签: hadoop mapreduce hbase


【解决方案1】:

因此,如果您尝试将单个 reducer 的最终结果写入 HDFS,您可以尝试以下任何一种方法 -

  1. 使用 Hadoop API FileSystem 的 create() 函数从 reducer 写入 HDFS。
  2. 最终计算后从 reducer 发出单个键和值
  3. 覆盖 Reducers cleanup() 函数并在此处执行第 (1) 点。

关于 3 的详细信息:

http://hadoop.apache.org/docs/current/api/org/apache/hadoop/mapreduce/Reducer.html#cleanup-org.apache.hadoop.mapreduce.Reducer.Context-

希望这会有所帮助。

【讨论】:

  • 我有同样的问题,但我必须做第二个选项。问题是我怎么知道所有任务是否已经完成?我试图查看 Hadoop API,但找不到任何方法。你能指导我吗?我正在考虑覆盖输出文件,这是可行的解决方案吗?
  • @Marco167:您使用的是单个减速器吗?然后,您可能可以遍历这些值,计算所有内容并最终使用 context.write() 仅写入一次 HDFS。
  • 谢谢,我也是这样做的。但是由于变量是静态的,当所有任务完成时我无法得到,所以我可以用 context.write() 编写最终解决方案(在静态 HashMap 中传播)?我的意思是,是否有任何方法表明现在没有输入要处理,所以打印最终结果?
  • 我想我无法解释我的问题。我很抱歉!实际上我怎么知道是否达到了最终计算?我的意思是说现在所有的数据都传递给了reducer。喜欢 ReducerTaskCompleted()?
  • 是的,那太好了,那么我之前告诉你的一切都应该有效。你的 reducer 有一个本地的 HashMap,你可以在迭代你在 reduce 函数中收到的可迭代对象时更新它。然后,当您完成迭代时,您只会发出一次。伪代码:reduce(Key key, Iterable<T> values) { HashMap map = new HashMap(); for(T value: values ) { //update map.put() }; context.write(); }
猜你喜欢
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多