`
thecloud
  • 浏览: 872167 次
文章分类
社区版块
存档分类
最新评论

mahout源码分析之Decision Forest 三部曲之二BuildForest(2)小插曲

 
阅读更多

尼玛,好坑呀!

昨天遇到的问题原来是找错包了,那个Step1Mapper.class 同时在mahout-core-0.7.jar mahout-core-0.7-job.jar mahout-examples-0.7-job.jar 三个包中,但是用到的只是mahout-core-0.7.jar中的Step1Mapper.class,所以只用替换mahout-core-0.7.jar中相应的文件即可。出来的结果如下:


可以看到这里的partition已经变成了0了,这个值是在哪里设置的?

Step1Mapper中log的设置如下:

protected void setup(Context context) throws IOException, InterruptedException {
	  log.info("in setup() before super.setup() partition : {}",
			  context.getConfiguration().getInt("mapred.task.partition", -1));
    super.setup(context);
    Configuration conf = context.getConfiguration();
    log.info("in setup() after super.setup() partition : {}",
			  conf.getInt("mapred.task.partition", -1));
    configure(Builder.getRandomSeed(conf), conf.getInt("mapred.task.partition", -1),
      Builder.getNumMaps(conf), Builder.getNbTrees(conf));
  }
可以看到我在setup函数刚进来的时候还没有执行super.setup的时候mapred.task.partition就已经被赋值了,这点如何说明?

看PartialBuilder,我在PartialBuilder中加入了下面的语句:

protected void configureJob(Job job) throws IOException {
    Configuration conf = job.getConfiguration();
    log.info("in PartialBuilder configureJob() partition : {}",
			  conf.getInt("mapred.task.partition", -1));
    job.setJarByClass(PartialBuilder.class);
    
    FileInputFormat.setInputPaths(job, getDataPath());
    FileOutputFormat.setOutputPath(job, getOutputPath(conf));
    
    job.setOutputKeyClass(TreeID.class);
    job.setOutputValueClass(MapredOutput.class);
    
    job.setMapperClass(Step1Mapper.class);
    job.setNumReduceTasks(0); // no reducers
    
    job.setInputFormatClass(TextInputFormat.class);
    job.setOutputFormatClass(SequenceFileOutputFormat.class);
  }
这里是设置Job的和conf的,我在conf不会变的情况下,读取了它的值,如下:

可以看到这个值还是没有设置的,如果设置的话不应该读到-1。

所以得到的结论就是Job提交之前conf没有设置mapred.task.partition的值,但是刚提交,在Mapper的第一个运行函数setup中就可以读取conf的mapred.task.partition的值了,这是神马情况?难道其他地方还有设置这个值的?好吧,我搜搜看:


尼玛,还真有。除了mahou里面的,hadoop里面也有三个类含有这个值:FileOutputFormat、IsolationRunner、Task。这三个中只有Task最像是设置mapred.task.partition的值的类。Task:任务。好吧,应该就是这里设置了这个值了。好吧,我为啥老是追着这个值不放?因为我编写Step1Mapper 的仿制代码的时候需要这个值,而我又不知道这个值是多少,坑爹呀。昨天就应该知道的,结果替换错了.class文件了。算了,不纠结这个变量值了,知道了就好。如果真要追究的话,应该要涉及到hadoop的执行原理了吧。


分享,成长,快乐

转载请注明blog地址:http://blog.csdn.net/fansy1990


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics