基於CentOS6.4環境編譯Spark-2.1.0源碼
1 寫在前面的話
有些小夥伴可能會問:Spark官網不是已經提供了Spark針對不同版本的安裝包了嗎,我們為什麼還需要對Spark源碼進行編譯呢?針對這個問題我們到Spark官網: spark.apache.org
來看下,如下圖所示:
Spark官網的確是提供了一些Hadoop版本的Spark安裝包,但是提供的這些是否能夠滿足我們的要求呢?答案肯定是否定的,根據本人近幾年做Spark的開發經驗,列出如下幾點
- 在生產環境中Hadoop的選型,很大部分都是CDH或者HDP系列的,那麼官方提供的這幾個Hadoop系列是否能夠生產的需求?
- 在開發過程中,我們經常會遇到需要對Spark的源碼進行修改,那麼修改後的代碼如何集成到Spark安裝包中去呢?
針對如上列出的兩點的個人覺得比較好的最佳實踐:
- 根據生產上運行的Hadoop版本編譯出Spark的安裝包
- 修改Spark源碼之後,重新編譯Spark
所以:個人覺得如果想更好的學習和使用Spark,那麼第一步就是要會根據Spark源碼編譯出安裝包。
2 前置準備
根據Spark官方文檔編譯模塊的介紹(http://spark.apache.org/docs/2.1.0/building-spark.html)的介紹:
The Maven-based build is the build of reference for Apache Spark. Building Spark using Maven requires Maven 3.3.9 or newer and Java 7+. Note that support for Java 7 is deprecated as of Spark 2.0.0 and may be removed in Spark 2.2.0.」
我們得知:
- Java需要
7+
版本,而且在Spark2.0.0之後Java 7已經被標識成deprecated了,但是不影響使用,但是在Spark2.2.0版本之後Java 7的支持將會被移除; - Maven需要
3.3.9+
版本
2.1 Java7的安裝
2.1.1 下載
Java SE安裝包下載地址:http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html
本文章我們使用的JDK版本是:jdk1.7.0_51
2.1.2 安裝
我們所有的軟體都安裝在hadoop
用戶的根目錄的app
文件夾下
//解壓tar -zxvf jdk-7u51-linux-x64.tar.gz -C ~/app//將JDK目錄添加到系統環境變數(~/.bash_profile)中export JAVA_HOME=/home/hadoop/app/jdk1.7.0_51export PATH=$JAVA_HOME/bin:$PATH//讓配置文件生效source ~/.bash_profile//執行java,查看java版本java -version //如果安裝成功後,則有如下信息的輸出java version "1.7.0_51"Java(TM) SE Runtime Environment (build 1.7.0_51-b13)Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)
2.2 Maven3.3.9的安裝
2.2.1 下載
Maven3.3.9安裝包下載地址:https://mirrors.tuna.tsinghua.edu.cn/apache//maven/maven-3/3.3.9/binaries/
2.2.2 安裝
// 解壓tar -zxvf apache-maven-3.3.9-bin.tar.gz -C ~/app///將JDK目錄添加到系統環境變數(~/.bash_profile)中export MAVEN_HOME=/home/hadoop/app/apache-maven-3.3.9export PATH=$MAVEN_HOME/bin:$PATH//讓配置文件生效source ~/.bash_profile//執行mvn,查看版本mvn -v//如果安裝成功後,則有如下信息的輸出Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-10T08:41:47-08:00)Maven home: /home/hadoop/app/apache-maven-3.3.9Java version: 1.7.0_51, vendor: Oracle CorporationJava home: /home/hadoop/app/jdk1.7.0_51/jreDefault locale: zh_CN, platform encoding: UTF-8OS name: "linux", version: "2.6.32-358.el6.x86_64", arch: "amd64", family: "unix"
2.3 Spark-2.1.0源碼下載
下載地址:http://spark.apache.org/downloads.html
下載完成後解壓即可,解壓後的目錄結構如下圖所示
3 Spark源碼編譯
查看官方文檔編譯源碼部分:http://spark.apache.org/docs/2.1.0/building-spark.html#building-a-runnable-distribution
我們可以使用Spark源碼目錄中的dev
下的make-distribution.sh
腳本,官方提供的編譯命令如下:
./dev/make-distribution.sh --name custom-spark --tgz -Psparkr -Phadoop-2.4 -Phive -Phive-thriftserver -Pmesos -Pyarn
參數說明:
--name
:指定編譯完成後Spark安裝包的名字--tgz
:以tgz的方式進行壓縮-Psparkr
:編譯出來的Spark支持R語言-Phadoop-2.4
:以hadoop-2.4的profile進行編譯,具體的profile可以看出源碼根目錄中的pom.xml中查看-Phive
和-Phive-thriftserver
:編譯出來的Spark支持對Hive的操作-Pmesos
:編譯出來的Spark支持運行在Mesos上-Pyarn
:編譯出來的Spark支持運行在YARN上
那麼我們可以根據具體的條件來編譯Spark,比如我們使用的Hadoop版本是2.6.0-cdh5.7.0
,並且我們需要將Spark運行在YARN上、支持對Hive的操作,那麼我們的Spark源碼編譯腳本就是:
./dev/make-distribution.sh --name 2.6.0-cdh5.7.0 --tgz -Pyarn -Phadoop-2.6 -Phive -Phive-thriftserver -Dhadoop.version=2.6.0-cdh5.7.0
編譯成功後,在Spark源碼的根目錄中就spark-2.1.0-bin-2.6.0-cdh5.7.0.tgz
包,那麼我們就可以使用編譯出來的這個安裝包來進行Spark的安裝了。
有小夥伴可能會問,為什麼編譯出來的安裝包的名稱是spark-2.1.0-bin-2.6.0-cdh5.7.0.tgz
呢?我們可以帶著這個疑惑,查看make-distribution.sh的源碼,在該腳本的最後部分,有如下代碼:
if [ "$MAKE_TGZ" == "true" ]; then TARDIR_NAME=spark-$VERSION-bin-$NAME TARDIR="$SPARK_HOME/$TARDIR_NAME" rm -rf "$TARDIR" cp -r "$DISTDIR" "$TARDIR" tar czf "spark-$VERSION-bin-$NAME.tgz" -C "$SPARK_HOME" "$TARDIR_NAME" rm -rf "$TARDIR"fi
該VERSION就是我們Spark的版本即2.1.0
,NAME就是我們在編譯時指定的2.6.0-cdh5.7.0
,所以根據該腳本最終輸出的Spark安裝包的全稱為: spark-2.1.0-bin-2.6.0-cdh5.7.0.tgz
。通過該代碼的查看希望大家能明白一個問題:源碼面前,了無秘密。
注意:在編譯過程中會出現下載某個依賴包的時間太久,這是由於網路問題,可以執行ctrl+c停止編譯命令,然後重新運行編譯命令,在編譯過程中多試幾次即可。有條件的小夥伴,建議開著VPN然後再進行編譯,整個編譯過程會順暢很多。
作者: Michael__PK
鏈接:https://www.imooc.com/article/18419來源:慕課網本文原創發佈於慕課網 ,轉載請註明出處,謝謝合作
推薦閱讀: