【问题标题】:Reducer starts before mapper has finishedReducer 在 mapper 完成之前启动
【发布时间】:2015-09-02 19:54:15
【问题描述】:

我正在运行 Map Reduce 程序。但是,即使我只使用 mapper 或同时使用 mapper 和 reducer 运行它,我也会得到类似的输出。

在此之后它永远不会完成。它挂在那里。

我不明白为什么 reducer 在 mapper 完成 100% 之前就开始了?可能存在哪些潜在问题?

输出:

Map 10% Reduce 0%
Map 19% Reduce 0%
Map 21% Reduce 0%
Map 39% Reduce 0%
Map 49% Reduce 0%
Map 63% Reduce 0% 
Map 67% Reduce 0% 
Map 68% Reduce 0% 
Map 68% Reduce 22%
Map 69% Reduce 22%

这是一个映射器代码:

public class EntityCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
  static String total_record="";

  @Override
  protected void map(LongWritable baseAddress, Text line, Context context)
        throws IOException, InterruptedException {

    Text entity=new Text();
    IntWritable one=new IntWritable(1);

    total_record=total_record.concat(line.toString());
    String[] fields=total_record.split("::");
    if(fields.length==24)
    {
        entity.set(fields[22].trim());          
        context.write(entity,one);
        total_record="";
    }       
  }
}

【问题讨论】:

  • 为什么reduce进程必须等待所有映射完成?一旦有足够的数据可以启动 Reduce 就可以启动它 - 例如。两个节点完成了他们的地图工作。
  • @user3707125 不是真的,在 所有 映射器完成之前,它无法开始 reducing。到那时,它只能开始shuffle,即获取已经完成的mapper的输出。
  • 你的意思是“我得到了类似的输出,即使我只使用 mapper 或同时使用 mapper 和 reducer 运行它”?
  • @vefthym 我的意思是在一种情况下我只设置了映射器类,在另一种情况下我将映射器和减速器类都设置为作业配置
  • @GauravGandhi 这是因为,如果您不指定减速器,则默认使用 identityReducer。如果你不想要reducer,请将reduce 任务的数量设置为零conf.setNumReduceTasks(0);

标签: java hadoop mapreduce bigdata


【解决方案1】:

reduce 阶段有 3 个步骤:shuffle、sort、reduce。 Shuffle 是 reducer 从每个 mapper 收集数据的地方。这可能在映射器生成数据时发生,因为它只是数据传输。另一方面,排序和归约只能在所有映射器完成后开始。你可以通过查看 reducer 完成百分比来判断 MapReduce 在做什么:0-33% 表示它在做 shuffle,34-66% 是 sort,67%-100% 是 reduce。这就是为什么你的 reducer 有时会“卡”在 33% 的原因——它正在等待映射器完成。

【讨论】:

    【解决方案2】:

    这由mapreduce.job.reduce.slowstart.completedmaps 设置控制。默认情况下,一旦完成 5% 的映射,就会安排 reduce。这通常只会启动 reducer 的复制阶段。映射完成后,每个 reducer 将对输入(映射器的输出)进行排序和归约。

    【讨论】:

      【解决方案3】:

      将config“mapreduce.job.reduce.slowstart.completedmaps”的值设置得尽可能高(我们一般按照惯例设置在0.96到0.98左右)。这将使映射器完成 96% 到 98%,然后将启动减速器。

      这也将避免在映射器仍在运行时被reducer持有资源。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-16
        • 2023-04-08
        • 2019-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多