本篇博客主要介绍社区版的hadoop源码的编译,以及会遇到的一些问题。
一、获取hadoop源码
可以通过hadoop的官网获取hadoop相关源码包:https://hadoop.apache.org/releases.html。或者直接通过git去github拉取最新的源码:
git clone https://github.com/apache/hadoop
# 拉完代码后进入源码目录
cd hadoop
# 通过git tag查看所有的版本
git tag
# 切到目标版本
git checkout release-2.9.0-RC1
建议通过git获取源码,到时要切换版本很方便,并且git上面的代码一般都是最新的。
二、编译源码
获取对应版本的源码后,就可以开始编译源码了。hadoop的源码是由maven来管理的,因此我们通过mvn的相关命令来编译源码,电脑上没有maven的同学请自行安装maven,这里就不多做介绍。
# maven.javadoc.skip=true 记得要加,否则maven的javadoc插件会报错导致编译失败
mvn clean package -Pdist,native -DskipTests -Dtar -Dmaven.javadoc.skip=true
第一编译时可能需要下载一些依赖,因此时间比较久,请耐心等待。如果编译报错了,请看下面的常见问题列表。下面只是我目前遇到的一些问题,如果你遇到了一些其他的编译问题,可以在下方评论或者联系我,我会定期更新问题列表。
编译常见问题列表
1. protoc版本问题
在编译时,如果mac上的版本不是2.5.0的话,就会编译出错,这时我们只能重新编译安装protoc,把protoc的版本变成2.5.0后再来编译hadoop。
# 获取2.5.0的源码包。mac上没有wget的通过可以通过 brew install wget 安装
wget https://protobuf.googlecode.com/files/protobuf-2.5.0.tar.bz2
# 解压
tar xfvj protobuf-2.5.0.tar.bz2
# 进入源码目录
cd protobuf-2.5.0
# 可以使用 --prefix="/path/xxx" 来指定安装路径
./configure CC=clang CXX=clang++ CXXFLAGS='-std=c++11 -stdlib=libc++ -O3 -g' LDFLAGS='-stdlib=libc++' LIBS="-lc++ -lc++abi"
# 编译
make -j 4
sudo make install
最后通过protoc --version
查看protoc版本是否是2.5.0了。
2. cmake 相关错误
hadoop编译时需要用到cmake
,mac本身是没有这个命令的。我们可以通过brew安装一下:
brew install cmake
安装完cmake之后再去编译发现还是会报错误:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-antrun-plugin:1.7:run (make) on project hadoop-pipes: An Ant BuildException has occured: exec returned: 1
[ERROR] around Ant part ...<exec failonerror="true" dir="/Users/yangjb/IdeaProjects/hadoop/hadoop-tools/hadoop-pipes/target/native" executable="cmake">... @ 5:127 in /Users/yangjb/IdeaProjects/hadoop/hadoop-tools/hadoop-pipes/target/antrun/build-main.xml
看maven的出错信息我们看不出到底错在哪了,但是知道它是在编译"/Users/yangjb/IdeaProjects/hadoop/hadoop-tools/hadoop-pipes/target/native"时报错的,因此我们可以自己手动编译一下换个看看再具体的出错信息:
cmake /Users/yangjb/IdeaProjects/hadoop/hadoop-tools/hadoop-pipes/src/ -DJVM_ARCH_DATA_MODEL=64
发现报以下错误:
CMake Error at /usr/local/Cellar/cmake/3.13.2/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:137 (message):
Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the
system variable OPENSSL_ROOT_DIR (missing: OPENSSL_INCLUDE_DIR)
这里提示就很明朗了,没有设置openssl的环境变量OPENSSL_ROOT_DIR
。我查了下我本机的openssl安装路径是/usr/local/opt/openssl
,因此在环境变量文件中加入一下信息:
export OPENSSL_ROOT_DIR="/usr/local/opt/openssl"
由于我的终端安装了zsh,所以我的个人环境变量文件是在~/.zshrc
。没有安装zsh可以直接编译~/.bash_profile
vim ~/.zshrc # 之后在文本最后加入上面那句export...后退出
# 使刚才的修改生效
source ~/.zshrc
之后再编译hadoop就不会报类似错误了。
3. 下载tomcat失败
hadoop在编译过程中会去下载tomcat,由于我们国内连接境外服务器的网络经常不稳定,经常会出现连接超时的问题,出现以下错误:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-antrun-plugin:1.7:run (dist) on project hadoop-hdfs-httpfs: An Ant BuildException has occured: Can't get http://archive.apache.org/dist/tomcat/tomcat-6/v6.0.41/bin/apache-tomcat-6.0.41.tar.gz to /Users/yangjb/IdeaProjects/hadoop/hadoop-hdfs-project/hadoop-hdfs-httpfs/downloads/apache-tomcat-6.0.41.tar.gz
[ERROR] around Ant part ...<get skipexisting="true" src="http://archive.apache.org/dist/tomcat/tomcat-6/v6.0.41/bin/apache-tomcat-6.0.41.tar.gz" dest="downloads/apache-tomcat-6.0.41.tar.gz" verbose="true"/>... @ 5:182 in /Users/yangjb/IdeaProjects/hadoop/hadoop-hdfs-project/hadoop-hdfs-httpfs/target/antrun/build-main.xml
上错误的信息,这里ant配置任务是把下载的tomcat包放到downloads/
目录下,如果之前已经有了,hadoop在编译时就不会再去下载了。所以我们可以手动去下载这个版本的tomcat包,然后放到downloads/
目录下。
# 通过wget直接获取,或者去tomcat官网获取
wget http://archive.apache.org/dist/tomcat/tomcat-6/v6.0.41/bin/apache-tomcat-6.0.41.tar.gz
# 放到指定的路径下
mv apache-tomcat-6.0.41.tar.gz hadoop-common-project/hadoop-kms/downloads/
这样下次编译的时候就不会再去下载tomcat包了
三、总结
虽然hadoop已经提供了各个版本的二进制包可以直接安装,但是个人觉的我们还是应该掌握如何编译hadoop源码,直接编译源码有以下优点:
- 通过git的branch和tag,可以很方便的切换版本
- 在学习hadoop源码的过程中,免不了要打一些日志来加深对一些功能模块的理解,这时候免不了就要对源码进行重新编译
- 改造源码也必须要学会如何编译
最后,编译源码其实不难,编译过程中遇到的一些问题其实大多数都可以解决。
网友评论