歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

mahout中phase的含義

最近在做mahout源碼調用的時候,發現一個參數:startPhase和endPhase,這兩個參數是什麼意思呢?比如運行RecommenderJob時,可以看到10個MR任務,所以猜測是否是一個phase代表一個MR?

帶著這樣的疑問進行了實驗:

$Hadoop_HOME/bin/hadoop jar mahout-0.7/core/target/mahout-core-0.7-job.jar org.apache.mahout.cf.taste.hadoop.item.RecommenderJob --input input/intro.csv --output date1129/cf00 --tempDir date1129/cftemp00 --booleanData false --similarityClassname SIMILARITY_COOCCURRENCE --startPhase 0 --endPhase 4

但是,實驗結果卻還是那樣,仍然運行了10個MR,然後就去google了,網上看到這個一個觀點:The first MR job is index 0.  So setting –startPhase 1 will execute the 2nd
job onwards.  Putting in –endPhase 2 would stop after the 3rd job. ,來自http://lucene.472066.n3.nabble.com/RowSimilarity-startphase-and-endphase-parameters-td2119682.html。這個的意思其實就是說MR job 和phase是同一個意思,但是我實驗後卻證明不是這樣;

而且網上這個話題比較少涉及到,沒辦法只能看源碼了。

看 mahout的源碼可以看到基本的算法Job都繼承來AbstractJob這個類,而AbstractJob這個類裡面有一個 shouldRunNextPhase方法,這個方法是和startPhase和endPhase這兩個參數有關的,所以如果 RecommenderJob裡面有這個方法的話,那麼應該就可以說startPhase和endPhase兩個參數是有作用的;

我沒有繼 續分析源碼了,下面說下我的做法:我在AbstractJob這個類的shouldRunNextPhase裡面加入了打印currentPhase和 startPhase,endPhase以及這個方法返回的boolean值,不過這個如果在終端運行(也就是上面提及的在命令行運行)的話,是看不到打 印的內容的。同時也可以不打印,而是選擇用log,寫入log,不過這個要去slave節點機才能看到,比較麻煩,所以就沒有使用Log.

如 何才能打印出結果呢?使用mvn編譯mahout的源代碼(修改過的),然後在$MAHOUT_SOUCE/core/targe裡面有mahout- core-0.7-job.jar文件,把這個文件拷貝到eclipse,然後直接編寫代碼調用這個jar文件裡面的RecommenderJob類就可 以在Console裡面看到我們打印的信息了,這樣就可以看出來MR Job和phase的區別了。

那麼,phase的意義到底是什麼呢?其實pahse的含義就是幾個MR的一個集合,不定數目的MR job視為一個phase。這個有什麼好處呢?比如你運行RecommenderJob時前面的兩個phase都運行成功了,但是後面的運行出錯,那麼是 否要繼續從第一個phase開始運行呢,其實完全沒有必要,可以設置startPhase和endPhase這兩個參數,直接跳過前面兩個Phase。


那麼回到最開始的問題,為什麼我設置了那兩個參數,但是卻沒有作用呢?因為RecommenderJob只有四個phase,而我設置0-4超過了最大值3,所以所有的MR job仍照常運行。

Copyright © Linux教程網 All Rights Reserved