我们先看下 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 的。
关于填 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。像下图这样的利用率才是正常的。