ideallij中單步調試spark源碼的兩種方法

該篇文章介紹多種在ideallij中單步調試spark源碼的方法,以sparksql為例來進行說明

方法一 直接通過app的方式進行單步調試

本方法假設開發者已經搭建了spark在ideallij中的的運行環境,并且可以成功運行(注意,是ideallij中運行,而不是通過打jar包的方式運行)

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模式運行sparksql,這種方式的優點是driver和executor都在同一個本地jvm中,在單步調試時既可以跟蹤driver流程,也可以跟蹤executor流程。如果不設置成local模式,那么只能在本地跟蹤driver的處理流程。

在app中設置斷點

如下圖所示:

調試,點下圖的蟲子標志

在提交了運行之后,程序會在斷點處停止,等待單步調試,如下圖所示:

下載源碼

在上一步停止之后,點擊step in(根據keymap映射不同點擊的按鍵有所不同)進入方法,在第一次進入時,ideallij會顯示這個方法是它通過反編譯反編譯出來的,這種代碼雖然也可用于調試,但是不包含注釋等信息,但是右上角會有一個提示讓下載源碼,點擊下載源碼,ideallij后臺就會去遠程maven倉庫下載*source.jar,并自動添加到工程的源碼依賴中,這時就可以單步調試spark的源碼了

可以看到,這種方式的優點是簡便,易于操作,但是缺點也很明顯,單步調試的源碼并非我們自己的源碼,而是從mavne倉庫下載的*source.jar文件,如果我們自己修改了源碼,就得在maven打包時,打出*source.jar文件,并install到本地maven倉庫,才能保證單步調試的是最新的spark源碼。

方法二?遠程調試方式

該方法要利用ideallij的遠程調試功能,eclipse里也有該功能。該方法的優點是,可以調試現網已經在運行的spark集群,缺點是配置稍微優點麻煩。

導入源碼

選擇spark源碼根目錄,點擊“maven”,然后next

這時會有很多maven進行構建時的很多profile讓選擇,可以根據實際情況進行勾選,不勾選就是用默認的profile:

一路點擊next,可以根據實際情況進行修改,不修改也可以,最后點檢完成,執行spark源碼導入,idealilij會進行該工程的依賴解析,等解析完成后就可以在package試圖看到該工程的包試圖,說明導入成功。

配置遠程調試

點擊Edit Configurations...

點擊“+”,選擇remote

配置jvm遠程調試選項,主要是host和port需要修改成spark進程所在的host和jmx端口號,如下圖,可以修改“Name:”,“Host”,“Port”,這里的host一定要是spark運行的主機,port需要是遠程沒有被使用的端口,并且要記住此端口,待會要用。

配置完之后保存。

在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是用來調試driver的,spark.executor.extraJavaOptions是用來調試executor的,如果driver和executor不在同一個節點,那么端口可以相同,如果在同一個節點,那么端口不能一樣。如果suspend=y,說明spark進程在啟動時會掛起來,等待ideallij遠程連接成功之后在繼續啟動;如果是n,那么不用等待ideallij遠程連接,就啟動,但是會一直監聽這個端口,等待ideallij遠程連接。

連接

等spark進程掛起或者啟動成功之后(根據suspend是y或者n來決定),在ideallij中設置斷點,并啟動剛才配置的遠程連接,就可以連接到spark的jvm進程上,并進行遠程的但不調試了

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容