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]
啟動完成: