在Ubuntu 13.04上编译Hadoop2.2.0源码

注:此文所有操作均是以root用户操作执行。本教程不是告诉你一帆风顺的编译Hadoop,而是通过每次的构建根据报错信息,去加深你的印象。如想快速的成功编译,建议先通读一遍本文,在着手操作。该操作指南完全是一步一步从零开始编译Hadoop2.2.0源码,根据编译报出的错误信息然后去修复错误,加深印象。

在开始编译前,确保已经正确安装了java、maven、ant并且配置好环境变量可以正常工作,那么接下来你就可以以root身份依照该步骤从零开始一步一步编译安装Hadoop2.2.0了。

http://wiki.apache.org/hadoop/HowToContribute

安装编译的依赖项

On Linux, you need the tools to create the native libraries.

For RHEL (and hence also CentOS):

yum -y install  lzo-devel  zlib-devel  gcc autoconf automake libtool

For Debian and Ubuntu:

apt-get -y install maven build-essential autoconf automake libtool cmake zlib1g-dev pkg-config libssl-dev

下载源码

wget http://mirror.bit.edu.cn/apache/hadoop/common/stable/hadoop-2.2.0-src.tar.gz

查看Ubuntu版本

cat /etc/os-release

查看Ubuntu系统位数

uname -a

检查mvn和java环境

mvn -version

检查ant环境

ant -version

执行mvn package -DskipTests -Pdist,native -Dtar -X

mvn package -DskipTests -Pdist,native -Dtar -X

报以下错误:

从上图选中部分不难看出,需要给hadoop打补丁。

https://issues.apache.org/jira/browse/HADOOP-10110

具体补丁信息:https://issues.apache.org/jira/secure/attachment/12614482/HADOOP-10110.patch

编辑hadoop-common-project/hadoop-auth/pom.xml文件

Index: hadoop-common-project/hadoop-auth/pom.xml
===================================================================
--- hadoop-common-project/hadoop-auth/pom.xml (revision 1543124)
+++ hadoop-common-project/hadoop-auth/pom.xml (working copy)
@@ -54,6 +54,11 @@
</dependency>
<dependency>
<groupId>org.mortbay.jetty</groupId>
+ <artifactId>jetty-util</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.mortbay.jetty</groupId>
<artifactId>jetty</artifactId>
<scope>test</scope>
</dependency>

通俗了讲就是在hadoop-2.2.0-src/hadoop-common-project/hadoop-auth/pom.xml文件中添加jetty-util依赖

<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-util</artifactId>
<scope>test</scope>
</dependency>

编辑hadoop-2.2.0-src/hadoop-common-project/hadoop-auth/pom.xml文件

vim hadoop-2.2.0-src/hadoop-common-project/hadoop-auth/pom.xml

在上述pom中添加以下的依赖

<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-util</artifactId>
<scope>test</scope>
</dependency>

添加后的效果

或者使用patch命令直接打补丁

再次执行mvn package -DskipTests -Pdist,native -Dtar -X命令

又报错了,错误信息还是很明显

hadoop在编译的时候需要使用libprotoc 2.5.0,当前libprotoc 版本为2.4.1。
那么安装之

http://protobuf.googlecode.com/files/protobuf-2.5.0.tar.gz

$ wget https://protobuf.googlecode.com/files/protobuf-2.5.0.tar.gz
$ tar zxvf protobuf-2.5.0.tar.gz
$ cd protobuf-2.5.0
$ ./configure
$ make && make install

再次执行mvn package -DskipTests -Pdist,native -Dtar -X命令


发现又报错了,这次错误信息很少,不是很明显。但我们根据错误信息可以看出该错误又发生在hadoop-common模块中。且该错误是执行protoc的时候出问题了,还记得我们之前刚刚安装了protobuf 2.5.0.我们试着来检查下

protoc -version

发现了这个错误

protoc: error while loading shared libraries: libprotoc.so.8: cannot open shared object file: No such file or directory

很显然找不到libprotoc.so.8这个类库么
我们先来检查下protoc安装到了什么地方

ls -lah | type -P protoc
/usr/local/bin/protoc

发现输出为/usr/local/bin/protoc
这是由于我们安装的时候全不默认配置,Ubuntu中protobuf默认安装后的lib在/usr/local/lib目录下
这是因为没有把动态链接库的安装路径(例如说是 /usr/local/lib )放到变量 LD_LIBRARY_PATH 里。
使用如下命令将/usr/local/lib附加到LD_LIBRARY_PATH里

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

执行env 查看设置是否生效

env

再次验证protoc版本

protoc -version

再次执行mvn package -DskipTests -Pdist,native -Dtar -X命令

经过漫长的等待终于编译完成。

查看编译好的源码

最终编译好的hadoop在hadoop-2.2.0-src/hadoop-dist/target目录下

参考文章

http://www.micmiu.com/bigdata/hadoop/hadoop-build-source-2-2-0/
http://cn.soulmachine.me/blog/20140214/
http://my.oschina.net/yiyuqiuchi/blog/188510
http://www.cnblogs.com/waterlin/archive/2011/07/14/2106056.html
http://lookqlp.iteye.com/blog/1962415
http://blog.csdn.net/liuxuejiang158blog/article/details/15028341