該篇文章介紹多種在ideallij中單步調(diào)試spark源碼的方法,以sparksql為例來進(jìn)行說明
方法一 直接通過app的方式進(jìn)行單步調(diào)試
本方法假設(shè)開發(fā)者已經(jīng)搭建了spark在ideallij中的的運(yùn)行環(huán)境架专,并且可以成功運(yùn)行(注意废岂,是ideallij中運(yùn)行,而不是通過打jar包的方式運(yùn)行)
app源碼
package com.tencent.cubeli.sparksql
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.sql.SparkSession
object DataFrameCreate {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setMaster("local").setAppName("df create")
val sc = new SparkContext(conf)
val spark = SparkSession.builder().appName("Spark SQL basic example").config("spark.some.config.option", "some-value").getOrCreate()
import spark.implicits._
val df = spark.read.json("file:///Users/waixingren/bigdata-java/spark/sparkproj/data/nation.json")
//??? println("=========group by sum wich dataframe===================")
df.
filter($"nationkey"<9).
groupBy("regionkey").
count.
show()
}
}
注意展辞,以上是以local模式運(yùn)行sparksql,這種方式的優(yōu)點(diǎn)是driver和executor都在同一個本地jvm中,在單步調(diào)試時既可以跟蹤driver流程金吗,也可以跟蹤executor流程。如果不設(shè)置成local模式趣竣,那么只能在本地跟蹤driver的處理流程摇庙。
在app中設(shè)置斷點(diǎn)
如下圖所示:
調(diào)試,點(diǎn)下圖的蟲子標(biāo)志
在提交了運(yùn)行之后遥缕,程序會在斷點(diǎn)處停止卫袒,等待單步調(diào)試,如下圖所示:
下載源碼
在上一步停止之后单匣,點(diǎn)擊step in(根據(jù)keymap映射不同點(diǎn)擊的按鍵有所不同)進(jìn)入方法夕凝,在第一次進(jìn)入時,ideallij會顯示這個方法是它通過反編譯反編譯出來的户秤,這種代碼雖然也可用于調(diào)試码秉,但是不包含注釋等信息,但是右上角會有一個提示讓下載源碼鸡号,點(diǎn)擊下載源碼转砖,ideallij后臺就會去遠(yuǎn)程maven倉庫下載*source.jar,并自動添加到工程的源碼依賴中膜蠢,這時就可以單步調(diào)試spark的源碼了
可以看到堪藐,這種方式的優(yōu)點(diǎn)是簡便,易于操作挑围,但是缺點(diǎn)也很明顯礁竞,單步調(diào)試的源碼并非我們自己的源碼,而是從mavne倉庫下載的*source.jar文件杉辙,如果我們自己修改了源碼模捂,就得在maven打包時,打出*source.jar文件,并install到本地maven倉庫狂男,才能保證單步調(diào)試的是最新的spark源碼综看。
方法二?遠(yuǎn)程調(diào)試方式
該方法要利用ideallij的遠(yuǎn)程調(diào)試功能,eclipse里也有該功能岖食。該方法的優(yōu)點(diǎn)是红碑,可以調(diào)試現(xiàn)網(wǎng)已經(jīng)在運(yùn)行的spark集群,缺點(diǎn)是配置稍微優(yōu)點(diǎn)麻煩泡垃。
導(dǎo)入源碼
選擇spark源碼根目錄析珊,點(diǎn)擊“maven”,然后next
這時會有很多maven進(jìn)行構(gòu)建時的很多profile讓選擇蔑穴,可以根據(jù)實(shí)際情況進(jìn)行勾選忠寻,不勾選就是用默認(rèn)的profile:
一路點(diǎn)擊next,可以根據(jù)實(shí)際情況進(jìn)行修改存和,不修改也可以奕剃,最后點(diǎn)檢完成,執(zhí)行spark源碼導(dǎo)入捐腿,idealilij會進(jìn)行該工程的依賴解析纵朋,等解析完成后就可以在package試圖看到該工程的包試圖,說明導(dǎo)入成功茄袖。
配置遠(yuǎn)程調(diào)試
點(diǎn)擊Edit Configurations...
點(diǎn)擊“+”倡蝙,選擇remote
配置jvm遠(yuǎn)程調(diào)試選項(xiàng),主要是host和port需要修改成spark進(jìn)程所在的host和jmx端口號绞佩,如下圖,可以修改“Name:”猪钮,“Host”品山,“Port”,這里的host一定要是spark運(yùn)行的主機(jī)烤低,port需要是遠(yuǎn)程沒有被使用的端口肘交,并且要記住此端口,待會要用扑馁。
配置完之后保存涯呻。
在spark-defaults.conf文件中添加以下配置:
spark.driver.extraJavaOptions? -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005
spark.executor.extraJavaOptions? -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
其中的spark.driver.extraJavaOptions是用來調(diào)試driver的,spark.executor.extraJavaOptions是用來調(diào)試executor的腻要,如果driver和executor不在同一個節(jié)點(diǎn)复罐,那么端口可以相同,如果在同一個節(jié)點(diǎn)雄家,那么端口不能一樣效诅。如果suspend=y,說明spark進(jìn)程在啟動時會掛起來,等待ideallij遠(yuǎn)程連接成功之后在繼續(xù)啟動乱投;如果是n咽笼,那么不用等待ideallij遠(yuǎn)程連接,就啟動戚炫,但是會一直監(jiān)聽這個端口剑刑,等待ideallij遠(yuǎn)程連接。
連接
等spark進(jìn)程掛起或者啟動成功之后(根據(jù)suspend是y或者n來決定)双肤,在ideallij中設(shè)置斷點(diǎn)施掏,并啟動剛才配置的遠(yuǎn)程連接,就可以連接到spark的jvm進(jìn)程上杨伙,并進(jìn)行遠(yuǎn)程的但不調(diào)試了