【甘道夫】如何在cdh5.2上运行mahout的itemcf on hadoop,mahoutitemcf


环境: hadoop-2.5.0-cdh5.2.0
mahout-0.9-cdh5.2.0
步骤: 基本思路是,将mahout下的所有jar包都引入hadoop的classpath即可,所以修改了$HADOOP_HOME/etc/hadoop/hadoop-env.sh,添加如下代码将mahout的所有jar包引入hadoop的classpath: for b in $MAHOUT_HOME/lib/*.jar; do   if [ "$HADOOP_CLASSPATH" ]; then     export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$b   else     export HADOOP_CLASSPATH=$b   fi done
for c in $MAHOUT_HOME/*.jar; do   if [ "$HADOOP_CLASSPATH" ]; then     export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$c   else     export HADOOP_CLASSPATH=$c   fi done
添加完代码,准备好基础数据,上传好jar包后,执行命令: hadoop jar gul-itemcf-hadoop.jar ItemCFHadoop

注意: 该jar包没有包含所有的依赖包,仅包含了mapreduce类。 用maven加入所有依赖包的做法会导致最终的jar包十分臃肿,这样的做法是十分不优雅的,并且会增加网络和内存的负担,所以放弃。
遇到问题 顺利完成第一个job的执行,从第二个job开始,先抛出如下异常 Error: java.lang.ClassNotFoundException: org.apache.mahout.math.Vector
然后抛出如下异常 Exception in thread "main" java.io.FileNotFoundException: File does not exist: /RecommenderSystem/                               JiLinSMEPSP/RecommenderEngine/Service/GuessULike/tmp/1414042683946/preparePreferenceMatrix/numUser                               s.bin

看到第一条错误相信大家都明白,这是hadoop没有识别到第三方(mahout)依赖jar包的问题
解决思路 首先能确定,向$HADOOP_HOME/etc/hadoop/hadoop-env.sh中添加HADOOP_CLASSPATH的方法是好使的,因为去掉最开始添加的语句后,连mahout的cf相关class都识别不到,但是,为什么只识别了一部分呢?难道是冲突? 随后,我也饶了一些弯路,参照网上众多大神的招数,比如将jar包拷到$HADOOP_HOME/lib,但所有招数都不好使,最后思路还是回到“包冲突”思路上来。
终极解决方案 通过对比$MAHOUT_HOME下的几个jar包得知,mahout-core-0.9-cdh5.2.0-job.jar包含了所有执行job需要用到的class,并且和mahout-math-0.9-cdh5.2.0.jar都重复包含了org.apache.mahout.math.Vector,看来就是冲突导致的不识别该class,所以,终极解决方案很简单,$HADOOP_HOME/etc/hadoop/hadoop-env.sh中引入一个jar包即可 export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$MAHOUT_HOME/mahout-core-0.9-cdh5.2.0-job.jar
然后,程序成功执行,世界一片光明!

Mahout安装后运行mahout --help出现“MAHOUT_LOCAL is not set;adding HADOOP_CONF_DIR to classpath”?

不要找原因了,应该是版本的问题,你应该是用了较新的版本,可以考虑用旧版本试试,0.5以下就行。
 

运行mahout为何要用hadoop我用eclipse maven做了一个mahout实例也没用到之前建的伪分布式hadoop

mahout 和 hadoop没有啥关系,非得说关系的话,你得弄清二者是干啥的

mahout是一个机器学习算法库,人家是做一些经典的机器学习的算法实现的;
hadoop是一个开源的分布式的数据处理引擎(HadoopV1来说,是MapReduce),人家很多时候是做大规模数据处理的;
所以,Mahout上的一些算法支持用mapreduce的编程模型实现,所以就可以运行在Hadoop平台上;
这样说你就可以明白了吧,二者不是一个层级上的东西,所发挥的作用也是不一样的,而且你运行的实例的确也没有用到Hadoop。。。
 

相关内容

    暂无相关文章