目录

最近在使用Mahout里的推荐算法进行实验,由于业务需求,需要修改Mahout源码,将原本输出到HDFS上的结果输出到HBase中。由于Mahout发布的源码都是Maven项目,所以在对项目进行编译打包时遇到了一些问题,在此文章中进行记录总结。

目前,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

  • apache-maven-3.5.4
  • JDK 1.8

Maven的安装和配置比较简单,这里不做介绍。

源码项目默认使用的jdk版本一般和系统不一致,所以直接进行编译会报错,需要先修改项目的pom.xml文件。下载下来的Mahout源码是一个多模块的Maven项目,修改根目录下父级项目的pom.xml文件即可。

只需要将以下<javaVersion>1.6</javaVersion>中的1.6修改为自己电脑配置中的jdk版本即可。

  1. <properties>
  2. <skipTests>false</skipTests>
  3. <sourceJavaVersion>1.6</sourceJavaVersion>
  4. <targetJavaVersion>1.6</targetJavaVersion>
  5. <maven.clover.multiproject>true</maven.clover.multiproject>
  6. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  7. <hadoop.version>${cdh.hadoop.version}</hadoop.version>
  8. <lucene.version>3.6.0</lucene.version>
  9. <javaVersion>1.6</javaVersion>
  10. </properties>

