背景
??通常來(lái)講,spark的使用離不開hadoop生態(tài),在spark的官網(wǎng)中已經(jīng)有針對(duì)hadoop通用版本(比如2.6、2.7)的預(yù)編譯版本。但是在實(shí)際生產(chǎn)環(huán)境中使用的hadoop一般是cdh或hdp,與spark預(yù)編譯版本可能會(huì)有兼容性的問(wèn)題,所以要編譯針對(duì)特定hadoop版本的spark。
版本
- hadoop:2.6.0-cdh5.4.7
- spark:2.3.1
maven 編譯
前提條件
1.maven版本在3.3.9以上并且jdk在1.8以上
2.設(shè)置MAVEN_OPTS,以便在編譯時(shí)可以用更多的內(nèi)存空間
export MAVEN_OPTS="-Xmx2g -XX:ReservedCodeCacheSize=512m"
了解pom文件
在編譯之前我們首先了解一下spark源碼中的pom文件,首先在<properties/>中提供了編譯spark時(shí)各組件的默認(rèn)版本:
如圖所示,編譯spark時(shí)默認(rèn)的hadoop版本是2.6.5,編譯時(shí)可以通過(guò)-D的方式指定組件版本。

編譯
mvn -Pyarn -Phive -Phadoop-2.6 -Dhadoop.version=2.6.0-cdh5.4.7 -Phive-thriftserver -DskipTests clean package
上述命令編譯的spark支持yarn、hive、hadoop2.6,同時(shí)指定了hadoop的版本。
編譯可運(yùn)行的spark包
在spark的源碼的dev目錄下提供了一個(gè)名叫make-distribution.sh的腳本來(lái)編譯一個(gè)可運(yùn)行的spark包,具體用法如下:
./dev/make-distribution.sh --name 2.6.0-cdh5.4.7 --tgz -Phadoop-2.6 -Phive -Phive-thriftserver -Pyarn -Dhadoop.version=2.6.0-cdh5.4.7
該腳本實(shí)際用的是上面介紹的mvn編譯,具體用法可以通過(guò)執(zhí)行./dev/make-distribution.sh --help來(lái)查看。

編譯時(shí)遇到的問(wèn)題
問(wèn)題一:
[ERROR] Failed to execute goal on project spark-launcher_2.11: Could not resolve dependencies for project org.apache.spark:spark-launcher_2.11:jar:2.3.1: Could not find artifact org.apache.hadoop:hadoop-client:jar:2.6.0-cdh5.4.7 in central (https://repo.maven.apache.org/maven2) -> [Help 1]
解決:這是由于編譯時(shí)找不到hadoop對(duì)應(yīng)的maven庫(kù),只要在spark的pom文件中加入cdh的maven倉(cāng)庫(kù)即可
<repositories>
<repository>
<id>cloudera</id>
<url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
</repository>
</repositories>