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
到$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.
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 >
<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>标签前添加如下内容 :
解决的方法是,在</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>
<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_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
$@所有参数的集合
$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,少了许多屁事!)