編譯Spark原始碼與子專案GraphX中踩過的坑
編譯Spark原始碼與子專案GraphX中踩過的坑
原始目標:在三臺虛擬機器上真實分散式安裝spark平臺,並通過修改graphx對應的原始碼,觀察graphx的分散式效能,為進一步做圖劃分做準備。
官網文件:http://spark.apachecn.org/docs/cn/2.2.0/building-spark.html
文章目錄
首先肯定是安裝環境了
據其他部落格瞭解到需要安裝java1.8以上版本,scala環境,於是自以為聰明的上來直接系統預設安裝了。
環境:VM虛擬機器,ubuntu18.04 LTS
安裝java環境:sudo apt install default-jdk
問題在於:直接安裝 Java 預設是 OpenJDK 版本,後面將證實需要SunJDK版本,具體區別見博文:Java知識點小結
安裝scala環境:sudo apt install scala
問題在於:不同的spark版本需要的scala對應的版本不同,預設安裝的版本不一定合適
下載原始碼
在官網上下載原始碼,不一定需要到github上:http://spark.apache.org/downloads.html
選擇合適的版本,這裡選擇spark-2.2.0版本
領悟:技術類的知識,官網是最好的選擇
編譯原始碼
領悟:技術類的知識,官網是最好的選擇,在官網上能迅速找到對應的編譯方式,而很多部落格講得很不全面,導致晦澀難懂
採用maven構建,命令為:
build/mvn -Pyarn -Phadoop-2.6 -Dhadoop.version=2.6.5 -DskipTests clean package
踩過的坑之maven編譯
-
依賴包下載失敗,後面將給出確切原因
查了很多博文,都說是因為wget版本問題,需要更新版本sudo apt-get install update
然而並沒有什麼卵用,這種時候就應該好好讀編譯過程中的列印資訊,然後結合具體命令具體分析,而不能依賴搜尋。其實仔細看過之後發現,就是需要下載的依賴包沒法下載。
-
修改源:(有兩處需要修改!!)
最開始按照網上的教程,只是修改了一處,導致仍然很慢。
解決問題在於觀察編譯過程中的列印資訊,分析問題,發現maven在下載依賴包時的網址有時是修改前的,有時是修改後的,這說明沒有修改完全。
另一方面,需要好好理解一下maven專案構建工具。
在spark原始碼目錄下的pom.xml檔案中,將原始源修改為 :
<http://maven.aliyun.com/nexus/content/groups/public/>
-
如果使用的scala版本為2.11,需要執行dev目錄下的指令碼
./change-scala-version.sh 2.11
沒有執行的話,可能會出現一些問題
-
編譯過程中需要自動下載檔案
scala-2.11.8https://downloads.typesafe.com/scala/2.11.8/scala-2.11.8.tgz
zinc-0.3.11https://downloads.typesafe.com/zinc/0.3.11/zinc-0.3.11.tgz
在第一個坑的基礎之上,發現更新之後仍然不行,最後發現無法下載的原因在於被牆了而不是wget的問題,開啟socks全域性模式可以解決,也可以定向增加定向開啟socks的網址。直接手動在瀏覽器上下載,然後放置到對應的位置 build 目錄下。
-
順利下載了所有的依賴,但是編譯出現問題
'compiler-interface' not yet compiled for Scala 2.11.8. Compiling...
處於還沒有開始編譯的狀態考慮:最開始想,這個問題大概是因為在下載mvn的依賴包時,scala的版本並不是使用的是scala-2.11.8版本。
嘗試方案1: 刪除.m2資料夾中maven對應的repository資料夾並重新下載,仍然出現該問題,表明不是maven依賴包的問題。
嘗試方案2: 解除安裝預設安裝的scala版本,檢視其版本為:
使用命令:sudo apt-get remove scala*
解除安裝預設安裝的scala
配環境的時候,最好要安裝特定版本,不能圖省事安裝預設版本,否則後患無窮,使用安裝包自行配置安裝特定版本比較好
重新安裝scala-2.11.8
將scala-2.11.8的安裝包拷貝至 /home/wj/app 下
在
~/.bashrc
檔案中新增:export SCALA_HOME=/home/wj/app/scala-2.11.8 export PATH=${SCALA_HOME}/bin:$PATH
使修改生效:
source ~/.bashrc
版本修改完成。
測試:依然報錯。考慮:除了scala外,還有java版本問題,maven只是構建工具應該不會和編譯過程有關係。
嘗試方案3 : 可能是jdk的版本問題,不使用OpenJDK換用SunJDK進行實驗
在全新的ubuntu16.04環境中編譯成功
然後,在ubuntu18.04下解除安裝預設安裝的java版本:
sudo apt-get remove java*
安裝新的java版本
在java官網下載安裝包,並安裝至 /home/wj/app/ 下。
在
~/.bashrc
檔案中新增以下內容:export JAVA_HOME=/home/wj/app/jdk1.8.0_181 export JRE_HOME=/home/wj/app/jdk1.8.0_181/jre export PATH={JAVA_HOME}/bin:{JRE_HOME}/bin:$PATH
使修改生效:
source ~/.bashrc
編譯成功
另外,在spark-2.2.0上測試完成之後,在最新的github上的spark-master上進行了測試。
編譯 spark-master:
需要scala版本為2.11.12
需要zinc版本為0.3.15
編譯成功
編譯並構建可發行版本
Spark原始碼中提供了多種構建方式,本文中採用maven構建,sbt易出現錯誤,以來太多難以下載。按照上述方法進行配置,maven編譯過程不會出錯。接下來的實驗是構建可發行指令碼和編譯單個子專案,僅使用標準spark-2.2.0版本進行。
可以通過spark中自帶的編譯指令碼
./dev/make-distribution.sh
構建一個可發行的版本,但是按照官網上給出的命令,中間會出現錯誤
./dev/make-distribution.sh --name custom-spark --pip --r --tgz -Psparkr -Phadoop-2.7 -Phive -Phive-thriftserver -Pmesos -Pyarn
問題應該在於R語言沒有安裝,去掉R語言介面(-Psparkr 和 --r
)的生成
./dev/make-distribution.sh --name custom-spark --pip --tgz -Phadoop-2.7 -Phive -Phive-thriftserver -Pmesos –Pyarn
引數行-Psparkr
用於支援R語言執行在spark上的庫
引數行--r和--pip
分別用於支援R語言和Python語言
如果需要編譯支援R語言的spark,需要安裝R外掛,參照如下文章:
https://blog.csdn.net/sddyljsx/article/details/81051078
編譯成功,但是沒有成功構建發行包,需要安裝python及其相關安裝包setuptools
編譯成功,生成可發行檔案壓縮包
編譯子專案
編譯其中一個子專案,採用官網上提供的方案,不需要全部編譯的命令是 :
./build/mvn -pl :spark-graphx_2.11 clean install
將生成的graphx的包spark-graphx_2.11-2.2.0.jar替換就可以了。
至此,編譯spark原始碼和編譯spark單個子專案完成。