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文件即可。

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

<properties>
<skipTests>false</skipTests>
<sourceJavaVersion>1.6</sourceJavaVersion>
<targetJavaVersion>1.6</targetJavaVersion>
<maven.clover.multiproject>true</maven.clover.multiproject>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<hadoop.version>${cdh.hadoop.version}</hadoop.version>
<lucene.version>3.6.0</lucene.version>
<javaVersion>1.6</javaVersion>
</properties>
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发现已经有引入依赖,但是是在配置中引入,需要激活相应的配置。

<profile>
<id>hadoop-0.23</id>
<activation>
<property>
<name>hadoop.profile</name>
<value>23</value>
</property>
</activation>
<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-mapreduce-client-common</artifactId>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-mapreduce-client-core</artifactId>
</dependency>
</dependencies>
</profile>

激活相应配置并编译源码,执行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的信息。例如,依赖了hbasemr的jar包,添加依赖配置如下:

<profile>
<id>hadoop-0.23</id>
<activation>
<property>
<name>hadoop.profile</name>
<value>23</value>
</property>
</activation>
<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-mapreduce-client-common</artifactId>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-mapreduce-client-core</artifactId>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase</artifactId>
<version>0.94.15-cdh4.7.1</version>
</dependency>
</dependencies>
</profile>

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

<repositories>
<repository>
<id>cdh.hbase</id>
<name>Apache Hbase Repository</name>
<url>https://repository.cloudera.com/content/repositories/releases/</url>
<releases>
<enabled>false</enabled>
</releases>
</repository>
<repository>
<id>apache.snapshots</id>
<name>Apache Snapshot Repository</name>
<url>http://repository.apache.org/snapshots</url>
<releases>
<enabled>false</enabled>
</releases>
</repository> <repository>
<id>cdh.repo</id>
<url>https://repository.cloudera.com/artifactory/cloudera-repos</url>
<name>Cloudera Repositories</name>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository> <repository>
<id>cdh.snapshots.repo</id>
<url>https://repository.cloudera.com/artifactory/libs-snapshot-local</url>
<name>Cloudera Snapshots Repository</name>
<snapshots>
<enabled>true</enabled>
</snapshots>
<releases>
<enabled>false</enabled>
</releases>
</repository>
</repositories>

Maven编译并打包Mahout CDH版源码的更多相关文章

  1. atitit.商业版 源码保护 与 java本地原生代码转换 的方案总结

    atitit.商业版 源码保护 与 java本地原生代码转换 的方案总结 1. 为什么虚拟机语言容易被反编译 1 2. 源码泄露的问题问题 1 3. Excelsior JET 1 4. gcj.的流 ...

  2. [源码]一键获取windows系统登陆密码vc6版源码

    [源码]一键获取windows系统登陆密码vc6版源码支持:XP/2000/2003/WIN7/2008等 此版本编译出来的程序体积较小几十KB... 而vs版则1点几M,体积整整大了2-30倍对某些 ...

  3. 运行OpenGL红宝书第9版源码时Visual Studio提示“无法启动程序...ALL_BUILD。拒绝访问“的问题的解决办法

    问题描述: OpenGL红宝书第9版源码采用CMake编译后,用相应的Visual Studio(如VS2012)打开“vermilion9.sln”解决方案,并运行时Visual Studio提示“ ...

  4. 完美高仿精仿京东商城手机客户端android版源码

    完美高仿精仿京东商城手机客户端android版源码,是从安卓教程网那边转载过来的,这款应用源码非常不错的,也是一个非常优秀的应用源码的,希望能够帮到学习的朋友. _js_op> <igno ...

  5. 锋利的jQuery(第二版)源码下载地址

    书上给的http://cssrain.sinaapp.com无法访问 问作者邮箱要的: 第1版源码:百度云盘下载:http://pan.baidu.com/share/link?shareid=104 ...

  6. ue4.3正式版源码链接

    ue4.3正式版源码链接 http://tieba.baidu.com/p/3170253742

  7. 大写金额换算器iOS版源码

    大写金额换算器iOS版源码 人民币金额大写转换器输入数字就可以转换成相应的人民币大写金额,操作很easy,需一键点击,就可以复制. 是財务办公人员必备的小工具. 银行.单位和个人填写的各种票据和结算凭 ...

  8. ubuntu 14.04.5 编译Android 4.4.4 r1源码(最新)

    本文博客链接:http://blog.csdn.net/qq1084283172/article/details/54426189 吐槽:ubuntu系统真是让人又爱又恨,也有可能是VMware Wo ...

  9. apache kafka & CDH kafka源码编译

    Apache kafka编译 前言 github网站kafka项目的README.md有关于kafka源码编译的说明 github地址:https://github.com/apache/kafka ...

随机推荐

  1. java并发编程:线程安全管理类--原子操作类--AtomicBoolean

    1.类AtomicBoolean

  2. BZOJ1555 KD之死

    如果没有必选的限制条件,就是水题了... 只要按照w + t排序就可以了,然后搞个堆来维护 于是有了限制条件,还是水题... 到了必选的时候强制选上,不加入堆中即可. /*************** ...

  3. Linux:有趣的命令(更新)

    有趣的命令 oneko命令 执行后会有一只小猫跟着鼠标跑 yum install -y oneko oneko 鼠标拖动那只猫 取消Ctrl+c sl命令 执行后有一火车跑过 yum install ...

  4. PyalgoTrade 打印收盘价(二)

    让我们从一个简单的策略开始,就是在打印收盘价格的过程中: from pyalgotrade import strategy from pyalgotrade.barfeed import yahoof ...

  5. PyQt4 HardwareManager

    # PyQt4 HardwareManager # 声明: # 本软件主要是由于朋友说想要一个产品缺陷记录软件,主要用于记录产品缺陷, # 通过产品序列号进行插入.查询,本来想用VC++ 6.0做,但 ...

  6. leisure time

    终于把论文翻译完了,天哪,现在感觉解脱一般. 这些天看电视,玩游戏,也不止学了写什么,现在调整了下心情,重新确定下目标吧. 最近很想学Python和Qt,哎,技术永远都是学不完了,理解操作系统和组成原 ...

  7. html css 怎么使img和a标签在一个行内元素中间对齐

    答案是:#box ul.games li img{vertical-align: middle;} 这行很重要哦. <div id="box"> <div cla ...

  8. 关于mybatis中一级缓存和二级缓存的简单介绍

    关于mybatis中一级缓存和二级缓存的简单介绍 mybatis的一级缓存: MyBatis会在表示会话的SqlSession对象中建立一个简单的缓存,将每次查询到的结果结果缓存起来,当下次查询的时候 ...

  9. Apache Commons Codec 与消息摘要算法(hash算法)

    首先我们要明白 Codec 是什么含义.它是 Coder + decoder = Codec,也就是编码器解码器.即是编码器,也是解码器. 官网地址:http://commons.apache.org ...

  10. 黄聪:360浏览器、chrome开发扩展插件教程(1)开发Chrome Extenstion其实很简单

    转载:http://www.cnblogs.com/walkingp/archive/2011/03/31/2001628.html Chrome的更新速度可以说前无古人,现在我每天开机的第一件事就是 ...