Note:git
環境的基本配置能夠參考我這裏轉載的這篇文章,固然我本身嘗試的時候仍是會出現其它的問題,若是有,那麼參考下面兩篇文章的案例:github
https://blog.51cto.com/wangyuguo/1981837 shell
https://www.mail-archive.com/search?l=user@spark.apache.org&q=subject:%22Build+error%22&o=newest&f=1 apache
搞定以後,終於就能夠拋開爲了寫業務而寫業務Spark代碼的煩惱,靜靜地研究Spark的底層原理吧!intellij-idea
轉載自https://github.com/linbojin/spark-notes/blob/master/ide-setup.mdmaven
搭建Spark源碼研讀和代碼調試的開發環境ide
工欲善其事,必先利其器,第一篇筆記介紹如何搭建源碼研讀和代碼調試的開發環境。 一些必要的開發工具,請自行提早安裝:工具
scala 2.11.8開發工具
sbt 0.13.12測試
maven 3.3.9
git 2.10.2
IntelliJ IDEA 2016.3 (scala plugin)
本人使用macOS 10.12,全部筆記都基於這個系統,可是其餘系統也能夠很容易找到對應的解決方案,好比IDE的快捷鍵。
能夠直接從Spark官方Github倉庫拉取。本系列筆記基於Spark 2.1.0這個版本,因此先checkout這個tag,再進行以後的步驟:
$ git clone git@github.com:apache/spark.git $ cd spark $ git tag $ git checkout v2.1.0 $ git checkout -b pin-tag-210
若是想要push本身的commits,也能夠fork到本身的Github帳號下,再拉取到本地,能夠參考我以前的文章:Reading Spark Souce Code in IntelliJ IDEA
參考官方文檔,編譯很簡單,這裏使用4個線程,跳過tests,以此加速編譯。這個編譯會產生一些必要的源代碼,如Catalyst項目下的,因此是必要的一步:
$ ./build/mvn -T 4 -DskipTests clean package# 編譯完成後,測試一下 $ ./bin/spark-shell
如今IDEA對scala支持已經比較完善,導入Spark工程很是簡單:
Menu -> File -> Open -> {spark dir}/pom.xml -> Open as Project
導入工程後,介紹一下如何運行Spark項目自帶的實例代碼,在{spark dir}/examples/
目錄下,這裏以LogQuery
爲例:
command + o -> 輸入LogQuery打開
Menu -> Run -> Edit Configurations -> 選擇 + -> Application
參數配置以下: VM options: -Dspark.master=local
表明使用本地模式運行Spark代碼,也能夠選擇其餘模式。 保存配置後,能夠看到LogQuery
在運行選項裏了:
首次運行LogQuery
會報錯,由於IDE找不到flume依賴的部分源碼: 解決方案以下:
Menu -> File -> Project Structure -> Modules -> spark-streaming-flume-sink_2.11 -> Sources
把 target目錄加入Sources(點擊藍色Sources)
把子目錄sink也加入Sources
再次運行,此次會花費比較長的時間,由於已經能夠成功編譯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的。
千辛萬苦地終於讓實例代碼在IDE裏跑起來了,是否是頗有成就感。其實作了那麼多的鋪墊工做,在IDE裏面運行代碼的最大福利是能夠單步調試! 很簡單,選擇斷點,而後Run -> Debug
,能夠看到中間變量值等等,其餘的自行探索吧: