写在前面
源码的编译,可以让我们更好的理解源码。这里就来编译一下hadoop的源码,虽然过程十分繁琐,但还是有些许收货的。
开始前的准备
首先要准备一台干净的centos7的主机,要什么都没有,且能连接外网。
再准备好所有的jar包(JDK8,hadoop源码,maven,ant,protobuf),这里提供百度网盘链接 ,提取码为4oem,把这些jar包都下载到本地。
以下操作都在root用户下完成
把所有的gz包都上传到/opt/software目录下:
安装JDK
首先把JDK解压到/opt/module下:
tar -zxf jdk-8u144-linux-x64.tar.gz -C /opt/module/
接着编辑/etc/profile文件,配置环境变量(在文件末尾粘贴):
[root@hadoop06 apache-maven-3.0.5] vim /etc/profile
#JAVA_HOME:
export JAVA_HOME=/opt/module/jdk1.8.0_144
export PATH=$PATH:$JAVA_HOME/bin
# 更新配置文件
[root@hadoop06 apache-maven-3.0.5] source /etc/profile
输入命令检查是否安装成功:
java -version
如果能显示出版本信息,说明jdk配置成功了。
配置maven
首先把maven的包解压到/opt/module目录下:
tar -zxvf apache-maven-3.0.5-bin.tar.gz -C /opt/module/
接着进入maven目录,编辑conf/setting.xml里的文件:
cd /opt/module/apache-maven-3.0.5
vim conf/setting.xml
添加阿里云镜像:
<mirrors>
<!-- mirror
| Specifies a repository mirror site to use instead of a given repository. The repository that
| this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
| for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
|
<mirror>
<id>mirrorId</id>
<mirrorOf>repositoryId</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://my.repository.com/repo/path</url>
</mirror>
-->
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
注意看准了,是在mirros标签下添加。
之后再编辑一下/etc/profile文件,配置环境变量(在文件末尾粘贴):
[root@hadoop06 apache-maven-3.0.5] vim /etc/profile
#MAVEN_HOME
export MAVEN_HOME=/opt/module/apache-maven-3.0.5
export PATH=$PATH:$MAVEN_HOME/bin
[root@hadoop06 apache-maven-3.0.5] source /etc/profile
输入mvn -version查看是否有版本信息输出,如果有则配置完成。
配置ant
首先还是解压到/opt/module目录下:
tar -zxvf apache-ant-1.9.9-bin.tar.gz -C /opt/module/
接着打开/etc/profile,配置环境变量:
[root@hadoop06 apache-ant-1.9.9] vim /etc/profile
#ANT_HOME
export ANT_HOME=/opt/module/apache-ant-1.9.9
export PATH=$PATH:$ANT_HOME/bin
[root@hadoop06 apache-ant-1.9.9] source /etc/profile
接着输入命令检验是否安装成功:
ant -version
安装glibc-headers和 g++
直接使用yum命令安装:
yum install glibc-headers
yum install gcc-c++
安装make和cmake
同样使用yum命令安装:
yum install make
yum install cmake
安装protobuf
还是先解压到/opt/module目录下:
tar -zxvf protobuf-2.5.0.tar.gz -C /opt/module/
接着进入该目录,进行安装:
[root@hadoop06 apache-ant-1.9.9] cd /opt/module/protobuf-2.5.0/
[root@hadoop06 protobuf-2.5.0] ./configure
[root@hadoop06 protobuf-2.5.0] make
[root@hadoop06 protobuf-2.5.0] make check
[root@hadoop06 protobuf-2.5.0] make install
[root@hadoop06 protobuf-2.5.0] ldconfig
最后,编辑/etc/profile文件,在文件末尾添加配置:
[root@hadoop06 protobuf-2.5.0] vim /etc/profile
#LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/opt/module/protobuf-2.5.0
export PATH=$PATH:$LD_LIBRARY_PATH
[root@hadoop06 protobuf-2.5.0] source /etc/profile
使用命令校验是否安装成功:
protoc --version
安装openssl库与ncurses-devel库
直接使用yum命令安装:
yum install openssl-devel
yum install ncurses-devel
到此,前期准备工作就完成了。
编译源码
首先把源码解压到/opt目录:
tar -zxvf hadoop-2.7.2-src.tar.gz -C /opt/
进入到源码目录,输入maven命令执行编译:
[root@hadoop06 apache-maven-3.0.5] cd /opt/hadoop-2.7.2-src/
[root@hadoop06 hadoop-2.7.2-src] mvn package -Pdist,native -DskipTests -Dtar
接下来就会开始源码编译,但这个过程会很漫长。我自己是编译了大概一个小时,这都取决于网速和配置等等因素。
最后,编译成功的包在:/opt/hadoop-2.7.2-src/hadoop-dist/target/下:
常见问题
-
maven install的时候JVM内存溢出:
在配置文件和maven的执行文件都可以调整MAVEN_OPT的heap大小。
-
编译期间maven报错,可能是网不好导致的问题,多次执行命令:
mvn package -Pdist,nativeN -DskipTests -Dtar
总结
总的来说,也算体验了一把编译源码啊,虽然过程失败了三四次,但最后编译成功的时候还是蛮有成就感的。