mac 下编译hadoop源码

本篇博客主要介绍社区版的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 ...... @ 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 ...... @ 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源码,直接编译源码有以下优点:

  1. 通过git的branch和tag,可以很方便的切换版本
  2. 在学习hadoop源码的过程中,免不了要打一些日志来加深对一些功能模块的理解,这时候免不了就要对源码进行重新编译
  3. 改造源码也必须要学会如何编译

最后,编译源码其实不难,编译过程中遇到的一些问题其实大多数都可以解决。

你可能感兴趣的:(mac 下编译hadoop源码)