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 參考文獻
- 《Spark源碼分析調試環境搭建》 https://zhuanlan.zhihu.com/p/30333691
- Apache spark官方文檔
- 耿嘉安,Spark內核設計的藝術:架構設計與實現 第1版. 2018, 機械工業出版社.