本人因为实验需要用到Hadoop-0.21版本中Hadoop的LATE推测执行算法,所以就对Hadoop-0.21的源代码进行了编译。下面介绍编译的过程:
实验环境
软件 | 版本 |
---|---|
操作系统 | ubuntu-14.04.4-desktop-i386 |
hadoop源代码 | hadoop-common-branch-0.21.zip |
hadoop发布版 | hadoop-0.21 |
jdk | jdk1.7.0_80 |
ant | apache-ant-1.9.6 |
其中hadoop源代码是从hadoop的github地址上下载的:https://github.com/apache/hadoop/tree/branch-0.21
hadoop-0.21使用ant+ivy进行项目管理的,所以需要安装ant。
上述软件自己想办法安装。
编译
hadoop-0.21的源代码只有common,hdfs,mapreduce三个目录。编译的方法很简单,想编译哪个模块就进行到对应的目录中执行 ant
命令即可。
但mapreduce模块编译的时候出现了一个错误:
[javac] /home/dave/workDir/hadoop-common-branch-0.21/mapreduce/src/java/org/apache/hadoop/util/MemoryCalculatorPlugin.java:39: 错误: 名称冲突: org.apache.hadoop.util.MemoryCalculatorPlugin 中的 getMemoryCalculatorPlugin(Class<? extends org.apache.hadoop.util.MemoryCalculatorPlugin>,Configuration) 和 org.apache.hadoop.mapreduce.util.MemoryCalculatorPlugin 中的 getMemoryCalculatorPlugin(Class<? extends org.apache.hadoop.mapreduce.util.MemoryCalculatorPlugin>,Configuration) 具有相同疑符, 但两者均不隐藏对方
[javac] public static MemoryCalculatorPlugin getMemoryCalculatorPlugin(
[javac] ^
[javac] 注: 某些输入文件使用或覆盖了已过时的 API。
[javac] 注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。
[javac] 1 个错误
[javac] 1 个警告
从上述错误提示中可以看到,两个类有冲突。删掉org.apache.hadoop.util.MemoryCalculatorPlugin.java这个类即可。重新编译mapreduce模块,successful!。
导入eclipse
本人只需要用到mapreduce相关代码,所以只将mapreduce导入到eclipse中。
1. ant eclipse-file
。首先在mapreduce目录下执行该命令,即可File -> import导入存在的工程到eclipse中了。
2. 导入后发现eclipse提示有错误。将发布版的hadoop-0.21解压,将hadoop-0.21目录和hadoop-0.21/lib目录内的所有jar包导入工程中。错误全部消失。
结尾
至此,hadoop-0.21源代码的编译及阅读环境都搭建成功。现在可以对源代码进行二次开发,然后编译。将修改了代码重新打包的jar包,替换掉hadoop发布版中对应的jar包,即可使hadoop按照你修改后的方式运行。