Hadoop源碼環境搭建及編譯(Windows 、MAC)
Windows
1. 下載對應版本的Hadoop源碼包
2. 編譯Hadoop源碼
編譯源碼最好是在linux平臺,此處用CentOS 7.4平臺編譯源碼
使用root用戶編譯
所有軟件壓縮包,放到**/opt/apps**目錄
2.1 查看編譯說明文件
將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系統下編譯
2.2 安裝JDK
要求版本: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)
2.3 安裝依賴包
根據編譯說明文件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
2.4 安裝Maven
版本要求: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)]
默認使用中央倉庫下載即可
2.5 安裝Findbugs
版本要求: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
2.6 安裝ProtocolBuffer
版本要求: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
2.7 安裝Snappy
若想讓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]#
2.8 安裝Jansson
首先確保已經安裝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
2.9 編譯hadoop
防止編譯時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
MAC
1 安裝依賴
brew install gcc autoconf automake libtool cmake snappy gzip bzip2 zlib openssl protobuf
2 安裝 findbugs
(下載壓縮包解壓)
3 環境變量
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
4 編譯
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 ...<exec failοnerrοr="true" dir="/opt/hadoop-2.7.0-src/hadoop-tools/hadoop-pipes/target/native" executable="cmake">... @ 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
文件可以看到
<?xml version="1.0" encoding="UTF-8" ?>
<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