我是靠谱客的博主 愤怒灯泡,最近开发中收集的这篇文章主要介绍eclipse下开发mapreduce程序设置reduce个数无效的问题及解决,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

reduce个数是可以根据集群和项目具体情况设置的,新接口中用job.setNumReduceTasks(n);即可设置,但前几天用eclipse调试mapreduce程序时发现无论设置reduce个数是多少,运行时仍然只有一个reduce,输出目录里也只有一个输出文件part-r-00000。

看运行日志中启动的是LocalJobRunner, 网上查询得知hadoop有本地、伪分布、完全分布三种模式,LocalJobRunner是运行的本地模式,所以只能有一个reduce,但我明明配置了集群!

接下来查看源代码看看能不能找出启动LocalJobRunner的原因:首先主方法中job.waitForCompletion()内部调用了job类的submit()方法,submit()方法又调用了jobClient.submitJobInternal(conf)来提交作业,这个方法比较复杂,但用到了JobID jobId = jobSubmitClient.getNewJobId()来获取jobId,注意到本地模式运行日志中的jobId有“local”字样,估计本地模式和分布模式的差异可能在这里开始产生。再看这个jobSubmitClient的类型是接口JobSubmissionProtocol,这个接口有两个实现类JobTracker和LocalJobRunner!在JobClient类中用了一个init方法来初始化jobSubmitClient,代码如下:


public void init(JobConf conf) throws IOException {
String tracker = conf.get("mapred.job.tracker", "local");
tasklogtimeout = conf.getInt(
TASKLOG_PULL_TIMEOUT_KEY, DEFAULT_TASKLOG_TIMEOUT);
this.ugi = UserGroupInformation.getCurrentUser();
if ("local".equals(tracker)) {
conf.setNumMapTasks(1);
this.jobSubmitClient = new LocalJobRunner(conf);
} else {
this.rpcJobSubmitClient =
createRPCProxy(JobTracker.getAddress(conf), conf);
this.jobSubmitClient = createProxy(this.rpcJobSubmitClient, conf);
}
}
看来是通过配置文件的mapred.job.tracker来获取集群的jobTracker的地址,获取不到的话默认值是local便会对jobSubmitClient生成本地的LocalJobRunner,而LocalJobRunner的代码中将numReduceTasks固定为1。原因也就找到了,mapred.job.tracker虽然在我的mapred-site.xml中已配置,但是并没有关联到eclipse的工程中来,解决方法是把conf文件夹复制到工程项目下作为项目的class folder。然后将项目重新生成jar包,运行,reduce个数和生成的文件数就是job.setNumReduceTasks(n)设置的个数了。

最后

以上就是愤怒灯泡为你收集整理的eclipse下开发mapreduce程序设置reduce个数无效的问题及解决的全部内容,希望文章能够帮你解决eclipse下开发mapreduce程序设置reduce个数无效的问题及解决所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部