Spark源碼分析系列—編譯源碼

1 Spark源碼的下載

作爲一名大數據開發工程師,研讀源碼是我們日常開發學習中必不可少的環節,而萬里長征的第一步就是編譯源碼。開源Spark主要有3大發行版Apache,CDH和HDP,本文以Apache Spark 2.4.5爲例展開。
1) 訪問Apache Spark官網http://spark.apache.org/,點擊Download
在這裏插入圖片描述
2)選擇版本和文件類型
在這裏插入圖片描述
特別注意最後一行聲明,除了Spark2.4.2版本依賴Scala 2.12,其餘Spark版本都依賴Scala 2.11
3) 下載源碼的壓縮包到本地
在這裏插入圖片描述

4)博主是下載到Linux上,使用tar解壓文件夾

root@ubuntu18:~/workspace# tar -zxvf ep spark-2.4.5.tgz 
root@ubuntu18:~/workspace# ls | grep spark-2.4.5
spark-2.4.5
spark-2.4.5.tgz

2 Spark源碼的編譯

Spark源碼編譯的方式有maven和sbt兩種,本文選取maven爲例進行編譯。

2.1 準備系統環境

Java 1.8
Scala 2.11
Maven 3.6.1

這些組件的安裝教程網上很多,因此不再贅述。有一點需要補充,編譯Spark需要較大堆內存,因此需要提高maven堆內存的上限。

root@ubuntu18:~/workspace# vim /etc/profile
export MAVEN_OPTS="-Xmx2g -XX:ReservedCodeCacheSize=512m"

2.2 執行編譯過程

root@ubuntu18:~/workspace# cd spark-2.4.5
#參數-T代表線程數,可以並行地構建那些相互間回沒有依賴關係的模塊,充分利用多核CPU資源,博主虛擬機是4核心,因此設置爲4。
root@ubuntu18:~/workspace/spark-2.4.5# build/mvn -T 4 -Pyarn -Phadoop-2.6 -Dhadoop.version=2.6.0

運行結果如下圖所示,博主是以前編譯過的,因此maven倉庫已經存在相關依賴,所以採用了5分鐘,如果是第一次編譯,時間會比較久,當時來回折騰了好幾個小時。

在這裏插入圖片描述

2.3 編譯過程遇到問題

編譯過程中,可能存在因爲網絡等問題,導致某一模塊編譯失敗,建議重新編譯當前模塊。比如在spark-streaming-kafka模塊編譯失敗。

root@ubuntu18:~/workspace/spark-2.4.5#build/mvn -T 4 -Pyarn -Phadoop-2.6 -Dhadoop.version=2.6.0  clean package -rf :spark-streaming-kafka-0-10_2.11

3 使用Spark交互環境(REPL)開發wc

3.1 新建數據集

root@ubuntu18:~/workspace/spark-2.4.5# vim ./data/wc.txt
寫入內容:
tensorflow pytouch
python java scala
elasticsearch spark
hadoop spark

3.2 打開REPL

root@ubuntu18:~/workspace/spark-2.4.5#./bin/spark-shell

3.3 編寫wc的代碼

scala> val rdd = sc.textFile ("file:///root/workspace/spark-2.4.5/data/wc.txt")
rdd: org.apache.spark.rdd.RDD[String] = file:///root/workspace/spark-2.4.5/data/wc.txt MapPartitionsRDD[1] at textFile at <console>:24

scala> rdd.flatMap(line => line.split("//s+")).map(word => (word, 1)).reduceByKey(_ + _).collect
res0: Array[(String, Int)] = Array((python java scala,1), (hadoop spark,1), (elasticsearch spark,1), (tensorflow pytouch,1))

4 在Idea調試Spark自帶的案例wc

4.1 導入源碼

將源碼導入到idea。執行此步驟之前,需要調整idea JVM參數,增到JVM堆內存的大小,否則後面運行時會出現idea會卡死,掛掉的現象。

root@ubuntu18:~# vim /usr/local/idea-IU-182.4129.33/bin/idea.vmoptions 
-Xms512m
-Xmx1024m
-XX:ReservedCodeCacheSize=300m

4.2 向主函數傳入參數

wc案例需要傳入統計的文本,在idea中具體參數可以通過main函數傳遞。
在JavaWordCount類點擊鼠標右鍵,選擇Creat ‘JavaWordCount.Main’
在這裏插入圖片描述
填寫參數:
在這裏插入圖片描述
1)VM options:-Dspark.master=local,表明Spark是本地運行模式
2)Program arguments:傳入要統計的文件地址。
3)勾選包含scope值爲Provided

4.3 運行程序

在JavaWordCount類點擊鼠標右鍵,選擇Run “JavaWordCount.main()” with Coverage
在這裏插入圖片描述
運行結果會打印在控制檯:
在這裏插入圖片描述

4.4 遇到問題

1)編譯成功,運行過程還報XX類缺失
打開idea的Maven Projects,在對應的模塊上面點擊鼠標右鍵執行“Generate Sources and Update Folders For All Projects”即可。
2)運行過程中報java.lang.NoClassDefFoundError異常
Provided的作用是打包過程中會將帶有Provided的依賴exclude,可以減輕發佈包的大小。但在本實驗中,我們需要在運行wc案例的時候依賴這些組件,如果不勾選,運行時候就找不到相關依賴,會報java.lang.NoClassDefFoundError異常。
在這裏插入圖片描述

5 參考文獻

  1. 《Spark源碼分析調試環境搭建》 https://zhuanlan.zhihu.com/p/30333691
  2. Apache spark官方文檔
  3. 耿嘉安,Spark內核設計的藝術:架構設計與實現 第1版. 2018, 機械工業出版社.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章