hadoop是一个分布式存储和分布式计算的框架。在日常使用hadoop时,我们会发现hadoop不能完全满足我们的需要,我们可能需要修改hadoop的源代码并重新编译、打包。
下面将详细描述如何从svn上导入并对hadoop进行eclipse下编译。
因项目使用的hadoop版本是0.20.2,所以我们基于hadoop-0.20.2来进行二次开发。
(1)首先从svn上签出源代码,svn地址:
- http://svn.apache.org/repos/asf/hadoop/common/tags/release-0.20.2/
(2)在下载的过程中,准备开发和编译环境。windows下至少需要安装如下软件:
- JDK 6--需要设置PATH环境变量
- ant
- --下载解压后,需要将ant的bin目录添加到PATH的环境变量上
- cygwin
- --安装cygwin参考http://ebiquity.umbc.edu/Tutorials/Hadoop/03%20-%20Prerequistes.html 进行安装和配置。在选择cygwin的安装包尽量多选,以方便日后的开发
安装好之后,需要将Ant 和Cygwin 的bin 目录加入到环境变量PATH 中,如下图所示:
(3)从svn签出后,使用命令行进入hadoop下载的HOME目录,执行命令:
- $ ant
此时,ant开始下载依赖和编译文件。 我在编译的时候编译错误。经查,是$hadoop_home/src/saveVersion.sh生成的package-info.java有问题,导致无法编译过去。将saveVersion.sh修改一下:
- unset LANG
- unset LC_CTYPE
- version=$1
- user=`whoami` #此处修改成固定值,如jbm3072
- date=`date`
- if [ -d .git ]; then
- revision=`git log -1 --pretty=format:"%H"`
- hostname=`hostname`
- branch=`git branch | sed -n -e 's/^* //p'`
- url="git://$hostname/$cwd on branch $branch"
- else
- revision=`svn info | sed -n -e 's/Last Changed Rev: \(.*\)/\1/p'`
- url=`svn info | sed -n -e 's/URL: \(.*\)/\1/p'`
- fi
- mkdir -p build/src/org/apache/hadoop
- cat << EOF | \
- sed -e "s/VERSION/$version/" -e "s/USER/$user/" -e "s/DATE/$date/" \
- -e "s|URL|$url|" -e "s/REV/$revision/" \
- > build/src/org/apache/hadoop/package-info.java
- /*
- * Generated by src/saveVersion.sh
- */
- @HadoopVersionAnnotation(version="VERSION", revision="REV",
- user="USER", date="DATE", url="URL")
- package org.apache.hadoop;
- EOF
修改后,应该就可以编译通过了。
(4) 将eclipse-files copy到工程目录下
执行命令:
- ant eclipse-files
就可以将eclipse-files copy到工程目录下。
(5)导入工程
打开eclipse,在File中选择Import,然后选择General->Exsiting Projects into Workspace, 点击next,然后选择Hadoop源代码目录,此时就可以识别hadoop为eclipse工程了,点击Finish,稍过片刻,一个没有错误的eclipse 工程就OK了。
(6)现在你就可以基于eclipse来进行修改hadoop源代码了。
搭建HADOOP便宜环境的时候,报错:
compile-core-classes:
[javac] Compiling 386 source files to F:\hadoop\common\trunk\build\classes
[javac] F:\hadoop\common\trunk\build\src\org\apache\hadoop\package-info.java:5: 未结束的字符串字面值
[javac] user="boliang-pcboliang
[javac] ^
[javac] F:\hadoop\common\trunk\build\src\org\apache\hadoop\package-info.java:6: 需要为 class、interface 或 enum
[javac] ", date="Sun Jun 27 09:16:51 2010", url="file:///cygdrive/f/hadoop/common/trunk",
[javac] ^
[javac] F:\hadoop\common\trunk\build\src\org\apache\hadoop\package-info.java:6: 需要为 class、interface 或 enum
[javac] ", date="Sun Jun 27 09:16:51 2010", url="file:///cygdrive/f/hadoop/common/trunk",
[javac] ^
[javac] 3 错误
解决办法:
打开build.XML,注释掉
<exec executable="sh">
<arg line="src/saveVersion.sh ${version} ${build.dir}"/>
</exec>
部分 注释掉自动生成package-info.java
这样就解决问题了。
由于直接ant package时,会进行java5.check和forrest.check,会报错,导致如下的报错:
java5.check:
BUILD FAILED
/opt/hadoop-history/hadoop-0.20.2/build.xml:908: 'java5.home' is not defined. Forrest requires Java 5. Please pass -Djava5.home=<base of Java 5 distribution> to Ant on the command-line.
因此这里我们的做法是对$HADOOP_HOME目录下的build.xml文件进行修改,两句注释掉,修改成如下所示:
<target name="forrest.check" unless="forrest.home" depends="java5.check">
<!--fail message="'forrest.home' is not defined. Please pass -Dforrest.home=<base of Apache Forrest installation> to Ant on the command-line." /-->
</target>
<target name="java5.check" unless="java5.home">
<!--fail message="'java5.home' is not defined. Forrest requires Java 5. Please pass -Djava5.home=<base of Java 5 distribution> to Ant on the command-line." /-->
</target>