我們先看下 Spark 3.0 官方文檔,關于幾個 Core 的參數的解讀。
spark.driver.cores
spark.kubernetes.driver.request.cores
spark.kubernetes.driver.limit.cores
spark.executor.cores
spark.kubernetes.executor.request.cores
spark.kubernetes.executor.limit.cores
複制

如果看 on k8s 部分的源碼,你會發現
spark.kubernetes.driver.request.cores
沒有設定,
spark.driver.cores
是會作為其替補值注入的。是以最重要的參數是
spark.driver.cores
和
spark.kubernetes.driver.limit.cores
。
但是如果你
spark.kubernetes.driver.request.cores=4
也填了,
spark.driver.cores=1
也填了,那麼實際上這個 Driver Pod 和 Driver 程序分别是見到幾個 core 呢?
筆者測試過,如果安裝上述方式填入的話,Driver Pod 的 Driver 容器依然是以4個 cores 的資源量建立的,不信可以進入容器
ls /proc/cpuinfo
檢視一下。但是 Driver 程序其實隻會認為隻有1個 core,原因很簡單,這個
spark.driver.core
跟 on Yarn/Standalone/Local 模式是一樣的,那些叢集模式都沒有
spark.kubernetes.driver.request.cores
這些參數,是以當然也隻看
spark.driver.cores
了,給 Driver 程序配置設定的核數就隻有1個,當然了,Executor 的 Cores 參數也是一樣的。
需要提醒的是,Spark Operator,也需要填好幾個 Core 的參數,而且這是在 CRD 的 Validation 有做校驗的。是以正常安裝 Spark Operator,至少是需要填
cores
和
coreLimit
的,但是如果
core
沒填,Validation 是會給加個預設的最小值1的,是以這裡一定要注意,不要以為 Spark Application 填了
coreLimit
和
coreRequets
就夠了,如果
core
沒填,會給塞一個
spark.driver.cores=1
進去 SparkConf 的。
就是這個 default 方法會把 core 設定為預設1
關于填
spark.driver.cores
和
spark.kubernetes.driver.request/limit.cores
,還可以通過 SparkUI 的 Enviroment Tab 去确認,到底設定對了沒有,另外,還可以通過 task 的并行度來檢視,比如說 Executor 申請了4個核,如果發現并行度隻有1,也就是所有 task 是串行執行的,就有必要檢查一下
spark.executor.cores
的設定了。
如果這幾個 core 的參數沒有設定正确,最大的問題就是資源 cpu 使用率了,容器申請了 4 個核,實際上隻用到了1個核o(╯□╰)o。像下圖這樣的使用率才是正常的。