直接执行mvn clean install报如下错误:

  1. [INFO] Apache Mahout 0.7-cdh4.7.1 ......................... SUCCESS [ 1.207 s]
  2. [INFO] Mahout Build Tools ................................. SUCCESS [ 1.475 s]
  3. [INFO] Mahout Math ........................................ SUCCESS [ 17.652 s]
  4. [INFO] Mahout Core ........................................ FAILURE [ 3.546 s]
  5. [INFO] Mahout Integration ................................. SKIPPED
  6. [INFO] Mahout Examples .................................... SKIPPED
  7. [INFO] Mahout Release Package 0.7-cdh4.7.1 ................ SKIPPED
  8. [INFO] ------------------------------------------------------------------------
  9. [INFO] BUILD FAILURE
  10. [INFO] ------------------------------------------------------------------------
  11. [INFO] Total time: 24.260 s
  12. [INFO] Finished at: 2018-12-12T16:07:19+08:00
  13. [INFO] ------------------------------------------------------------------------
  14. [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile (default-compile) on projec
  15. mahout-core: Compilation failure: Compilation failure:
  16. [ERROR] \mahout-cdh4-0.7_4.7.1\core\src\main\java\org\apache\mahout\clustering\classify\ClusterClassifier.java:[24,29]
  17. 错误: 程序包org.apache.hadoop.conf不存在
  18. [ERROR] \mahout-cdh4-0.7_4.7.1\core\src\main\java\org\apache\mahout\clustering\classify\ClusterClassifier.java:[25,27]
  19. 错误: 程序包org.apache.hadoop.fs不存在
  20. [ERROR] \mahout-cdh4-0.7_4.7.1\core\src\main\java\org\apache\mahout\clustering\classify\ClusterClassifier.java:[26,27]
  21. 错误: 程序包org.apache.hadoop.fs不存在
  22. [ERROR] \mahout-cdh4-0.7_4.7.1\core\src\main\java\org\apache\mahout\clustering\classify\ClusterClassifier.java:[27,27]
  23. 错误: 程序包org.apache.hadoop.io不存在
  24. [ERROR] \mahout-cdh4-0.7_4.7.1\core\src\main\java\org\apache\mahout\clustering\classify\ClusterClassifier.java:[28,27]
  25. 错误: 程序包org.apache.hadoop.io不存在
  26. [ERROR] \mahout-cdh4-0.7_4.7.1\core\src\main\java\org\apache\mahout\clustering\classify\ClusterClassifier.java:[29,27]
  27. 错误: 程序包org.apache.hadoop.io不存在
  28. [ERROR] \mahout-cdh4-0.7_4.7.1\core\src\main\java\org\apache\mahout\clustering\classify\ClusterClassifier.java:[30,27]
  29. 错误: 程序包org.apache.hadoop.io不存在
  30. [ERROR] \mahout-cdh4-0.7_4.7.1\core\src\main\java\org\apache\mahout\clustering\classify\ClusterClassifier.java:[65,90]
  31. 错误: 找不到符号
  32. [ERROR] \mahout-cdh4-0.7_4.7.1\core\src\main\java\org\apache\mahout\clustering\Model.java:[20,27] 错误: 程序包org.apach
  33. .hadoop.io不存在
  34. [ERROR] \mahout-cdh4-0.7_4.7.1\core\src\main\java\org\apache\mahout\clustering\Model.java:[29,34] 错误: 找不到符号
  35. .......

从报错信息中可以看到mahout-core模块编译失败,原因是找不到Hadoop的配置文件类,Hadoop配置文件类包含在hadoop-common的jar包中,查看core目录下的pom.xml文件,查找hadoop-commen发现已经有引入依赖,但是是在配置中引入,需要激活相应的配置。

  1. <profile>
  2. <id>hadoop-0.23</id>
  3. <activation>
  4. <property>
  5. <name>hadoop.profile</name>
  6. <value>23</value>
  7. </property>
  8. </activation>
  9. <dependencies>
  10. <dependency>
  11. <groupId>org.apache.hadoop</groupId>
  12. <artifactId>hadoop-common</artifactId>
  13. </dependency>
  14. <dependency>
  15. <groupId>org.apache.hadoop</groupId>
  16. <artifactId>hadoop-mapreduce-client-common</artifactId>
  17. </dependency>
  18. <dependency>
  19. <groupId>org.apache.hadoop</groupId>
  20. <artifactId>hadoop-mapreduce-client-core</artifactId>
  21. </dependency>
  22. </dependencies>
  23. </profile>

激活相应配置并编译源码,执行mvn -Phadoop-0.23 -DskipTests clean install,添加的-DskipTests参数为跳过测试模块,会节省编译时间。

编译成功后,在各自模块的/target目录下可以看到输出的jar包。

使用mvn eclipse:eclipse可以将Maven项目转化为eclipse项目在eclipse中进行修改。之前提到我们的需求是将输出结果输出到HBase,在修改工程代码的过程中需要引入第三方HBase的依赖jar包,修改完后代码后再次执行mvn clean install会再次报错,原因是Maven编译项目根据来进行的pom.xml,所以我们需要在配置文件中添加我们所依赖的第三方jar的信息。例如,依赖了hbasemr的jar包,添加依赖配置如下:

  1. <profile>
  2. <id>hadoop-0.23</id>
  3. <activation>
  4. <property>
  5. <name>hadoop.profile</name>
  6. <value>23</value>
  7. </property>
  8. </activation>
  9. <dependencies>
  10. <dependency>
  11. <groupId>org.apache.hadoop</groupId>
  12. <artifactId>hadoop-common</artifactId>
  13. </dependency>
  14. <dependency>
  15. <groupId>org.apache.hadoop</groupId>
  16. <artifactId>hadoop-mapreduce-client-common</artifactId>
  17. </dependency>
  18. <dependency>
  19. <groupId>org.apache.hadoop</groupId>
  20. <artifactId>hadoop-mapreduce-client-core</artifactId>
  21. </dependency>
  22. <dependency>
  23. <groupId>org.apache.hbase</groupId>
  24. <artifactId>hbase</artifactId>
  25. <version>0.94.15-cdh4.7.1</version>
  26. </dependency>
  27. </dependencies>
  28. </profile>

所依赖jar包的groupIdartifactId可以在Maven官网中查询,同时还可以获取到依赖包所在的仓库地址,查看根目录下的pom.xml,如果没包含此仓库则需要自行添加。

  1. <repositories>
  2. <repository>
  3. <id>cdh.hbase</id>
  4. <name>Apache Hbase Repository</name>
  5. <url>https://repository.cloudera.com/content/repositories/releases/</url>
  6. <releases>
  7. <enabled>false</enabled>
  8. </releases>
  9. </repository>
  10. <repository>
  11. <id>apache.snapshots</id>
  12. <name>Apache Snapshot Repository</name>
  13. <url>http://repository.apache.org/snapshots</url>
  14. <releases>
  15. <enabled>false</enabled>
  16. </releases>
  17. </repository>
  18. <repository>
  19. <id>cdh.repo</id>
  20. <url>https://repository.cloudera.com/artifactory/cloudera-repos</url>
  21. <name>Cloudera Repositories</name>
  22. <snapshots>
  23. <enabled>false</enabled>
  24. </snapshots>
  25. </repository>
  26. <repository>
  27. <id>cdh.snapshots.repo</id>
  28. <url>https://repository.cloudera.com/artifactory/libs-snapshot-local</url>
  29. <name>Cloudera Snapshots Repository</name>
  30. <snapshots>
  31. <enabled>true</enabled>
  32. </snapshots>
  33. <releases>
  34. <enabled>false</enabled>
  35. </releases>
  36. </repository>
  37. </repositories>

版权声明:本文为liminghuang原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/liminghuang/p/10109560.html