很早就装上了mahout-distribution-0.5,结果运行第一个例子Canopy Clustering的时候就报错,在Mahout的官方主页tutorial页面里写了comment,说明了出错的地方,结果没人搭理。
运行命令如下:
root@master:/opt/mahout-distribution-0.5# bin/mahout org.apache.mahout.clustering.syntheticcontrol.canopy.Job
今天碰巧又运行了一下,仔细看了$MAHOUT_HOME/bin/下的mahout脚本,终于找到出错原因。
在mahout脚本中默认的MAHOUT_CONF_DIR是"$MAHOUT_HOME/src/conf",可是从官方下下来解压后mahout-distribution-0.5的子目录根本没有src(只有源码的压缩包里有,发行版里面没有),倒是有conf,因此这个地方会导致
”WARN driver.MahoutDriver: No org.apache.mahout.clustering.syntheticcontrol.canopy.Job.props found on classpath, will use command-line arguments only“
的错误。
修改方法:编辑bin/mahout,找到这一行:
MAHOUT_CONF_DIR=$MAHOUT_HOME/src/conf
将其修改为
MAHOUT_CONF_DIR=$MAHOUT_HOME/conf
ok,不会报上面那个错了。
别高兴太早,接着运行时会报:
Error: java.lang.ClassNotFoundException: org.apache.mahout.math.Vector
不是吧,看看经过mahout脚本出来的完整命令如下:
/opt/hadoop-0.20.2/bin/hadoop jar /opt/mahout-distribution-0.5/mahout-examples-0.5-job.jar org.apache.mahout.driver.MahoutDriver org.apache.mahout.clustering.syntheticcontrol.canopy.Job
应该没问题啊,math包里面的Vector也在mahout-examples-0.5-job.jar里面啊,怎么会找不到类呢?
凭借长期的Hadoop经验,终于找到原因,原来还在mahout脚本里。
mahout脚本有这么几句:
if [ $IS_CORE == 0 ]
then
# add release dependencies to CLASSPATH
for f in $MAHOUT_HOME/mahout-*.jar; do
CLASSPATH=${CLASSPATH}:$f;
done
意思是将mahout-distribution-0.5目录下的所有jar放到CLASSPATH中,然而碰巧mahout-core-0.5.jar排在mahout-examples-0.5-job.jar前面,并且包含类org.apache.mahout.driver.MahoutDriver,因此实际上提交给Hadoop的是mahout-core-0.5.jar,而不是后者。mahout-core-0.5.jar没有Vector类,因此运行时报错。
解决方法:运行命令时在mahout后面加上-core,这样上面的语句不会执行,也就没问题了。
root@master:/opt/mahout-distribution-0.5# bin/mahout -core org.apache.mahout.clustering.syntheticcontrol.canopy.Job
well done,问题解决。
P.S. 其实用
[root@master:/opt/mahout-distribution-0.5]# hadoop jar mahout-examples-0.5-job.jar org.apache.mahout.clustering.syntheticcontrol.canopy.Job
这样的方式运行就不会有问题,不过这样不会读取conf下的props文件。
还有一个问题没解决,就是将Mahout导入Eclipse后,在mahout-core、mahout-examples、mahout-utils下面的pom.xml里面报错,
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<phase>compile</phase>
<configuration>
<tasks>
<copy file="../src/conf/driver.classes.props" tofile="${project.build.directory}/classes/driver.classes.default.props" />
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
错误为:
Plugin execution not covered by lifecycle configuration: org.apache.maven.plugins:maven-antrun-plugin:1.6:run (execution: default, phase: compile)
不知道如何解决,有达人会的话,请不吝赐教。