搭建Spark源碼研讀和代碼調試的開發環境
工欲善其事,必先利其器,第一篇筆記介紹如何搭建源碼研讀和代碼調試的開發環境。 一些必要的開發工具,請自行提前安裝:
- scala 2.11.8
- sbt 0.13.12
- maven 3.3.9
- git 2.10.2
- IntelliJ IDEA 2016.3 (scala plugin)
源碼獲取與編譯
從Github上獲取Spark源碼
可以直接從Spark官方Github倉庫拉取。本系列筆記基於Spark 2.0.2這個版本,所以先checkout這個tag,再進行之後的步驟:
$ git clone [email protected]:apache/spark.git
$ cd spark
$ git tag
$ git checkout v2.0.2
$ git checkout -b pin-tag-202
如果想要push自己的commits,也可以fork到自己的Github賬號下,再拉取到本地
編譯Spark項目
參考官方文檔,編譯很簡單,這裏使用4個線程,跳過tests,以此加速編譯。這個編譯會產生一些必要的源代碼,如Catalyst項目下的,所以是必要的一步:
$ build/mvn -T 4 -DskipTests clean package
# 編譯完成後,測試一下
$ ./bin/spark-shell
源碼導入與代碼運行
導入源碼到Intellij IDEA 16
現在IDEA對scala支持已經比較完善,導入Spark工程非常簡單:
Menu -> File -> Open -> {spark dir}/pom.xml -> Open as Project
運行實例代碼
導入工程後,介紹一下如何運行Spark項目自帶的實例代碼,在{spark dir}/examples/
目錄下,這裏以LogQuery
爲例:
command + o -> 輸入LogQuery打開
1. 配置運行參數:
Menu -> Run -> Edit Configurations -> 選擇 + -> Application
參數配置如下: VM
options: -Dspark.master=local
代表使用本地模式運行Spark代碼,也可以選擇其他模式。 保存配置後,可以看到LogQuery
在運行選項裏了:
2. 添加缺失的flume sink源代碼
首次運行LogQuery
會報錯,因爲IDE找不到flume依賴的部分源碼: 解決方案如下:
Menu -> File -> Project Structure -> Modules -> spark-streaming-flume-sink_2.11 -> Sources 1. 把 target目錄加入Sources(點擊藍色Sources) 2. 把子目錄sink也加入Sources
3. 添加運行依賴的jars
再次運行,這次會花費比較長的時間,因爲已經可以成功編譯LogQuery
啦,但是還是沒能運行成功,報錯如下: 不要慌,這說明你的代碼編譯已經成功啦,運行出錯的原因是,運行Spark
App一般都是通過spark-submit
命令,把你的jar運行到已經安裝的Spark環境裏,也就是所有的Spark依賴都已經有啦,現在你用IDE的方式,就會缺少依賴。
解決方案如下:
Menu -> File -> Project Structure -> Modules -> spark-examples_2.11 -> Dependencies 添加依賴 jars -> {spark dir}/spark/assembly/target/scala-2.11/jars/
有兩點需要注意:
-
jars/*.jar: 這些依賴jars是在第一步編譯打包Spark項目的時候產生的,如果這個目錄是空的,或者修改了源代碼想更新這些jars,可以用同樣的命令再次編譯Spark:
$ build/mvn -T 4 -DskipTests clean package
-
從上圖中右側的Scope一欄可以看到,基本上所有依賴jars都是Provided,也就是說默認都是提供的,因爲默認都是用
spark-submit
方式運行Spark App的。
4. 成功運行實例代碼
單步調試源代碼
千辛萬苦地終於讓實例代碼在IDE裏跑起來了,是不是很有成就感。其實做了那麼多的鋪墊工作,在IDE裏面運行代碼的最大福利是可以單步調試! 很簡單,選擇斷點,然後Run -> Debug
,可以看到中間變量值等等,其他的自行探索吧: