天天看點

【Spark Operator】核數設定Cores/Cores Limit/Cores Request,你搞清楚沒有?

我們先看下 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           

複制

【Spark Operator】核數設定Cores/Cores Limit/Cores Request,你搞清楚沒有?
【Spark Operator】核數設定Cores/Cores Limit/Cores Request,你搞清楚沒有?

如果看 on k8s 部分的源碼,你會發現

spark.kubernetes.driver.request.cores

沒有設定,

spark.driver.cores

是會作為其替補值注入的。是以最重要的參數是

spark.driver.cores

spark.kubernetes.driver.limit.cores

【Spark Operator】核數設定Cores/Cores Limit/Cores Request,你搞清楚沒有?

但是如果你

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 的。

【Spark Operator】核數設定Cores/Cores Limit/Cores Request,你搞清楚沒有?

就是這個 default 方法會把 core 設定為預設1

【Spark Operator】核數設定Cores/Cores Limit/Cores Request,你搞清楚沒有?
【Spark Operator】核數設定Cores/Cores Limit/Cores Request,你搞清楚沒有?
【Spark Operator】核數設定Cores/Cores Limit/Cores Request,你搞清楚沒有?

關于填

spark.driver.cores

spark.kubernetes.driver.request/limit.cores

,還可以通過 SparkUI 的 Enviroment Tab 去确認,到底設定對了沒有,另外,還可以通過 task 的并行度來檢視,比如說 Executor 申請了4個核,如果發現并行度隻有1,也就是所有 task 是串行執行的,就有必要檢查一下

spark.executor.cores

的設定了。

【Spark Operator】核數設定Cores/Cores Limit/Cores Request,你搞清楚沒有?
【Spark Operator】核數設定Cores/Cores Limit/Cores Request,你搞清楚沒有?
【Spark Operator】核數設定Cores/Cores Limit/Cores Request,你搞清楚沒有?

如果這幾個 core 的參數沒有設定正确,最大的問題就是資源 cpu 使用率了,容器申請了 4 個核,實際上隻用到了1個核o(╯□╰)o。像下圖這樣的使用率才是正常的。

【Spark Operator】核數設定Cores/Cores Limit/Cores Request,你搞清楚沒有?