【问题标题】:Is it possible to send parts of the mapper out put to reducer, while just writing the other part to HDFS, in hadoop?是否可以在hadoop中将映射器的一部分发送到reducer,而将另一部分写入HDFS?
【发布时间】:2012-10-10 20:42:27
【问题描述】:

我想将部分映射器输出写入文件夹,例如 HDFS 中的文件夹 A。输出的另一部分,我希望它由reducer处理。这可能吗?我知道多个输出。这可以使用多个输出吗?

谢谢!

【问题讨论】:

    标签: hadoop mapreduce


    【解决方案1】:

    是的,可以使用 MultipleOutputs,根据文档,在 map 阶段通过 MultipleOutputs 传递的任何输出都会被 reducer 忽略,所以这正是你想要的。我在my GitHub上写了一个小例子,希望对你有用。

    【讨论】:

      【解决方案2】:

      您可以从映射器实现直接将输出写入 HDFS - 只需使用上下文的配置创建一个 FileSystem 对象,然后创建一个文件,写入它并记住将其关闭:

      public void cleanup(Context context) {
          FileSystem fs = FileSystem.get(context.getConfiguration());
          PrintStream ps = new PrintStream(fs.create(
              new Path("/path/to/output", "map-output")));
          ps.println("test");
          ps.close();
      }
      

      需要考虑的其他事项 - 每个文件需要在 HDFS 中唯一命名,因此您可以在文件名后加上映射器 ID 号,但您还需要了解推测执行(因为您的映射器任务实例可能在两个位置 - 两者都试图写入 HDFS 中的同一个文件)。

      您通常会从这里抽象出来,因为输出提交程序会在 tmp HDFS 目录中创建具有任务 ID 和尝试编号的文件,仅在提交该任务尝试时将其移动到正确的位置和文件名。在运行 map 端(数据写入本地文件系统)时,如果不关闭推测执行或在 HDFS 中创建多个文件(每次尝试一个),则无法解决此问题。

      所以一个更“完整”的解决方案看起来像:

      FileSystem fs = FileSystem.get(context.getConfiguration());
      PrintStream ps = new PrintStream(fs.create(new Path(
              "/path/to/output", String.format("map-output-%05d-%d",
              context.getTaskAttemptID().getTaskID().getId(),
              context.getTaskAttemptID().getId()))));
      ps.println("test");
      ps.close();
      

      MultipleOutputs 将帮助您减少边,但我不认为映射边会起作用,因为没有输出提交者并且工作目录不在 HDFS 中。

      当然,如果这是一个只有映射器的工作,那么 MultipleOutputs 就可以了。因此,另一种方法是运行仅地图作业,然后在辅助作业中使用所需的输出部分(使用身份映射器) - 取决于我猜你移动了多少数据。

      【讨论】:

      • 嗨,克里斯!谢谢回复!我尝试在映射器中实现多个输出逻辑。我发现我使用 output.collect 发送的任何内容都只会发送到减速器。据我检查,我使用多个输出写入不同文件夹的输出不会发送到减速器。我可以在我的项目中使用这种类型的实现吗?这样做有什么缺点吗?
      • 我不确定我是否完全理解您的评论 - 但如果您尝试的方法对您有用,请使用它。
      猜你喜欢
      • 1970-01-01
      • 2014-10-12
      • 2011-05-14
      • 2012-03-16
      • 2017-01-20
      • 2015-12-14
      • 1970-01-01
      • 2011-08-11
      • 2021-06-27
      相关资源
      最近更新 更多