1. 程式人生 > >Spark 2.3.2原始碼編譯,支援hadoop-2.6.0-cdh5.15.0

Spark 2.3.2原始碼編譯,支援hadoop-2.6.0-cdh5.15.0

前置準備&軟體安裝

spark2.3.2原始碼官方Apache下載地址:

http://spark.apache.org/downloads.html

編譯spark原始碼的官方Apache參考文件

http://spark.apache.org/docs/2.3.2/building-spark.html

編譯Spark原始碼的前置要求(官方Apache編譯要求說明): 

Maven 3.3.9 or newer 
Java 8+ 
Scala 
Git(後文會通過分析make-distribution.sh指令碼,來闡述為何需要安裝Git)

本人使用的軟體的版本: 
apache-maven-3.5.4-bin.tar.gz 
hadoop-2.6.0-cdh5.15.0.tar.gz 
jdk-8u181-linux-x64.tar.gz 
scala-2.12.7.tgz

關於maven本地倉庫配置的建議(可不配置,預設本地倉庫位置在/home/使用者名稱/.m2/repository目錄下): 
maven的setting.xml檔案配置 指定本地倉庫的位置:

<localRepository>自己指定的本地倉庫目錄</localRepository>

解壓Spark原始碼到~/app/下(由於本人使用的Linux是ubuntu系統版本,以下下所有Linux命令都是ubuntu版本命令,若讀者使用CentOS或者其他Linux版本請自行查詢相關命令)

[email protected]:~$ tar -zxvf spark-2.3.2.tgz -C ~/app/

Git的安裝:

[email protected]:~$ sudo apt-get install git

Building with Maven

配置在系統環境變數裡(官方建議Maven的記憶體配置大一點,不然有可能會出現報錯):

export MAVEN_OPTS="-Xmx2g -XX:ReservedCodeCacheSize=512m"

如果不配置,可能會遇到如下問題:

[INFO] Compiling 203 Scala sources and 9 Java sources to /Users/me/Development/spark/core/target/scala-2.11/classes...
[ERROR] Java heap space -> [Help 1]


通過觀察pom.xml,可以觀察到編譯Spark的時候,如果不手動指定hadoop與yarn的版本,會預設採用hadoop、yarn的版本 


因此,當我們使用官方文件裡的命令:

./build/mvn -DskipTests clean package

編譯時所使用的hadoop版本為2.6.5

官方文件也給出了編譯指定hadoop版本為Apache Hadoop 2.6.X和Apache Hadoop 2.7.X and later的命令:

# Apache Hadoop 2.6.X
./build/mvn -Pyarn -DskipTests clean package

# Apache Hadoop 2.7.X and later
./build/mvn -Pyarn -Phadoop-2.7 -Dhadoop.version=2.7.3 -DskipTests clean package

還有支援Hive和JDBC的編譯命令:

# With Hive 1.2.1 support
./build/mvn -Pyarn -Phive -Phive-thriftserver -DskipTests clean package

根據官方文件的命令結合我使用的hadoop版本可以知道編譯hadoop-2.6.0-cdh5.15.0的命令:

./build/mvn -Pyarn -Phive -Phive-thriftserver -Phadoop-2.6 -Dhadoop.version=2.6.0-cdh5.15.0 -DskipTests clean package

命令簡單解釋:

./build/mvn
 -Pyarn    指定支援yarn
 -Phive -Phive-thriftserver    指定支援Hive和JDBC
 -Phadoop-2.6 -Dhadoop.version=2.6.0-cdh5.15.0    指定支援hadoop以及設定hadoop的版本
 -DskipTests clean package    跳過測試,進行清理打包

以上Maven進行Spark 2.3.2原始碼編譯完成,支援hadoop-2.6.0-cdh5.15.0編譯,編譯結果會得到Spark相應的Maven工程,並不是能直接執行的Spark

Building a Runnable Distribution

官方文件給出了編譯一個可以執行的Spark的命令:

./dev/make-distribution.sh --name custom-spark --pip --r --tgz -Psparkr -Phadoop-2.7 -Phive -Phive-thriftserver -Pmesos -Pyarn -Pkubernetes

