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

本文介绍了在CDH5.2环境下,由于Hadoop无法识别Mahout的jar包导致的运行问题。通过在`hadoop-env.sh`中添加Mahout的jar包到HADOOP_CLASSPATH,解决了`ClassNotFoundException`和`FileNotFoundException`。最后,发现冲突来源于`mahout-core-0.9-cdh5.2.0-job.jar`和`mahout-math-0.9-cdh5.2.0.jar`中重复的`org.apache.mahout.math.Vector`类,只添加`mahout-core-0.9-cdh5.2.0-job.jar`即可成功执行。
摘要由CSDN通过智能技术生成
环境:
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

然后,程序成功执行,世界一片光明!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值