【问题标题】:Hadoop several mappersHadoop几个映射器
【发布时间】:2013-07-18 02:48:18
【问题描述】:

我可以将多个映射器类设置为一个作业吗?

例如,我有一个来自 HDFS 的 csv 输入文件。我有两个任务要做。第一个是从 csv 输入文件中计算两个字段并将结果放入输出文件中。第二个是从同一个 csv 输入文件中计算另外两个字段并将结果放入另一个输出文件中。 Reducer 也一样。

我怎样才能只使用一项工作并同时处理它们呢? (我不想做第一个,然后在第一个完成后做第二个,我想让它们并行处理)。

我尝试以下代码:

    job1.setMapperClass(Mapper1.class);
    job1.setReducerClass(LogReducer.class);

    job1.setMapperClass(Mapper2.class);
    job1.setReducerClass(LogReducer.class);

我试过了,但是没用,它只显示第二个结果,第一个消失了。

【问题讨论】:

    标签: java hadoop mapreduce


    【解决方案1】:

    它显然需要两个作业并行运行。由于映射任务和输出路径不同,并行运行两个作业有什么问题。作业不能处理多个映射器,如果它没有被链接。

    【讨论】:

      【解决方案2】:

      所以问题是你是想要减速器的一个输出还是两个输出。您可以映射两个输入,一个由 Mapper1 映射,另一个由 Mapper2 映射,然后将合并的中间结果传递给 reducer 以获得一个输出。这是在单个作业中使用 MultipleInputs 类,可以在驱动程序类中进行配置。

      如果你想让 Mapper1 的缩减结果和 Mapper2 的缩减结果分开,那么你需要配置两个作业。这两个作业将具有不同的映射器,但会配置相同的减速器类。

      【讨论】:

        【解决方案3】:

        查看 Hadoop 中的 MultipleOutputs 类,以从 reducer 写入多个文件。根据您的 reduce 方法中的条件将输出写入第二个文件。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-09
          • 2011-04-12
          • 1970-01-01
          • 1970-01-01
          • 2017-10-13
          • 1970-01-01
          相关资源
          最近更新 更多