Spark 2.2原始碼編譯 & 支援hadoop-2.6.0-cdh5.7.0
JDK & Maven & Scala & Git軟體安裝 & 前置準備
編譯Spark原始碼的前置要求:
Maven 3.3.9 or newer
Java 8+
Scala
Git(後文會通過分析make-distribution.sh指令碼,來闡述為何需要安裝Git)
使用的軟體的版本:
apache-maven-3.3.9-bin.tar.gz
hadoop-2.6.0-cdh5.7.0.tar.gz
jdk-8u91-linux-x64.tar.gz
scala-2.11.8.tgz
關於maven本地倉庫配置的建議:
maven的setting.xml檔案配置 指定本地倉庫的位置:
<localRepository>/home/hadoop/maven_repo</localRepository>
解壓Spark原始碼到/opt/source:
$>tar -zxvf spark-2.2.0.tgz -C /opt/source
Git的安裝:
$>sudo yum install git
Building with 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
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
Building With Hive and JDBC Support
$>./build/mvn -Pyarn -Phive -Phive-thriftserver -Phadoop-2.7 -Dhadoop.version=2.7.3 -DskipTests clean package
support hadoop-2.6.0-cdh5.7.0
$>./build/mvn -Pyarn -Phive -Phive-thriftserver -Phadoop-2.6 -Dhadoop.version=2.6.0-cdh5.7.0 -DskipTests clean package
Building a Runnable Distribution & Analysis make-distribution.sh
分析make-distribution.sh:
[--mvn <mvn-command>]表示可以跟上maven的相關命令;
而-Dhadoop.version=2.6.0-cdh5.7.0 \
-Phadoop-2.6 \
-Phive -Phive-thriftserver \
-Pyarn
這些就是maven的命令
發現需要檢查Git,因此在前文中說在Spark原始碼編譯之前需要安裝Git
這就是Building with maven中在Spark原始碼編譯之前所需要設定的,在make-distribution.sh的指令碼中,已經寫進來了
通過這個發現,maven的命令已經幫助我們”封裝”好了,clean package -DskipTests這些全部在裡面已經寫好了;我們只需要加上maven的相關引數就可以了(這些引數被存在$MVN中)
開啟Spark原始碼編譯的時候,會去檢測一堆東西,這個過程是很漫長的
因此我們需要對其進行相應的修改(將截圖中的內容先全部註釋掉,再加入下列內容):
VERSION=2.2.0
SCALA_VERSION=2.11
SPARK_HADOOP_VERSION=2.6.0-cdh5.7.0
SPARK_HIVE=1
使用下列命令,開啟Spark原始碼的編譯:
$> ./dev/make-distribution.sh \
--name 2.6.0-cdh5.7.0 \
--tgz \
-Dhadoop.version=2.6.0-cdh5.7.0 \
-Phadoop-2.6 \
-Phive -Phive-thriftserver \
-Pyarn
關於make-distribution.sh指令碼的補充:
將一系列的內容拷貝到相應的目錄下(如jar包、bin、sbin檔案等,這裡截圖沒截全,詳細可以看指令碼)
會執行一系列的環境檢查
編譯中遇到的坑及排錯
使用make-distribution.sh指令碼進行編譯的時候,產生了報錯:
錯誤排查分析:
http://maven.aliyun.com/nexus/content/groups/public/這裡面的是Apache版本的hadoop,沒有我們所指定的CDH版本的Hadoop,因此會找不到,才產生了報錯。
解決方案:
修改pom.xml,制定CDH的倉庫,加入下列內容:
<repository>
<id>cloudera</id>
<name>cloudera Repository</name>
<url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
</repository>
編譯成功 & 結合make-distribution.sh指令碼分析列印的資訊
編譯成功的截圖,如下:
分析列印的資訊:
這些資訊與打印出的資訊一致,指令碼中的引數可以使用echo $XX在命令列中進行版本的檢視
Spark 2.2.0安裝包的名字:spark-2.2.0-bin-2.6.0-cdh5.7.0.tgz
關於編譯方式選擇的解讀 & 總結
使用maven-distribution.sh指令碼進行編譯,其實質也是使用了maven;
但是直接按照官方文件上Building with maven中的方式進行編譯,會出現一個問題:即不能得到tar.gz或者是tgz這個包的;
而當我們使用make-distribution.sh指令碼進行編譯的時候,是可以打成包;
同時,會將我們需要的jar包、bin、sbin、example、data等這些資訊全部拷貝到一個目錄裡面去,然後打包就出來了。
因此在生產環境中,更多時候會選擇使用make-distribution.sh對Spark原始碼進行編譯