想當年讀大學時,那時毛片還叫毛片,如今有文明的叫法了,叫小電影或者愛情動做片。那時宿舍有位大神,喜歡看各類毛片,當咱們糾結於毛片上的馬賽克時,大神大手一揮說道:這算啥,閱盡天下毛片,心中天然無碼!忽然想到咱們在學習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