【问题标题】:Why all the reduce tasks are ending up in a single machine?为什么所有 reduce 任务都在一台机器上结束?
【发布时间】:2011-09-01 15:50:49
【问题描述】:

我在Hadoop平台(cloudera发行版)写了一个比较简单的map-reduce程序。除了常规的 map-reduce 任务之外,每个 Map & Reduce 都会将一些诊断信息写入标准输出。

但是,当我查看这些日志文件时,我发现 Map 任务在节点之间分布相对均匀(我有 8 个节点)。但是reduce任务标准输出日志只能在一台机器上找到。

我猜,这意味着所有 reduce 任务最终都在一台机器上执行,这是有问题且令人困惑的。

有人知道这里发生了什么吗?是配置问题吗? 我怎样才能使减少的工作也均匀分布?

【问题讨论】:

  • 映射器是否在 k-v 对中生成多个键?如果碰巧这是一个键,那么将只有一个减速器。如果不是这种情况,则可能是配置问题。

标签: hadoop mapreduce load-balancing


【解决方案1】:

如果映射器的输出都具有相同的键,它们将被放入单个 reducer。

如果您的作业有多个减速器,但它们都在一台机器上排队,那么您就有了配置问题。

使用 Web 界面 (http://MACHINE_NAME:50030) 监控作业并查看它拥有的减速器以及运行它们的机器。还有其他可以深入研究的信息,这些信息将提供有助于找出问题的信息。

关于您的配置的几个问题:

  • 有多少减速器正在运行?
  • 每个节点上有多少个 reducer?
  • 运行reducer的节点是否更好 硬件比其他节点好吗?

【讨论】:

  • 1) 7 个减速器运行良好。 2)如何检查这个? 3)所有reducer的硬件和软件配置完全相同。
  • 我从网页界面查看了执行日志。它有多个reduce任务,但所有reduce任务都在一台机器上运行。
  • 我想我找到了问题所在。每个节点有 8 个核心。所以hadoop会在这台机器上填满8个任务,然后转移到下一个。如果我将减速器计数设置为更高的数字(例如:32),那么它会将作业分配给多个节点。
【解决方案2】:

Hadoop 使用 Partitioner 决定哪个 Reducer 将处理哪个输出键 如果您只输出几个键并希望在​​您的 reducer 中均匀分布,您最好为输出数据实现自定义分区器。例如

public class MyCustomPartitioner extends Partitioner<KEY, VALUE>
{
    public int getPartition(KEY key, VALUE value, int numPartitions) {
            // do something based on the key or value to determine which 
            // partition we want it to go to.
    }
}

然后您可以使用

在作业配置中设置此自定义分区器
Job job = new Job(conf, "My Job Name");
job.setPartitionerClass(MyCustomPartitioner.class);

如果您想根据作业设置进行任何进一步的配置,您还可以在自定义分区器中实现可配置接口。 另外,请检查您是否没有在配置中的任何位置(查找“mapred.reduce.tasks”)或代码中将reduce任务的数量设置为1,例如

job.setNumReduceTasks(1); 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 2017-03-12
    • 2021-12-19
    • 1970-01-01
    • 2018-06-26
    相关资源
    最近更新 更多