我正在使用Hadoop进行大学作业,我的代码可以工作,但是我遇到了一个小问题。
我正在尝试将化简器的数量设置为 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上运行代码还是在本地模式下运行代码?(见 如果您的作业显示在作业跟踪器和任务跟踪器上(。
是的,我是,它可以在工作跟踪器UI中查看。这也报告了 1 个减速器。以及拥有注意:这会在设置中将减速器列为 1.xml
您是否在环境中导出了 HADOOP 变量?
是的,它们在 env 中可见,在我设置它们之前代码不会编译。
env | grep HADOOP
HADOOP_HOME=/mnt/biginsights/opt/ibm/biginsights/IHC
HADOOP_CONF_DIR=/mnt/biginsights/opt/ibm/biginsights/hadoop-conf
是的,群集是单节点还是多节点? AND 即使群集由多个节点组成,所有节点是否都正常运行?其他节点有问题吗?
有多个节点 (10( 作业跟踪器报告:
Nodes: 10
Map Task Capacity: 20
Reduce Task Capacity: 20
Blacklisted Nodes: 0
你是否正确使用了setNumReduceTasks? 如上所述,我已经调用了 set,然后获取并取回了它应该是 (19( 的值,但最终代码仍然只使用了 1。
您可以通过删除细节将代码简化为一个小的map-reduce代码(仅用于调试(。运行它。看看会发生什么。面对同样的问题,请在原始问题中提供减少的代码。
我将尝试再次编辑结果
看起来您正在 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);
}
您需要考虑的几点:
- 你真的在Hadoop上运行代码还是在本地模式下运行代码?(查看您的作业是否在作业跟踪器和任务跟踪器上显示(
- 您是否在环境中导出了 HADOOP 变量?
- 群集是单节点还是多节点?
- 即使群集由多个节点组成,是否所有节点都正常运行?其他节点有问题吗?
- 你是否正确使用了setNumReduceTasks?您可以通过删除详细信息将代码简化为一个小的map-reduce代码(仅用于调试(。运行它。看看会发生什么。面对同样的问题,请在原始问题中提供减少的代码。