【问题标题】:More than One Reducer and One Output File不止一个reducer和一个输出文件
【发布时间】:2014-03-10 16:46:16
【问题描述】:

在我的 hadoop 代码中,我有 4 个 reducer,我总是有 4 个输出文件,这很正常,因为每个 reducer 将其结果放在一个文件中。 我的问题是:我怎样才能只有一个输出文件?

问题是我有一个迭代的 mapreduce 作业,它接受一个输入文件,将它分成块并将每个块分配给一个映射器,所以这就是为什么我必须收集所有 reducer 结果并将它们放在一个输出文件中为了以等价的方式将此输出文件分成 4 个部分,然后将每个部分分配给一个映射器,依此类推。

【问题讨论】:

  • 我可能错了,但我认为你不能那样做。为什么不只有一个减速器?
  • 拥有一个reducer 对我的应用程序不利,因为我想从集群和资源(映射器和reducer)中受益!所以这是不可能的吗?我已经搜索了很长时间,但是如果没有聚合所有输出文件的工作,我不知道如何解决它!
  • 也许有一种方法可以从您的源代码中调用hadoop dfs -getmerge,将输出作为一个文件在本地获取,然后hadoop dfs -copyFromLocal 将其放回集群?另一种解决方案可能是在第一次迭代后跳过分成块
  • 感谢您的提议,但为什么是本地?据我所知,dfs 对集群中的所有机器进行全局处理,对吗?你的第二个命题呢:跳过分割成块是什么意思?如果我不这样做,那么我可以通过多个映射器处理数据吗?谢谢
  • 我已经回答了一个类似的问题。可能你想检查一下http://stackoverflow.com/questions/5700068/merge-output-files-after-reduce-phase/33360716#33360716

标签: hadoop mapreduce


【解决方案1】:

你可以试试MultipleOutputs,在那里你可以指定每个reducer应该写入的输出文件。 例如在您的减速器代码中:

   ...
   public void setup(Context context) {
       out = new MultipleOutputs<YourKey,YourValue>(context);     
     }
    public void reduce(YourKey key, Iterable<YourValue> values, Context context)
            throws IOException, InterruptedException {
             .......
        //instead of writing using context, use multipleoutput here
        //context.write(key, your-result);
        out.write(key, your-result,"path/filename");
    }
    public void cleanup(Context context) throws IOException,InterruptedException {
        out.close();        
     }
    .....

对于这种情况,您还需要确保一些作业配置。

......
job.setOutputFormatClass(NullOutputFormat.class);
LazyOutputFormat.setOutputFormatClass(job, FileOutputFormat.class);
FileOutputFormat.setOutputPath(job, new Path("output"));
......

在这种情况下,每个reducer 输出将被写入output/path/filename

【讨论】:

  • 感谢这个想法,但是如何通过多个减速器同时附加文件文件名呢?它会引起问题吗?因为我猜这是一个同步问题,不是吗?
【解决方案2】:

你可以很好的配置你想要的reducer数量。 在定义你的工作时使用这个

job.setNumReduceTasks(1)

【讨论】:

  • 再次阅读问题。他想要不止一个减速器
  • 事实上,我需要不止一个reducer,但只需要一个生成的输出文件!!!你知道怎么做吗?
  • 哎呀!我的道歉。我不知道有什么办法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-07
  • 2017-07-09
  • 2016-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多