spark源碼單步跟蹤閱讀-從毛片提及

想當年讀大學時,那時毛片還叫毛片,如今有文明的叫法了,叫小電影或者愛情動做片。那時宿舍有位大神,喜歡看各類毛片,當咱們糾結於毛片上的馬賽克時,大神大手一揮說道:這算啥,閱盡天下毛片,心中天然無碼!忽然想到咱們在學習spark時,也能夠有這種精神,當咱們能讀懂spark源碼時,spark的技術世界也就真正爲咱們敞開了大門。臺灣C++大師侯捷說過:源碼面前,了無祕密!那咱們就從如何單步調試spark源碼開始講起吧。html

 

首先開發工具推薦你們選擇IntelliJ,Intellij在和scala語言的結合上,比eclipse要好出太多了,其高效的文件索引機制,也可讓咱們很是快速的定位源碼。不要太擔憂快捷鍵的問題,IntelliJ爲了拉eclipse的用戶過來,能夠將快捷鍵映射爲eclipse經常使用快捷鍵,學習成本低了不少。java

 

1.本地調試sql

package com.tencent.cubeli.sparksqlapache

import org.apache.spark.{SparkConf, SparkContext}json

import org.apache.spark.sql.SparkSessionapi

 

object DataFrameCreate {app

? def main(args: Array[String]): Unit={eclipse

? ? val conf=new SparkConf().setMaster("local").setAppName("df create")jvm

? ? val sc=new SparkContext(conf)socket

? ? 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")

? ? df.filter($"nationkey"<9).

? ? ?groupBy("regionkey").

? ? ?count.

? ? ? show()

? ?}

}

 

 

 

 

在提交了運行以後,程序會在斷點處中止,等待單步調試,以下圖所示:

 

點擊step in,咱們就能夠進入到這個filter方法內部進行源碼的跟蹤了。

 

2.遠程調試

當咱們的代碼提交到yarn上以後,就是一個分佈式運行的模式了,這時就無法經過IDE去啓動本地的單步調試,這時就須要使用遠程調試方式。這種方式eclipse也有,並非ideallij獨有的,而是java語言爲咱們提供的,IDE工具只不過利用了這個特性而已。遠程調試步驟以下:

咱們後期在知識星球上陸陸續續的源碼講解,都是基於Spark 2.3.0這個版本,下載地址:

http://spark.apache.org/downloads.html

在下拉框選擇2.3.0和Source Code

 

 

 

 

 

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

(導入後intellij要進行工程的依賴解析,可是由於咱們以前進行過編譯,須要的依賴包已經從遠程maven倉庫下載到了本地,因此這裏的依賴接下沒有下載過程,只是一個簡單的的本地解析)

 

點擊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

關於這個配置的兩點說明:

1) 其中的spark.driver.extraJavaOptions是用來調試driver的,spark.executor.extraJavaOptions是用來調試executor的,若是driver和executor不在同一個節點,那麼端口能夠相同,若是在同一個節點,那麼端口不能同樣。

2) 若是suspend=y,說明spark進程在啓動時會掛起來,等待ideallij遠程鏈接成功以後在繼續啓動;gallop若是是n,那麼不用等待ideallij遠程鏈接,就啓動,可是會一直監聽這個端口,等待ideallij遠程鏈接。

? ? ?等spark進程掛起或者啓動成功以後(根據suspend是y或者n來決定),在ideallij中設置斷點,並啓動剛纔配置的遠程鏈接,就能夠鏈接到spark的jvm進程上,並進行遠程的單步調試了 。

 

總結:spark的學習必定要涉及源碼的閱讀,光學會使用api是寫很差spark程序,要沒法進行spark性能調優的。當你的斷點中止在spark的api方法時,step in了,就有一個全新的技術世界爲了敞開大門;step over了,你就一直是個碼農。更多spark經驗分享,請加入spark技術學院,bat大牛爲你指點迷津!

 

 

 


文章來源:https://blog.csdn.net/rlnLo2pNEfx9c/article/details/80429052

相關文章
相關標籤/搜索