编译源码最好是在linux平台,此处用CentOS 7.4平台编译源码
使用root用户编译
所有软件压缩包,放到**/opt/apps**目录
将hadoop-2.7.0-src.tar.gz源码包放到/opt目录下
将源码包解压到/opt目录
[root@node-01 opt]# cd /opt/
[root@node-01 opt]# tar -xzvf hadoop-2.7.0-src.tar.gz
进入解压出来的目录
[root@node-01 opt]# cd hadoop-2.7.0-src/
[root@node-01 hadoop-2.7.0-src]# ls
BUILDING.txt文件是编译hadoop源码的说明文件;打开文件,列出了编译hadoop源码时,要求软件及对应版本要求
要求在Unix系统下编译
要求版本:JDK1.7+
确定JDK是否已经安装,要求JDK1.7或以上版本
若已经安装非系统自带的openjdk且是版本符合要求,则略过步骤“安装JDK”;运行下边命令进行确认
[root@node-01 jdk1.8.0_201]# java -version
java version "1.8.0_201"
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)
(使用root用户)卸载系统自带的openjdk
[root@node-01 ~]# rpm -qa |grep java
python-javapackages-3.4.1-11.el7.noarch
java-1.8.0-openjdk-headless-1.8.0.161-2.b14.el7.x86_64
tzdata-java-2018c-1.el7.noarch
java-1.7.0-openjdk-1.7.0.171-2.6.13.2.el7.x86_64
java-1.8.0-openjdk-1.8.0.161-2.b14.el7.x86_64
javapackages-tools-3.4.1-11.el7.noarch
java-1.7.0-openjdk-headless-1.7.0.171-2.6.13.2.el7.x86_64
忽略依赖卸载查询到的openjdk相关包
rpm -e --nodeps python-javapackages-3.4.1-11.el7.noarch
rpm -e --nodeps java-1.8.0-openjdk-headless-1.8.0.161-2.b14.el7.x86_64
...
上传自己的jdk解压,并配置环境变量
tar -zxvf /opt/apps/jdk-8u201-linux-x64.tar.gz -C /opt/
打开/etc/profile
文件添加以下内容
export JAVA_HOME=/opt/jdk1.8.0_201
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
检测是否安装成功
[root@node-01 jdk1.8.0_201]# source /etc/profile
[root@node-01 jdk1.8.0_201]# java -version
java version "1.8.0_201"
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)
根据编译说明文件BUILDING.txt,安装相关依赖程序包
[root@node-01 jdk1.8.0_201]# yum -y install gcc-c++ build-essential autoconf automake libtool cmake zlib1g-dev pkg-config libssl-devua svn openssl-devel ncurses-devel
说明:
gcc-c++ -> liunx环境中的c/c++编译器
build-essential -> linux操作系统上面开发程序,光有了gcc是不行的;它还需要一个build-essential软件包;作用是提供编译程序必须软件包的列表信息
如果运行过程中,出现一下类似情况,说明需要更换yum源
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.neusoft.edu.cn
* extras: mirrors.tuna.tsinghua.edu.cn
* updates: mirrors.neusoft.edu.cn
base | 3.6 kB 00:00:00
extras | 3.4 kB 00:00:00
updates | 3.4 kB 00:00:00
updates/7/x86_64/primary_db | 6.5 MB 00:00:01
No package build-essential available.
No package zlib1g-dev available.
No package pkg-config available.
No package libssl-devua available.
Resolving Dependencies
--> Running transaction check
或参考下边四种情况的解决方案
情况一:No package build-essential available.解决方案
yum groupinstall 'Development Tools'
情况二:No package zlib1g-dev available.解决方案
yum install zlib
yum install zlib-devel
情况三:No package pkg-config available.解决方案
yum install pkgconfig
情况四:No package libssl-devua available.解决方案
yum install openssl
yum install openssl-devel
版本要求:Maven 3.0或以后版本均可
坑:由于apache-maven-3.5.0及以后的版本,在编译hadoop-2.7.0源码时,容易出错;本文档使用apache-maven-3.5.0
先确认一下,是否已经安装了符合要求的maven;
若已安装apache-maven-3.5.0,则略过“安装maven”步骤
[root@node-01 opt]# mvn -v
否则安装apache-maven-3.5.0
安装软件:apache-maven-3.5.0-bin.tar.gz
解压maven压缩包到/opt目录下
[root@node-01 apps]# ls
apache-maven-3.5.0-bin.tar.gz
[root@node-01 apps]# tar -xzvf apache-maven-3.5.0-bin.tar.gz -C /opt/
配置mvn的环境变量
[root@node-01 ~]# vim /etc/profile
添加如下内容
export M2_HOME=/opt/apache-maven-3.5.0
export PATH=$PATH:$M2_HOME/bin
测试是否安装完成
[root@node-01 ~]# source .bash_profile
[root@node-01 ~]# mvn -v
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0OCWWntI-1582616296146)(assets/Image201907281207.png)]
默认使用中央仓库下载即可
版本要求:Findbugs 1.3.9
安装软件:findbugs-3.0.1.tar.gz
[root@node-01 apps]# ls
findbugs-3.0.1.tar
[root@node-01 apps]# tar -xvf findbugs-3.0.1.tar.gz -C /opt
配置Findbugs环境变量
[root@node-01 apps]# vim /etc/profile
添加如下内容
export FINDBUGS_HOME=/opt/findbugs-3.0.1
export PATH=$PATH:$FINDBUGS_HOME/bin
测试是否安装完成
[root@node-01 apps]# source /etc/profile
[root@node-01 apps]# findbugs -version
3.0.1
版本要求:ProtocolBuffer 2.5.0
安装软件:protobuf-2.5.0.tar,不建议用其它版本
[root@node-01 apps]# ls
protobuf-2.5.0.tar
[root@node-01 apps]# tar -xvf protobuf-2.5.0.tar
[root@node-01 apps]# mv protobuf-2.5.0 ../
[root@node-01 apps]# cd /opt/protobuf-2.5.0/
[root@node-01 protobuf-2.5.0]# ./configure
[root@node-01 protobuf-2.5.0]# make -j 4 # 干货,-j以4核同时编译;根据实际情况修改
[root@node-01 protobuf-2.5.0]# make install
测试是否安装完成
[root@node-01 protobuf-2.5.0]# protoc --version
libprotoc 2.5.0
若想让hadoop支持snappy压缩,得先安装snappy;
若不需要,跳过此步骤
[root@node-01 apps]# ls
snappy-1.1.3.tar.gz
解压
[root@node-01 opt]# tar -xzvf snappy-1.1.3.tar.gz -C /opt/
安装
[root@node-01 opt]# cd /opt/snappy-1.1.3/
[root@node-01 snappy-1.1.3]# ./configure
[root@node-01 snappy-1.1.3]# make -j 4
[root@node-01 snappy-1.1.3]# make install
查看snappy文件库
[root@node-01 snappy-1.1.3]# ls -lh /usr/local/lib | grep snappy
-rw-r--r--. 1 root root 510K 4月 12 14:14 libsnappy.a
-rwxr-xr-x. 1 root root 955 4月 12 14:14 libsnappy.la
lrwxrwxrwx. 1 root root 18 4月 12 14:14 libsnappy.so -> libsnappy.so.1.3.0
lrwxrwxrwx. 1 root root 18 4月 12 14:14 libsnappy.so.1 -> libsnappy.so.1.3.0
-rwxr-xr-x. 1 root root 253K 4月 12 14:14 libsnappy.so.1.3.0
[root@node-01 snappy-1.1.3]#
首先确保已经安装wget,若没有,先安装(自行百度)
[root@node-01 snappy-1.1.3]# cd /opt/apps/
[root@node-01 opt]# wget http://www.digip.org/jansson/releases/jansson-2.5.tar.gz
[root@node-01 opt]# tar -zxvf jansson-2.5.tar.gz -C /opt
[root@node-01 opt]# cd /opt/jansson-2.5
[root@node-01 jansson-2.5]# ./configure && make && make install
防止编译时java.lang.OutOfMemoryError:Java heap space堆栈内存溢出问题,可以适当调整一下编译用的内存大小
[root@node-01 opt]# export MAVEN_OPTS="-Xms256m -Xmx2048m"
进入源码包下,执行命令进行编译
[root@node-01 fuse-2.8.4]# cd
[root@node-01 ~]# cd /opt/
[root@node-01 opt]# cd hadoop-2.7.0-src/
[root@node-01 hadoop-2.7.0-src]# mvn package -Pdist,native,docs -DskipTests -Dtar
如果中途编译失败,并且不要文档、hadoop支持snappy、支持openssl的话,请使用这个命令
[root@localhost hadoop-2.7.7-src]# mvn clean package -Pdist,native -DskipTests -Dtar -Drequire.snappy -Dsnappy.lib=/usr/local/lib -Dbundle.snappy -Drequire.openssl
说明:
支持snappy(若不需要支持snappy,把这些选项去除即可):Drequire.snappy -Dsnappy.lib=/usr/local/lib -Dbundle.snappy
brew install gcc autoconf automake libtool cmake snappy gzip bzip2 zlib openssl protobuf
findbugs
(下载压缩包解压)export OPENSSL="/usr/local/Cellar/openssl/1.0.2t"
export OPENSSL_ROOT_DIR="$OPENSSL"
export PATH="$OPENSSL/bin:$PATH"
export PKG_CONFIG_PATH="$OPENSSL/lib/pkgconfig"
export LDFLAGS="-L$OPENSSL/lib"
export CPPFLAGS="-I$OPENSSL/include"
export FINDBUGS_HOME=/opt/findbugs-3.0.1
export PATH=$PATH:$FINDBUGS_HOME/bin
mvn package -Pdist,native,docs -DskipTests -Dtar
在编译hadoop-pipes时报错:
[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 /opt/hadoop-2.7.0-src/hadoop-tools/hadoop-pipes/target/antrun/build-main.xml
进入/opt/hadoop-2.7.0-src/hadoop-tools/hadoop-pipes/target/antrun/build-main.xml
文件可以看到
<project name="maven-antrun-" default="main" >
<target name="main">
<mkdir dir="/opt/hadoop-2.7.0-src/hadoop-tools/hadoop-pipes/target/native"/>
<exec failonerror="true" dir="/opt/hadoop-2.7.0-src/hadoop-tools/hadoop-pipes/target/native" executable="cmake">
<arg line="/opt/hadoop-2.7.0-src/hadoop-tools/hadoop-pipes/src/ -DJVM_ARCH_DATA_MODEL=64"/>
exec>
<exec failonerror="true" dir="/opt/hadoop-2.7.0-src/hadoop-tools/hadoop-pipes/target/native" executable="make">
<arg line="VERBOSE=1"/>
exec>
<exec failonerror="true" dir="/opt/hadoop-2.7.0-src/hadoop-tools/hadoop-pipes/target/native" executable="make">exec>
target>
通过上面的报错信息,可以看出是在cmake
时报错,于是我开始手动编译
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_ROOT_DIR
export OPENSSL_ROOT_DIR="/usr/local/Cellar/[email protected]/1.1.1d"
在运行:
cmake /Users/yangjb/IdeaProjects/hadoop/hadoop-tools/hadoop-pipes/src/ -DJVM_ARCH_DATA_MODEL=64
发现仍有错误,提示在CmakeList.txt
(/opt/hadoop-2.7.0-src/hadoop-tools/hadoop-pipes/src
/CmakeList.txt)文件中需要在cmake_minimum_required(VERSION 2.6 FATAL_ERROR)
增加一行
project(ProjectName)
增加之后运行上面一条命令成功
但是在运行下面一句话时报错
make VERBOSE=1
查了很多资料,关于这个报错的回答很少,最后发现是因为openssl的1.1的版本有bug导致,于是换成了[email protected]之后,解决问题。
brew uninstall --ignore-dependencies openssl
brew install https://github.com/tebelorg/Tump/releases/download/v1.0.0/openssl.rb