學(xué)會(huì)編譯Hadoop非常有必要,Hadoop是使用Java語言開發(fā)的,但是有一些需求和操作并不適合使用java,所以就引入了本地庫(Native Libraries) 的概念。說白了,就是Hadoop的某些功能,必須通過JNT來協(xié)調(diào)Java類文件和Native代碼生成的庫文件一起才能工作。linux系統(tǒng)要運(yùn)行Native 代碼,首先要將Native 編譯成目標(biāo)CPU 架構(gòu)的[.so]文件。而不同的處理器架構(gòu),需要編譯出相應(yīng)平臺(tái)的動(dòng)態(tài)庫[.so] 文件,才能被正確的執(zhí)行,所以最好重新編譯一次hadoop源碼,讓[.so]文件與自己處理器相對(duì)應(yīng)。
首先我們需要一臺(tái)和生產(chǎn)運(yùn)行集群架構(gòu)一致的操作系統(tǒng),比如Linux CentOS7.5 X86,從云廠商或者虛擬機(jī)自行搭建都可以。然后我們需要提前從網(wǎng)上下載好如下軟件包,供后面步驟使用。
- cmake-3.24.2.tar.gz(需要源碼包,否則沒有configure文件,為了安裝后面的snappy和protobuf使用)
- snappy-1.1.3.tar.gz(二進(jìn)制包,否則沒有configure文件,hadoop進(jìn)行壓縮解壓縮需要用到)
- protobuf-all-21.9.tar.gz(二進(jìn)制包,否則沒有configure文件,是一個(gè)數(shù)據(jù)序列化工具)
- jdk-8u241-linux-x64.tar.gz(Hadoop的執(zhí)行需要JVM)
- apache-maven-3.8.6-bin.tar.gz(編譯hadoop需要)
- hadoop-3.3.0-src.tar.gz
然后第一步,我們登錄服務(wù)器,并進(jìn)入到/root/soft目錄下,首先安裝編譯需要的相關(guān)依賴:
yum install gcc gcc-c++ make autoconf automake libtool curl lzo-devel zlib-devel openssl openssl-devel ncurses-devel snappy snappy-devel bzip2 bzip2-devel lzo lzo-devel lzop libXtst zlib -y
...
Complete!
yum install -y doxygen cyrus-sasl* saslwrapper-devel*
...
Complete!
第二步,手動(dòng)安裝cmake:
#yum卸載已安裝cmake,一般版本較低,無論是否安裝都卸載一下
yum erase cmake
# 解壓
tar zxvf cmake-3.24.2.tar.gz
#進(jìn)入到目錄內(nèi)進(jìn)行編譯安裝
cd cmake-3.24.2
./configure
make && make install
#驗(yàn)證
[root@iZuf6gmsvearrd5uc3emkyZ cmake-3.24.2]# cmake -version
cmake version 3.24.2
CMake suite maintained and supported by Kitware (kitware.com/cmake).
第三步,安裝snappy:
#卸載已經(jīng)安裝的
rm -rf /usr/local/lib/libsnappy*
rm -rf /lib64/libsnappy*
#解壓
tar zxvf snappy-1.1.3.tar.gz
#進(jìn)入到目錄內(nèi)進(jìn)行編譯安裝
cd snappy-1.1.3
./configure
make && make install
#驗(yàn)證
[root@iZuf6gmsvearrd5uc3emkyZ snappy-1.1.3]# ls -lh /usr/local/lib | grep snappy
-rw-r--r-- 1 root root 511K Nov 1 17:12 libsnappy.a
-rwxr-xr-x 1 root root 955 Nov 1 17:12 libsnappy.la
lrwxrwxrwx 1 root root 18 Nov 1 17:12 libsnappy.so -> libsnappy.so.1.3.0
lrwxrwxrwx 1 root root 18 Nov 1 17:12 libsnappy.so.1 -> libsnappy.so.1.3.0
-rwxr-xr-x 1 root root 253K Nov 1 17:12 libsnappy.so.1.3.0
第四步,安裝protobuf:
#解壓
tar zxvf protobuf-all-21.9.tar.gz
#進(jìn)入到目錄內(nèi)進(jìn)行編譯安裝
cd protobuf-all-21.9
./autogen.sh
./configure
make && make install
#驗(yàn)證
[root@iZuf6gmsvearrd5uc3emkyZ protobuf-21.9]# protoc --version
libprotoc 3.21.9
第五步,安裝和配置JDK:
#解壓
tar zxvf jdk-8u65-linux-x64.tar.gz
#配置環(huán)境變量
vim /etc/profile
export JAVA_HOME=/root/soft/jdk1.8.0_241
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
source /etc/profile
#驗(yàn)證
[root@iZuf6gmsvearrd5uc3emkyZ soft]# java -version
java version "1.8.0_241"
Java(TM) SE Runtime Environment (build 1.8.0_241-b07)
Java HotSpot(TM) 64-Bit Server VM (build 25.241-b07, mixed mode)
第六步,安裝和配置Maven:
#解壓
tar zxvf apache-maven-3.8.6-bin.tar.gz
#配置環(huán)境變量
vim /etc/profile
export MAVEN_HOME=/root/soft/apache-maven-3.8.6
export PATH=:$MAVEN_HOME/bin:$PATH
source /etc/profile
#驗(yàn)證
[root@iZuf6gmsvearrd5uc3emkyZ soft]# mvn -v
Apache Maven 3.8.6 (84538c9988a25aec085021c365c560670ad80f63)
Maven home: /root/soft/apache-maven-3.8.6
Java version: 1.8.0_241, vendor: Oracle Corporation, runtime: /root/soft/jdk1.8.0_241/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-862.14.4.el7.x86_64", arch: "amd64", family: "unix"
#修改鏡像倉庫為國內(nèi)地址
vim /root/soft/apache-maven-3.8.6/conf/settings.xml
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
第七步,編譯hadoop:
#解壓
tar zxvf hadoop-3.3.0-src.tar.gz
#進(jìn)入到目錄內(nèi)進(jìn)行maven編譯打包
cd hadoop-3.3.0-src
mvn clean package -Pdist,native -DskipTests -Dmaven.javadoc.skip=true -Dtar -Dbundle.snappy -Dsnappy.lib=/usr/local/lib
#參數(shù)說明
#Pdist,native :重新編譯生成的hadoop動(dòng)態(tài)庫;
#DskipTests :跳過測試
#-Dmaven.javadoc.skip=true : 跳過javadoc
#Dtar :最后把文件以tar打包
#Dbundle.snappy :添加snappy壓縮支持【默認(rèn)官網(wǎng)下載的是不支持的】
#Dsnappy.lib=/usr/local/lib :指定snappy在本機(jī)編譯機(jī)器上安裝的庫路徑
#最終編譯打包后的目標(biāo)文件位于當(dāng)前目錄的target下面,
很可惜,進(jìn)行到這里hadoop-common總是報(bào)錯(cuò)執(zhí)行不下去了,網(wǎng)上搜索很久都沒有找到對(duì)應(yīng)的解決方案,暫且擱置了。
其實(shí)學(xué)會(huì)編譯Hadoop也不是必須的,官網(wǎng)提供的二進(jìn)制包實(shí)驗(yàn)下來也是可以直接使用的,因此本文的編譯工作就不是作為學(xué)習(xí)Hadoop必須的步驟了,后續(xù)有機(jī)會(huì)再研究如何正確編譯。