【甘道夫】如何在cdh5.2上运行mahout的itemcf on hadoop
2014-10-23 18:42
411 查看
环境:
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
然后,程序成功执行,世界一片光明!
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
然后,程序成功执行,世界一片光明!
相关文章推荐
- 【甘道夫】怎样在cdh5.2上执行mahout的itemcf on hadoop
- 【甘道夫】基于Mahout0.9+CDH5.2运行分布式ItemCF推荐算法
- 【甘道夫】基于Mahout0.9+CDH5.2运行分布式ItemCF推荐算法
- 【甘道夫】Win7+Eclipse+Maven进行Mahout编程,使其兼容Hadoop2.2.0环境运行
- Hadoop从入门到精通之 如何运行hadoop程序
- 利用Mahout实现在Hadoop上运行K-Means算法
- mahout安装配置,运行kmeans算法,bin/mahout -help出现MAHOUT_LOCAL is not set; adding HADOOP_CONF_DIR to classpath
- 如何让Hadoop运行在OpenStack之上
- 运行mahout0.6 hadoop版本的CF
- 【甘道夫】用贝叶斯文本分类测试打过1329-3.patch的Mahout0.9 on Hadoop2.2.0
- 如何使编写的java程序在hadoop 2.2中运行的完整过程
- 在Hadoop分布式集群环境下Mahout安装和运行K-means、协同过滤实例
- 关于运行hadoop任务的第三方jar如何加入classPath
- 运行hadoop程序,如何在map中获取输入数据的全路径(fullpath)
- 如何在eclipse下开发和运行hadoop程序。
- mahout推荐15-在hadoop上运行MapReduce
- mahout0.6-hadoop1.1.2安装配置及运行kmeans聚类算法
- 如何在Hadoop集群运行JNI程序
- 如何在eclipse中编写好程序,然后打包成jar文件,在hadoop分布式集群上运行
- 如何在美国公司写project plan 邮件--以hadoop安装和Mahout数据分析为例子