【问题标题】:Reducer node takes a long time to receive its recordsReducer 节点需要很长时间才能接收到它的记录
【发布时间】:2013-03-16 15:59:42
【问题描述】:

查看 Hadoop GUI 时,我发现一些 reduce 任务已经达到了 66.66%,并且在那里停留了很长时间。当我检查柜台时,我发现没有。输入记录数显示为零。

很长一段时间后,他们得到他们的输入记录,开始处理它们。 有些甚至在更长的时间内显示 0 个输入记录,并被任务尝试杀死,无法报告状态达 600 毫秒。

但一些 reducer 会立即在其计数器中显示输入记录并立即开始处理它们。

我不知道,为什么某些 reducer 在获取输入记录时会有这么多的延迟。这只发生在这个程序中,而不是其他程序。

在这个mapreduce作业中,我在reduce的reduce方法之前的configure方法中,从分布式缓存中读取了很多数据。这是原因吗?我不确定。

【问题讨论】:

  • 减速机卡在哪个阶段?您能否发布相关 TaskTracker 节点的堆栈跟踪的最后几行?
  • 尝试记录您的配置方法以查看时间。另请注意,一些长时间运行的映射器可能会导致减速器卡住:它们的 shuffle 阶段持续到最后一个映射器完成。
  • 感谢您的评论。我将记录配置方法以查看时间。

标签: java hadoop mapreduce distributed-computing elastic-map-reduce


【解决方案1】:

是的,我相信从分布式缓存中读取是您延迟的原因。但是,如果您在 reduce() 之前或之后保留 configure() 并没有什么不同,因为最终必须首先调用 configure() 方法,如果您看到减速器的 run() 它看起来如下(新 API):

public void run(Context context) throws IOException, InterruptedException {

    setup(context); // This is the counterpart of configure() from older API

    while (context.nextKey()) {
        reduce(context.getCurrentKey(), context.getValues(), context);
    }
    cleanup(context);
}

如您所见,setup()reduce() 之前被调用,类似地,在旧 API 中,除非configure() 完成实际的 reduce 任务,否则不会启动(这说明您看不到任何输入记录数显示)。

现在关于百分比:66%,您会看到 reduce 阶段实际上有以下子部分:

  1. 复制
  2. 排序
  3. 减少

因此,由于您的前两个步骤已完成,第三个步骤已开始但正在等待 configure() 完成(要读取分布式缓存),因此您的减少百分比为 66%。

【讨论】:

  • 感谢您的解释!我还看到一些节点完成了分布式缓存的读取并很快启动了 reduce 方法,但有些节点没有。这有什么原因吗?
  • 是否可以使用 report.progress() 从 context() 方法报告进度?我不知道如何在配置方法中初始化记者。我想知道这一点,因为任务未能报告状态,因此作业失败。
  • 您不能使用旧 API mapred 格式在 configure() 中使用报告器,但您当然可以使用新的 mapreducesetup() 报告进度> API。你可以使用context.progress();
  • @Amar:您确定可以在新的 MapReduce API 中使用context.progress() 吗?尝试执行此操作时出现“找不到符号”错误。
  • 是的,我很确定。检查它放在这里:hadoop.apache.org/docs/r1.1.1/api/org/apache/hadoop/mapreduce/… 基本上它从TaskInputOutputContext 继承progress()。 reducer 的 Context 也是如此。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多