天天看點

Apache Spark源碼走讀(九)如何進行代碼跟讀&使用Intellij idea調試Spark源碼

今天不談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

Apache Spark源碼走讀(九)如何進行代碼跟讀&使用Intellij idea調試Spark源碼

2. 選擇右側的install jetbrains plugin,在彈出視窗的左側輸入scala,然後點選安裝,如下圖所示:

Apache Spark源碼走讀(九)如何進行代碼跟讀&使用Intellij idea調試Spark源碼

 3. scala插件安裝結束,需要重新開機idea生效

由于idea 13已經原生支援sbt,是以無須為idea安裝sbt插件。

下載下傳源碼,假設使用git同步最新的源碼:

導入spark源碼

   1. 選擇file->import project, 在彈出的視窗中指定spark源碼目錄

Apache Spark源碼走讀(九)如何進行代碼跟讀&使用Intellij idea調試Spark源碼

   2. 選擇項目類型為sbt project,然後點選next

Apache Spark源碼走讀(九)如何進行代碼跟讀&使用Intellij idea調試Spark源碼

   3. 在新彈出的視窗中先選中"use auto-import",然後點選finish

Apache Spark源碼走讀(九)如何進行代碼跟讀&使用Intellij idea調試Spark源碼

導入設定完成,進入漫長的等待,idea會對導入的源碼進行編譯,同時會生成檔案索引。

如果在提示欄出現如下的提示内容"is waiting for .sbt.ivy.lock",說明該lock檔案無法建立,需要手工删除,具體操作如下:

手工删除掉lock之後,重新開機idea,重新開機後會繼續上次沒有完成的sbt過程。

使用idea來編譯spark源碼,中間會有多次出錯,問題的根源是sbt/sbt gen-idea的時候并沒有很好的解決依賴關系。

解決辦法如下,

   1. 選擇file->project structures

   2. 在右側dependencies中添加新的module

Apache Spark源碼走讀(九)如何進行代碼跟讀&使用Intellij idea調試Spark源碼

選擇spark-core

Apache Spark源碼走讀(九)如何進行代碼跟讀&使用Intellij idea調試Spark源碼

其它子產品如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

Apache Spark源碼走讀(九)如何進行代碼跟讀&使用Intellij idea調試Spark源碼

-dspark.master=local 指定spark的運作模式,可根據需要作适當修改。

3. 至此,在run菜單中可以發現有"run logquery"一項存在,嘗試運作,保證編譯成功。

4. 斷點設定,在源檔案的左側輕按兩下即可打上斷點标記,然後點選run->"debug logquery", 大功告成,如下圖所示,可以檢視變量和調用堆棧了。

Apache Spark源碼走讀(九)如何進行代碼跟讀&使用Intellij idea調試Spark源碼

繼續閱讀