2011-08-31 62 views
0

我在Hadoop平台(cloudera发布)中编写了一个相对简单的map-reduce程序。每个地图&除了常规地图缩小任务之外,还可以将一些诊断信息写入标准输出。为什么所有的reduce任务都在一台机器中结束?

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

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

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

+0

是映射器产生多个密钥在KV对?如果碰巧是一个单一的键,那么将只有一个减速器。如果不是这种情况,那么可能是一个配置问题。 –

回答

6

如果映射器的输出全部具有相同的密钥,则它们将被放入一个简化器中。

如果你的工作有多个reducer,但他们都在一台机器上排队,那么你有一个配置问题。

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

有关配置的夫妇的问题:

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

1)7减速机运转良好。 2)如何检查这一个? 3)所有减速器具有完全相同的硬件和软件配置。 – ablimit

+0

我从Web界面查看执行日志。它有多个减少任务,但是所有减少任务以某种方式在一台机器上运行。 – ablimit

+1

我想我发现了这个问题。每个节点有8个核心。所以hadoop会在这台机器上填满8个任务并转移到下一个。如果我将reducer数设置为更高的数字(例如32),那么它会将作业分配给多个节点。 – ablimit

2

Hadoop的决定哪些减速将处理其输出密钥通过使用Partitioner 的。如果你只输出几个键,并想跨减速均匀分布,你可能会更好实现自定义分区程序你输出数据。例如

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); 

您也可以实现您的自定义分区程序的配置界面,如果你想根据岗位设置做任何进一步的配置。 另外,检查你有没有设定减少配置的任何地方任务为1(寻找“mapred.reduce.tasks”),或在代码的数量,例如

job.setNumReduceTasks(1); 
相关问题