歡迎轉載,轉載請注明出處,徽滬一郎。
概要
上篇博文講述了如何通過修改源碼來查看調用堆棧,盡管也很實用,但每修改一次都需要編譯,花費的時間不少,效率不高,而且屬於侵入性的修改,不優雅。本篇講述如何使用intellij idea來跟蹤調試spark源碼。
前提
本文假設開發環境是在Linux平台,並且已經安裝下列軟件,我個人使用的是arch linux。
- jdk
- scala
- sbt
- intellij-idea-community-edition
安裝scala插件
為idea安裝scala插件,具體步驟如下
- 選擇File->Setting
2 步驟2: 選擇右側的Install Jetbrains Plugin,在彈出窗口的左側輸入scala,然后點擊安裝,如下圖所示
3. scala插件安裝結束,需要重啟idea生效
由於idea 13已經原生支持sbt,所以無須為idea安裝sbt插件。
源碼下載和導入
下載源碼,假設使用git同步最新的源碼
git clone https://github.com/apache/spark.git
導入Spark源碼
1. 選擇File->Import Project, 在彈出的窗口中指定spark源碼目錄
2. 選擇項目類型為sbt project,然后點擊next
3. 在新彈出的窗口中先選中"Use auto-import",然后點擊Finish
導入設置完成,進入漫長的等待,idea會對導入的源碼進行編譯,同時會生成文件索引。
如果在提示欄出現如下的提示內容"is waiting for .sbt.ivy.lock",說明該lock文件無法創建,需要手工刪除,具體操作如下
cd $HOME/.ivy2
rm *.lock
手工刪除掉lock之后,重啟idea,重啟后會繼續上次沒有完成的sbt過程。
源碼編譯
使用idea來編譯spark源碼,中間會有多次出錯,問題的根源是sbt/sbt gen-idea的時候並沒有很好的解決依賴關系。
解決辦法如下,
1. 選擇File->Project Structures
2. 在右側dependencies中添加新的module,
選擇spark-core
其它模塊如streaming-twitter, streaming-kafka, streaming-flume, streaming-mqtt出錯的情況解決方案與此類似。
注意Example編譯報錯時的處理稍有不同,在指定Dependencies的時候,不是選擇Library而是選擇Module dependency,在彈出的窗口中選擇sql.
有關編譯出錯問題的解決可以看一下這個鏈接,http://apache-spark-user-list.1001560.n3.nabble.com/Errors-occurred-while-compiling-module-spark-streaming-zeromq-IntelliJ-IDEA-13-0-2-td1282.html
調試LogQuery
1. 選擇Run->Edit configurations
2. 添加Application,注意右側窗口中配置項內容的填寫,分別為Main class, vm options, working directory, use classpath of module
-Dspark.master=local 指定Spark的運行模式,可根據需要作適當修改。
3. 至此,在Run菜單中可以發現有"Run LogQuery"一項存在,嘗試運行,保證編譯成功。
4. 斷點設置,在源文件的左側雙擊即可打上斷點標記,然后點擊Run->"Debug LogQuery", 大功告成,如下圖所示,可以查看變量和調用堆棧了。
參考