Mahout 0.5部署

Mahout下載與安裝

1、下載Mahout。到地址[1]可以找到鏡像地址。我們下載Mahout 0.5。請將mahout-distribution-0.5.tar.gz和mahout-distribution-0.5-src.zip都下載下來,前者是正式軟件,後者是源文件,用於導入eclipse以便修改並重新編譯所需要的包。

2、在/home/user(你自己的用戶名)目錄下創建一個名爲mahout(或其他合法名字)的文件夾,這樣,環境變量$MAHOUT_HOME的值爲/home/user/mahout。將mahout-distribution-0.5.tar.gz解壓並部署到其中。如果在Windows下操作,需要使用7-zip解壓,WinRAR會有問題;解壓後將全部文件上傳到$MAHOUT_HOME目錄下。

3、刪掉mahout-core-0.5.jar和mahout-examples-0.5.jar兩個包,否則會有類衝突。衝突的原因是,mahout將$MAHOUT_HOME目錄下的所有jar都放到CLASSPATH中,而mahout-core-0.5.jar排在mahout-examples-0.5-job.jar前面(詳見$MAHOUT_HOME/bin/mahout文件),並且包含類org.apache.mahout.driver.MahoutDriver,這樣在任務執行時,提交給Hadoop的是mahout-core-0.5.jar,而不是mahout-examples-0.5-job.jar。mahout-core-0.5.jar缺少一些類(比如,Vector類),運行時會報錯。

4、在/home/user/.profile(.bash_profile)或.cshrc(.bashrc)中設置環境變量:
export MAHOUT_HOME=/home/user/mahout
同時要確保環境中已經有HADOOP_HOME和HADOOP_CONF_DIR兩個變量。

5、打開$MAHOUT_HOME/bin/mahout,找到這一行:
MAHOUT_CONF_DIR=$MAHOUT_HOME/src/conf
修改爲:
MAHOUT_CONF_DIR=$MAHOUT_HOME/conf
因爲mahout發行版中根本沒有src這個文件夾。

6、給mahout賦予可執行權限
到$MAHOUT_HOME/bin/文件夾下,執行
chmod a+x mahout

搭建eclipse下mahout重編譯環境

1、請先確認eclipse中已經安裝了Maven插件。(如果沒有,可以通過Help--Eclipse Marketplace在線安裝Maven Integration for Eclipse)。

2、解壓mahout-distribution-0.5-src.zip到eclipse的workspace(同樣的,用WinRAR可能解壓不了,請使用7-Zip)。

3、導入mahout源文件。
打開eclipse,選擇File-Import-Maven-Existing Maven Projects,點擊next


選擇路徑,點擊next


下一步,出現這個錯誤怎麼辦?


網上搜到這麼一個答案:
You cannot fix them except for commenting out the sections of the two pom.xml files which complain. This is a bad idea, because then Mahout will not build and install into your local Maven repository cache ($HOME/.m2).

The only problem this causes is that if you have another project outside Mahout and you make it depend on one of these project, that project will not get built. This is all I've come across. So: just ignore it. Or report it to m2e.

忽略這個錯誤吧。


4、消滅小紅叉。
導入後,會有三個文件夾出現紅叉


接下來我們來解決這些小紅叉。

打開項目文件夾,發現小紅叉來源於pom.xml這個文件。


在mahout-core中,錯誤信息是:
Plugin execution not covered by lifecycle configuration: org.apache.maven.plugins:maven-antrun-plugin:1.6:run (execution: default, phase: compile)
解決的方法是,在</build>標籤前面添加下面一段代碼:
<pluginManagement>
      <plugins >
        <!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build
          itself. -->
        <plugin >
          <groupId >org.eclipse.m2e </groupId >
          <artifactId >lifecycle-mapping </artifactId >
          <version >1.0.0 </version >
          <configuration >
            <lifecycleMappingMetadata >
              <pluginExecutions >
                <pluginExecution >
                  <pluginExecutionFilter >
                    <groupId >org.apache.maven.plugins </groupId >
                    <artifactId >maven-antrun-plugin </artifactId >
                    <versionRange >[1.6,) </versionRange >
                    <goals >
                      <goal >run </goal >
                    </goals >
                  </pluginExecutionFilter >
                  <action >
                    <ignore />
                  </action >
                </pluginExecution >
              </pluginExecutions >
            </lifecycleMappingMetadata >
          </configuration >
        </plugin >
      </plugins >
    </pluginManagement >

而在mahout-examples和mahout-utils中,錯誤信息都是:
maven-dependency-plugin (goals "copy-dependencies", "unpack") is not supported by m2e.
解決的方法是,在</build>標籤前添加如下內容 :
<pluginManagement>
     <plugins>
          <!-- Ignore/Execute plugin execution -->
          <plugin>
               <groupId>org.eclipse.m2e</groupId>
               <artifactId>lifecycle-mapping</artifactId>
               <version>1.0.0</version>
               <configuration>
                    <lifecycleMappingMetadata>
                         <pluginExecutions>
                              <!-- copy-dependency plugin -->
                              <pluginExecution>
                                   <pluginExecutionFilter>
                                        <groupId>org.apache.maven.plugins</groupId>
                                        <artifactId>maven-dependency-plugin</artifactId>
                                        <versionRange>[1.0.0,)</versionRange>
                                        <goals>
                                             <goal>copy-dependencies</goal>
                                        </goals>
                                   </pluginExecutionFilter>
                                   <action>
                                        <ignore />
                                   </action>
                              </pluginExecution>
                         </pluginExecutions>
                    </lifecycleMappingMetadata>
               </configuration>
          </plugin>
     </plugins>
</pluginManagement>

請特別注意版本信息,要與maven的版本相匹配。完事後主文件夾依然有小紅叉,但裏面的文件都已正常,可以運行了。


Mahout重編譯

如果我們要編譯整個Mahout,在Mahout5項目下,右鍵單擊pom.xml文件,選擇“Run as”--"Maven build..."在Goals欄目中填上“clean package”,勾選“Skip Tests”,點擊“Run”,即開始構建。

一般來說,我們經常要修改的是mahout-core-0.5-job.jar和mahout-examples-0.5-job.jar兩個包
編譯完成後,到workspace/Mahout5/core/target下可以找到mahout-core-0.5-job.jar;到workspace/Mahout5/examples/target下可以找到mahout-examples-0.5-job.jar


Mahout入口

首先拋出疑問:執行“mahout kmeans --help”命令之後發生了什麼呢?

Mahout的入口是在$MAHOUT_HOME/bin/mahout文件,它是一個shell,主要用於設置環境變量,以及啓動任務。文件裏面設定的環境變量有:
MAHOUT_JAVA_HOME:指定java的執行路徑,會覆蓋$JAVA_HOME。
MAHOUT_HEAPSIZE:Java運行堆棧的內存大小,單位爲MB。
HADOOP_CONF_DIR:Hadoop 配置文件路徑主要是*-site.xml這些文件的位置
MAHOUT_OPTS:mahout運行時的java參數
MAHOUT_CONF_DIR:類文件屬性文件所在文件,文件名是類名簡寫,默認位置
MAHOUT_LOCAL:設置是否本地運行,如果設置這個參數就不會運行hadoop了,一旦設置這個參數,那HADOOP_CONF_DIR 和HADOOP_HOME 這兩個參數的設置就自動失效了。
MAHOUT_CORE:是否應用開發環境的core,還是發佈的core。
參數-core:指定引用包的路徑



經過一系列變量定義、參數解析後,mahout通過以下命令開始執行任務:
exec "$HADOOP_HOME/bin/hadoop" jar $MAHOUT_JOB $CLASS "$@"
其中,
$MAHOUT_JOB是mahout-examples-0.5-job.jar包
$CLASS是org.apache.mahout.driver.MahoutDriver
$@所有參數的集合

任務的類入口org.apache.mahout.driver.MahoutDriver,在mahout-core包中
經過一系列處理後,mahout會加載$MAHOUT_HOME/conf/driver.classes.props文件,如果沒有driver.classes.props這個文件,那就會加載driver.classes.default.props,這個文件在每個jar包中都有,想知道這個文件的內容,可以直接將mahout-examples-0.5-job.jar拖到WinRAR中,就能看到這個了。這個文件定義了當執行某個命令時,mahout會調用哪個類。比如我們執行mahout kmeans時,會調用org.apache.mahout.clustering.kmeans.KMeansDriver這個類。

(2013-08-02更新:直接用mahout 0.8吧,傳上去就可用,暫沒發現bug,少了許多屁事!)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章