Maven编译并打包Mahout CDH版源码
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的信息。例如,依赖了hbase和mr的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包的groupId和artifactId可以在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版源码的更多相关文章
- atitit.商业版 源码保护 与 java本地原生代码转换 的方案总结
atitit.商业版 源码保护 与 java本地原生代码转换 的方案总结 1. 为什么虚拟机语言容易被反编译 1 2. 源码泄露的问题问题 1 3. Excelsior JET 1 4. gcj.的流 ...
- [源码]一键获取windows系统登陆密码vc6版源码
[源码]一键获取windows系统登陆密码vc6版源码支持:XP/2000/2003/WIN7/2008等 此版本编译出来的程序体积较小几十KB... 而vs版则1点几M,体积整整大了2-30倍对某些 ...
- 运行OpenGL红宝书第9版源码时Visual Studio提示“无法启动程序...ALL_BUILD。拒绝访问“的问题的解决办法
问题描述: OpenGL红宝书第9版源码采用CMake编译后,用相应的Visual Studio(如VS2012)打开“vermilion9.sln”解决方案,并运行时Visual Studio提示“ ...
- 完美高仿精仿京东商城手机客户端android版源码
完美高仿精仿京东商城手机客户端android版源码,是从安卓教程网那边转载过来的,这款应用源码非常不错的,也是一个非常优秀的应用源码的,希望能够帮到学习的朋友. _js_op> <igno ...
- 锋利的jQuery(第二版)源码下载地址
书上给的http://cssrain.sinaapp.com无法访问 问作者邮箱要的: 第1版源码:百度云盘下载:http://pan.baidu.com/share/link?shareid=104 ...
- ue4.3正式版源码链接
ue4.3正式版源码链接 http://tieba.baidu.com/p/3170253742
- 大写金额换算器iOS版源码
大写金额换算器iOS版源码 人民币金额大写转换器输入数字就可以转换成相应的人民币大写金额,操作很easy,需一键点击,就可以复制. 是財务办公人员必备的小工具. 银行.单位和个人填写的各种票据和结算凭 ...
- ubuntu 14.04.5 编译Android 4.4.4 r1源码(最新)
本文博客链接:http://blog.csdn.net/qq1084283172/article/details/54426189 吐槽:ubuntu系统真是让人又爱又恨,也有可能是VMware Wo ...
- apache kafka & CDH kafka源码编译
Apache kafka编译 前言 github网站kafka项目的README.md有关于kafka源码编译的说明 github地址:https://github.com/apache/kafka ...
随机推荐
- springboot问题集(一)------junit内Assert.assertEquals()的含义
1. assertEquals([String message],Object target,Object result) target与result不相等,中断测试方法,输出message asse ...
- 蓝桥杯练习系统历届试题 剪格子 dfs
问题描述 如下图所示,3 x 3 的格子中填写了一些整数. +--*--+--+|10* 1|52|+--****--+|20|30* 1|*******--+| 1| 2| 3|+--+--+--+ ...
- 如何处理HTML5新标签的兼容性问题
支持HTML5新标签: * IE8/IE7/IE6支持通过document.createElement方法产生的标签, 可以利用这一特性让这些浏览器支持HTML5新标签, 浏览器支持新标签后,还需要添 ...
- CF 920
t1 随便乱搞 t2 随便乱搞 然后wa了三发,QAQ t3 随便乱搞 t4 邻接表+堆 对进出进行一个统计 然后时间到了...
- OMAP4之DSP核(Tesla)软件开发学习(三)使能DSP核
目标: 1.编译或直接获取DSP映像tesla-dsp.bin. 2.boot并使能DSP核(这个可以看启动打印或者进入/d/remoteproc/omap-rproc.0/参看dsp调试信息). ...
- 'mysql'不是内部或外部命令,也不是可运行的程序或批处理文件.
'mysql'不是内部或外部命令,也不是可运行的程序或批处理文件. 今天中午新换了一个系统,重装了一下wampserver2.2.下午想导入一个数据库文件打开dos,输入MySQL -u root - ...
- tensorflow中共享变量 tf.get_variable 和命名空间 tf.variable_scope
tensorflow中有很多需要变量共享的场合,比如在多个GPU上训练网络时网络参数和训练数据就需要共享. tf通过 tf.get_variable() 可以建立或者获取一个共享的变量. tf.get ...
- Windows环境下 PyQt5 如何安装MySql驱动 (PyQt5连接MYSQL时显示Driver not loaded解决方案)
参考文章: https://blog.csdn.net/qq_38198744/article/details/80261695 前文说过如何在Ubuntu环境下 为PyQt5 安装MySql驱动, ...
- 《Java技术》预备作业总结
Java预备作业总结 第一次的博客作业完成了,对于一种崭新的形式,大家可能还不太适应,学习和借鉴好的理念和学习方式,是我们缩小差距.提升自己的第一步. 关于你期望的师生关系 从幼儿园到大学,大家接触到 ...
- 重新学习Spring之核心IOC容器的底层原理
一:IOC容器的定义 控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心. 控制反转一般 ...