今天不談spark中什麼複雜的技術實作,隻稍為聊聊如何進行代碼跟讀。衆所周知,spark使用scala進行開發,由于scala有衆多的文法糖,很多時候代碼跟着跟着就覺着線索跟丢掉了,另外spark基于akka來進行消息互動,那如何知道誰是接收方呢?
代碼跟讀的時候,經常會借助于日志,針對日志中輸出的每一句,我們都很想知道它們的調用者是誰。但有時苦于對spark系統的了解程度不深,或者對scala認識不夠,一時半會之内無法找到答案,那麼有沒有什麼簡便的辦法呢?
我的辦法就是在日志出現的地方加入下面一句話
現在舉一個實際的例子來說明問題。
比如我們在啟動spark-shell之後,輸入一句非常簡單的sc.textfile("readme.md"),會輸出下述的log
那我很想知道是第二句日志所在的trytoput函數是被誰調用的該怎麼辦?
辦法就是打開memorystore.scala,找到下述語句
在這句話之上,添加如下語句
然後,重新進行源碼編譯
再次打開spark-shell,執行sc.textfile("readme.md"),就可以得到如下輸出,從中可以清楚知道trytoput的調用者是誰
對代碼作了修改之後,如果并不想送出代碼,那該如何将最新的内容同步到本地呢?
追蹤消息的接收者是誰,相對來說比較容易,隻要使用好grep就可以了,當然前提是要對actor model有一點點了解。
還是舉個執行個體吧,我們知道coarsegrainedschedulerbackend會發送launchtask消息出來,那麼誰是接收方呢?隻需要執行以下腳本即可。
從如下的輸出中,可以清楚看出coarsegrainedexecutorbackend是launchtask的接收方,接收到該函數之後的業務處理,隻需要去看看接收方的receive函數即可。
今天的内容相對簡單,沒有技術含量,自己做個記述,免得時間久了,不記得。
上篇博文講述了如何通過修改源碼來檢視調用堆棧,盡管也很實用,但每修改一次都需要編譯,花費的時間不少,效率不高,而且屬于侵入性的修改,不優雅。本篇講述如何使用intellij idea來跟蹤調試spark源碼。
本文假設開發環境是在linux平台,并且已經安裝下列軟體,我個人使用的是arch linux。
jdk
scala
sbt
intellij-idea-community-edition
為idea安裝scala插件,具體步驟如下:
選擇file->setting
2. 選擇右側的install jetbrains plugin,在彈出視窗的左側輸入scala,然後點選安裝,如下圖所示:
3. scala插件安裝結束,需要重新開機idea生效
由于idea 13已經原生支援sbt,是以無須為idea安裝sbt插件。
下載下傳源碼,假設使用git同步最新的源碼:
導入spark源碼
1. 選擇file->import project, 在彈出的視窗中指定spark源碼目錄
2. 選擇項目類型為sbt project,然後點選next
3. 在新彈出的視窗中先選中"use auto-import",然後點選finish
導入設定完成,進入漫長的等待,idea會對導入的源碼進行編譯,同時會生成檔案索引。
如果在提示欄出現如下的提示内容"is waiting for .sbt.ivy.lock",說明該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.
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", 大功告成,如下圖所示,可以檢視變量和調用堆棧了。