2012-05-16 59 views
3

我正在使用Hadoop进行大学任务,并且我的代码正在工作,但即时通讯遇到了一个小问题。Hadoop无法设置减少> 1

我想将reducer的数量设置为19(这是文档建议的0.95 *容量)。但是,当我在任务跟踪器中查看我的工作时,它总共显示1个缩减器。

System.err.println("here"); 
job.setNumReduceTasks(19); 
System.err.println(job.getNumReduceTasks()); 

产量预期:

here 
19 

但在最终输出我得到:

12/05/16 11:10:54 INFO mapred.JobClient:  Data-local map tasks=111 
12/05/16 11:10:54 INFO mapred.JobClient:  Rack-local map tasks=58 
12/05/16 11:10:54 INFO mapred.JobClient:  Launched map tasks=169 
12/05/16 11:10:54 INFO mapred.JobClient:  Launched reduce tasks=1 

我已覆盖的MapReduce的部分是:

  • 映射
  • 减速器
  • 分区器
  • 分组比较器。

我的第一个想法是分区器对每个键都返回相同的值。我检查了这一点,情况并非如此。

我也检查了石斑鱼工作正常。

我不知道还有什么可能导致这种情况。如果有人可以帮助它,将不胜感激。

我非常反对Java的人,所以请尝试使用非常明确的例子,如果你可以。 PS:我没有设置这个簇,它是由大学设置的,所以我不确定任何配置变量。 PS:有太多的代码要发布,所以请让我知道任何代码,特别是你想看到的。

编辑:我被TejasP提出以下问题:

你真的运行在本地模式在Hadoop的代码或它的? (如果您的工作在jobtracker和tasktracker上看到,请参阅 )。

是的我是,它可以在jobtracker UI中查看。这也报告1减速机。以及具有 注意:在settings.xml中将reducer列为1

您是否在环境中导出了HADOOP变量?

是,他们是在ENV可见的代码无法编译,直到我已经设置。

env | grep HADOOP 
HADOOP_HOME=/mnt/biginsights/opt/ibm/biginsights/IHC 
HADOOP_CONF_DIR=/mnt/biginsights/opt/ibm/biginsights/hadoop-conf 

是群集单个节点或多个节点? 并且即使该群集是多个节点,是否所有节点都健康?其他节点有问题吗?

是有多个节点(10)作业服务器报告:

Nodes: 10 
Map Task Capacity: 20 
Reduce Task Capacity: 20 
Blacklisted Nodes: 0 

您是否正确使用setNumReduceTasks? 如上所述,我已经调用了set,​​然后获取并获得它需要的值(19),但最终的代码仍然只使用了1.

您可以将代码缩减为小型map-reduce代码通过删除细节(这只是为了调试)。运行。走着瞧吧。面对同样的问题,在原始问题中提供简化的代码。

我会尝试的结果

+0

你能看到什么是在XML配置在你的工作中。 (在web前端的作业视图中,靠近“作业文件”的蓝色链接)。为“mapred.reduce.tasks”关键字映射了什么值? –

+0

值为,mapred.reduce.tasks:1 什么是设置这个数字? – Nick

+0

我相信这是一个错误。你可以直接通过你的配置来设置值,我想这是job.set(“mapred.reduce.tasks”,“19”);.其实这个方法应该正确地做到这一点。 –

回答

1

,你需要考虑几点再次编辑:

  1. 你真的运行在Hadoop或者其在本地模式下的代码? (看你的工作是否在jobtracker和tasktracker上看到)
  2. 你是否已经在环境中导出HADOOP变量?
  3. 是集群单节点还是多节点?
  4. 即使该群集是多个节点,是否所有节点都健康?其他节点有问题吗?
  5. 您是否正确使用setNumReduceTasks?您可以通过删除细节将代码缩减为小型映射 - 减少代码(这仅用于调试)。运行。走着瞧吧。面对同样的问题,在原始问题中提供简化的代码。
+0

谢谢我编辑了我的原始问题,以包括这些问题的答案(除了正在进行缩减的代码) – Nick

2

它看起来像你在LocalJobRunner模式下运行它(很可能来自eclipse)。在这种模式下,如果减少任务的数量> 1,它重置为1的数量看看下面的几行LocalJobRunner.java

int numReduceTasks = job.getNumReduceTasks(); 
if (numReduceTasks > 1 || numReduceTasks < 0) { 
     // we only allow 0 or 1 reducer in local mode 
     numReduceTasks = 1; 
     job.setNumReduceTasks(1); 
} 
+0

谢谢您的回答。我希望这对其他人有帮助,但是我的问题是因为我被推迟而引起的......请参阅我对OP的评论。 – Nick