Spark on K8S模塊的代碼又臭又長,離我們上生產(chǎn)環(huán)境,也就一個debug的距離。干干巴巴,麻麻咧咧,盤它。。。
前置條件
-
你有一個可以提交 Spark on k8s 作業(yè)的 k8s 集群,可以參考https://spark.apache.org/docs/latest/running-on-kubernetes.html,自己搭一個玩玩
- 理論上沒有也沒關系,因為我們客戶端進程只是一個本地的java程序,只是如果沒有真正的 k8s 集群,這個作業(yè)在debug到一定階段會走不下去而已
-
一只你熟練使用的 IDE
- 推薦 Intellj IDEA
一份新鮮熱乎的 Spark 源碼
-
一坨打包過的Spark package
- 可以根據(jù)上面的spark源碼自己打包 - building-a-runnable-distribution
- 也可以下載 release,然后將代碼 checkout 到對應的 tag
原理說明

上圖所示是 Spark 官方文檔中的 Spark on k8s 的架構圖,圖很簡單,左邊的 Client 和右邊的 k8s 集群,其中 client 通過 spark-submit 接口和 k8s 集群進行交互,主要完成的是Spark Driver Pod的構建,當然由于本文主要講的是 Client 進程調(diào)試相關的東西,后面的細節(jié)就先擱置了。
配置 IDE
通過 Remote 模板新建一份配置,默認的話 Host 的指向的一般是localhost,如果你在遠程的機器上啟動 spark-submit 進程,需要正確的設置Host,我們本地提交的話,直接改個name就可以使用了,如下圖所示,

我們需要復制 Command line arguments for remote JVM 的內(nèi)容,來配置到 spark-submit 進程的 java options里。
配置SPARK_SUBMIT_OPTS
設置 spark-submit 的客戶端 java 參數(shù)可以通過 SPARK_SUBMIT_OPTS 環(huán)境變量來搞定,具體如下,
echo SPARK_SUBMIT_OPTS=\"-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=50014\" >> conf/spark-env.sh
開始調(diào)試
我們使用spark自帶的示例程序 org.apache.spark.examples.HdfsTest 來進行調(diào)試,
Kent@KentsMacBookPro ~/Documents/spark-on-k8s/spark-3.0.0-SNAPSHOT-bin-2.7.3 bin/spark-submit \
--master k8s://https://10.120.238.100:7443 \
--name hehe \
--deploy-mode cluster \
--class org.apache.spark.examples.HdfsTest \
local:///opt/spark/examples/jars/spark-examples_2.12-3.0.0-SNAPSHOT.jar \
hdfs://hz-cluster10/user/kyuubi/hive_db/kyuubi.db/hive_tbl
當出現(xiàn)如下打印信息,即可切換到 IDE 中點擊 debug 按鈕。
Listening for transport dt_socket at address: 50014
當然,在這之前,必須要在合適的位置加上斷點。

運氣好的話,啟動 debug 后,你就可以在如下位置進入斷點。

我們注意到這個類中有一個 KubernetesClient 對象,我們試著用它來和 k8s 集群做個親密交互。

上面的例子是訪問我在 k8s 上提前建立好的一個ConfigMap。
所以我們可以看到 Client 進程中主要就是實例化了一個 KubernetesClient 對象來達到了和 k8s 集群,也就是 api server 的交互,完成對Spark Driver Pod的描述。
總結
文章很長,干干巴巴,麻麻咧咧,其實就是設置一個 SPARK_SUBMIT_OPTS 環(huán)境變量的事情,233333~