mahout中phase的含义

最近在做mahout源码调用的时候,发现一个参数:startPhaseendPhase,这两个参数是什么意思呢?比如运行RecommenderJob时,可以看到10MR任务,所以猜测是否是一个phase代表一个MR

带着这样的疑问进行了实验:

$HADOOP_HOME/bin/hadoopjarmahout-0.7/core/target/mahout-core-0.7-job.jarorg.apache.mahout.cf.taste.hadoop.item.RecommenderJob--inputinput/intro.csv--outputdate1129/cf00--tempDirdate1129/cftemp00--booleanDatafalse--similarityClassnameSIMILARITY_COOCCURRENCE--startPhase0--endPhase4

但是,实验结果却还是那样,仍然运行了10MR,然后就去google了,网上看到这个一个观点:ThefirstMRjobisindex0.SosettingstartPhase1willexecutethe2nd
jobonwards.PuttinginendPhase2wouldstopafterthe3rdjob.,来自http://lucene.472066.n3.nabble.com/RowSimilarity-startphase-and-endphase-parameters-td2119682.html。这个的意思其实就是说MRjobphase是同一个意思,但是我实验后却证明不是这样;

而且网上这个话题比较少涉及到,没办法只能看源码了。

mahout的源码可以看到基本的算法Job都继承来AbstractJob这个类,而AbstractJob这个类里面有一个shouldRunNextPhase方法,这个方法是和startPhaseendPhase这两个参数有关的,所以如果RecommenderJob里面有这个方法的话,那么应该就可以说startPhaseendPhase两个参数是有作用的;

我没有继续分析源码了,下面说下我的做法:我在AbstractJob这个类的shouldRunNextPhase里面加入了打印currentPhasestartPhase,endPhase以及这个方法返回的boolean值,不过这个如果在终端运行(也就是上面提及的在命令行运行)的话,是看不到打印的内容的。同时也可以不打印,而是选择用log,写入log,不过这个要去slave节点机才能看到,比较麻烦,所以就没有使用Log.

如何才能打印出结果呢?使用mvn编译mahout的源代码(修改过的),然后在$MAHOUT_SOUCE/core/targe里面有mahout-core-0.7-job.jar文件,把这个文件拷贝到eclipse,然后直接编写代码调用这个jar文件里面的RecommenderJob类就可以在Console里面看到我们打印的信息了,这样就可以看出来MRJobphase的区别了。

那么,phase的意义到底是什么呢?其实pahse的含义就是几个MR的一个集合,不定数目的MRjob视为一个phase。这个有什么好处呢?比如你运行RecommenderJob时前面的两个phase都运行成功了,但是后面的运行出错,那么是否要继续从第一个phase开始运行呢,其实完全没有必要,可以设置startPhaseendPhase这两个参数,直接跳过前面两个Phase

那么回到最开始的问题,为什么我设置了那两个参数,但是却没有作用呢?因为RecommenderJob只有四个phase,而我设置0-4超过了最大值3,所以所有的MRjob仍照常运行。




分享,成长,快乐




你可能感兴趣的:(Mahout)