- 1. 问题描述
- 2. Mahout源码下载
- 3. 编译源码
- 3.1 编译环境和工具
- 3.2 修改项目的java版本
- 3.3 编译源码
- 3.4 引入第三方依赖
1. 问题描述
最近在使用Mahout里的推荐算法进行实验,由于业务需求,需要修改Mahout源码,将原本输出到HDFS上的结果输出到HBase中。由于Mahout发布的源码都是Maven项目,所以在对项目进行编译打包时遇到了一些问题,在此文章中进行记录总结。
2. Mahout源码下载
目前,Mahout最新版本已经更新到0.13,从基于Hadoop平台迁移到了Spark,从Mahout官网可以了解其发展历程和框架特性。
官网地址:http://mahout.apache.org/
Mahout历史版本源码下载地址: http://archive.apache.org/dist/mahout/
由于公司使用的Hadoop版本是CDH4.7.1,对应Mahout0.7版,为了保持一致性,所以下载了cdh版Mahout源码。
Mahout CDH版源码下载地址:https://github.com/cloudera/mahout/tree/cdh4-0.7_4.7.1
3. 编译源码
3.1 编译环境和工具
- apache-maven-3.5.4
- JDK 1.8
Maven的安装和配置比较简单,这里不做介绍。
3.2 修改项目的java版本
源码项目默认使用的jdk版本一般和系统不一致,所以直接进行编译会报错,需要先修改项目的pom.xml
文件。下载下来的Mahout源码是一个多模块的Maven项目,修改根目录下父级项目的pom.xml
文件即可。
只需要将以下
中的1.6修改为自己电脑配置中的jdk版本即可。
false
1.6
1.6
true
UTF-8
${cdh.hadoop.version}
3.6.0
1.6
3.3 编译源码
直接执行mvn clean install
报如下错误:
[INFO] Apache Mahout 0.7-cdh4.7.1 ......................... SUCCESS [ 1.207 s]
[INFO] Mahout Build Tools ................................. SUCCESS [ 1.475 s]
[INFO] Mahout Math ........................................ SUCCESS [ 17.652 s]
[INFO] Mahout Core ........................................ FAILURE [ 3.546 s]
[INFO] Mahout Integration ................................. SKIPPED
[INFO] Mahout Examples .................................... SKIPPED
[INFO] Mahout Release Package 0.7-cdh4.7.1 ................ SKIPPED
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 24.260 s
[INFO] Finished at: 2018-12-12T16:07:19+08:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile (default-compile) on projec
mahout-core: Compilation failure: Compilation failure:
[ERROR] \mahout-cdh4-0.7_4.7.1\core\src\main\java\org\apache\mahout\clustering\classify\ClusterClassifier.java:[24,29]
错误: 程序包org.apache.hadoop.conf不存在
[ERROR] \mahout-cdh4-0.7_4.7.1\core\src\main\java\org\apache\mahout\clustering\classify\ClusterClassifier.java:[25,27]
错误: 程序包org.apache.hadoop.fs不存在
[ERROR] \mahout-cdh4-0.7_4.7.1\core\src\main\java\org\apache\mahout\clustering\classify\ClusterClassifier.java:[26,27]
错误: 程序包org.apache.hadoop.fs不存在
[ERROR] \mahout-cdh4-0.7_4.7.1\core\src\main\java\org\apache\mahout\clustering\classify\ClusterClassifier.java:[27,27]
错误: 程序包org.apache.hadoop.io不存在
[ERROR] \mahout-cdh4-0.7_4.7.1\core\src\main\java\org\apache\mahout\clustering\classify\ClusterClassifier.java:[28,27]
错误: 程序包org.apache.hadoop.io不存在
[ERROR] \mahout-cdh4-0.7_4.7.1\core\src\main\java\org\apache\mahout\clustering\classify\ClusterClassifier.java:[29,27]
错误: 程序包org.apache.hadoop.io不存在
[ERROR] \mahout-cdh4-0.7_4.7.1\core\src\main\java\org\apache\mahout\clustering\classify\ClusterClassifier.java:[30,27]
错误: 程序包org.apache.hadoop.io不存在
[ERROR] \mahout-cdh4-0.7_4.7.1\core\src\main\java\org\apache\mahout\clustering\classify\ClusterClassifier.java:[65,90]
错误: 找不到符号
[ERROR] \mahout-cdh4-0.7_4.7.1\core\src\main\java\org\apache\mahout\clustering\Model.java:[20,27] 错误: 程序包org.apach
.hadoop.io不存在
[ERROR] \mahout-cdh4-0.7_4.7.1\core\src\main\java\org\apache\mahout\clustering\Model.java:[29,34] 错误: 找不到符号
.......
从报错信息中可以看到mahout-core
模块编译失败,原因是找不到Hadoop的配置文件类,Hadoop配置文件类包含在hadoop-common
的jar包中,查看core
目录下的pom.xml
文件,查找hadoop-commen
发现已经有引入依赖,但是是在配置中引入,需要激活相应的配置。
hadoop-0.23
hadoop.profile
23
org.apache.hadoop
hadoop-common
org.apache.hadoop
hadoop-mapreduce-client-common
org.apache.hadoop
hadoop-mapreduce-client-core
激活相应配置并编译源码,执行mvn -Phadoop-0.23 -DskipTests clean install
,添加的-DskipTests
参数为跳过测试模块,会节省编译时间。
编译成功后,在各自模块的/target
目录下可以看到输出的jar包。
3.4 引入第三方依赖
使用mvn eclipse:eclipse
可以将Maven项目转化为eclipse项目在eclipse中进行修改。之前提到我们的需求是将输出结果输出到HBase,在修改工程代码的过程中需要引入第三方HBase的依赖jar包,修改完后代码后再次执行mvn clean install
会再次报错,原因是Maven编译项目根据来进行的pom.xml
,所以我们需要在配置文件中添加我们所依赖的第三方jar的信息。例如,依赖了hbase
和mr
的jar包,添加依赖配置如下:
hadoop-0.23
hadoop.profile
23
org.apache.hadoop
hadoop-common
org.apache.hadoop
hadoop-mapreduce-client-common
org.apache.hadoop
hadoop-mapreduce-client-core
org.apache.hbase
hbase
0.94.15-cdh4.7.1
所依赖jar包的groupId
和artifactId
可以在Maven官网中查询,同时还可以获取到依赖包所在的仓库地址,查看根目录下的pom.xml
,如果没包含此仓库则需要自行添加。
cdh.hbase
Apache Hbase Repository
https://repository.cloudera.com/content/repositories/releases/
false
apache.snapshots
Apache Snapshot Repository
http://repository.apache.org/snapshots
false
cdh.repo
https://repository.cloudera.com/artifactory/cloudera-repos
Cloudera Repositories
false
cdh.snapshots.repo
https://repository.cloudera.com/artifactory/libs-snapshot-local
Cloudera Snapshots Repository
true
false