該命令需要用到一個make-distribution.sh檔案,檔案在spark-2.3.2/dev/make-distribution.sh目錄下

分析make-distribution.sh: 

[--mvn <mvn-command>]表示可以跟上maven的相關命令:
而-Pyarn -Phive -Phive-thriftserver -Phadoop-2.6 -Dhadoop.version=2.6.0-cdh5.15.0是相應的Maven編譯不可直接執行的Spark的命令

發現make-distribution.sh中有需要需要檢查使用Git,因此在前文中說在Spark原始碼編譯之前需要安裝Git


官方文件提示的Setting up Maven’s Memory Usage中在Spark原始碼編譯之前所需要設定的,在make-distribution.sh的指令碼中,已經給出不用自己手動設定了

這裡可以發現make-distribution.sh指令碼檔案已經將maven的命令中的clean package -DskipTests封裝到Linux變數$MVN中,即使用make-distribution.sh指令碼進行Spark原始碼編譯時命令不用帶上clean package -DskipTests了,只需要新增Maven的其他相關引數即可(-Pyarn -Phive -Phive-thriftserver -Phadoop-2.6 -Dhadoop.version=2.6.0-cdh5.15.0)

由於make-distribution.sh指令碼執行時會進行檢測系統當前Scala、Hadoop、Hive的版本,會浪費很長時間,可選擇將其註釋掉用下面內容替代(根據自己的版本進行相應改動),如果你時間充足可以不進行修改

VERSION=2.3.2
SCALA_VERSION=2.12.7
SPARK_HADOOP_VERSION=2.6.0-cdh5.15.0
SPARK_HIVE=1

根據官方文件使用make-distribution.sh指令碼進行Spark原始碼編譯的命令結合我使用的hadoop版本可以知道編譯hadoop-2.6.0-cdh5.15.0的命令:

[email protected]:~/app/spark-2.3.2$ ./dev/make-distribution.sh --name 2.6.0-cdh5.15.0 --tgz -Dhadoop.version=2.6.0-cdh5.15.0 -Phadoop-2.6 -Phive -Phive-thriftserver -Pyarn

編譯中可能會遇到的問題:

這個問題是因為本人使用的hadoop是cdh版本而且Maven倉庫用的不是官方Maven中央倉庫是阿里雲Maven映象倉庫,而阿里雲Maven映象裡hadoop是Apache版本(官方Maven中央倉庫裡的hadoop也是Apache版本的),所以Maven找不到cdh版的hadoop報錯(如果使用的hadoop不是cdh版本是正常的官方Apache版本應該不會出現這樣的問題),需要在spark-2.3.2/pom.xml配置檔案中repositories標籤下加入cdh版的hadoop的一個倉庫:

<repository>
    <id>cloudera</id>
    <name>cloudera Repository</name>
    <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
</repository>

既然說到阿里雲Maven映象,那就在提一個建議吧,可以在apache-maven-3.5.4/conf目錄下的settings.xml配置檔案中mirrors標籤下加入阿里雲Maven映象,這樣可以提高Maven工程編譯的速度,當然這只是建議(如果時間充足可以考慮不新增)

<mirror>
    <id>nexus-aliyun</id>
    <mirrorOf>central</mirrorOf>
    <name>Nexus aliyun</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>

使用make-distribution.sh指令碼編譯一個可以執行的Spark完成:

 編譯成功後在spark-2.3.2目錄下會得到一個壓縮包檔案spark-2.3.2-bin-2.6.0-cdh5.15.0.tgz


啟動執行spark: 

解壓壓縮包檔案spark-2.3.2-bin-2.6.0-cdh5.15.0.tgz

[email protected]:~/app/spark-2.3.2$ tar -zxvf spark-2.3.2-bin-2.6.0-cdh5.15.0.tgz -C ~/app/

進入spark-2.3.2-bin-2.6.0-cdh5.15.0/bin目錄執行命令(本人使用local模式兩個執行緒啟動):

[email protected]:~/app/spark-2.3.2-bin-2.6.0-cdh5.15.0/bin$ ./spark-shell --master local[2]

啟動完成: