编写 SparkApplication
与所有其他 Kubernetes API 对象一样,SparkApplication
需要 apiVersion
、kind
和 metadata
字段。有关使用清单文件的常规信息,请参阅使用 kubectl 进行对象管理。
SparkApplication
还需要一个 .spec
节。该节包含用于指定应用程序各种方面的字段,包括其类型(Scala
、Java
、Python
或 R
)、部署模式(cluster
或 client
)、主应用程序资源 URI(例如,应用程序 jar 的 URI)、主类、参数等。还通过可选字段 .spec.nodeSelector
支持节点选择器。
它还包含用于指定统一容器镜像(用于 driver 和 executors)和镜像拉取策略的字段,即分别为 .spec.image
和 .spec.imagePullPolicy
。如果需要使用自定义 init-container 镜像(在 driver 和 executor pod 中),可以使用可选字段 .spec.initContainerImage
来指定。如果设置了 .spec.initContainerImage
,它将覆盖 .spec.image
作为 init-container 镜像。否则,将使用 .spec.image
指定的镜像作为 init-container 镜像。如果 .spec.image
和 .spec.initContainerImage
均未设置,则无效。
以下是一个示例,展示了 SparkApplication
规范的一部分
apiVersion: sparkoperator.k8s.io/v1beta2
kind: SparkApplication
metadata:
name: spark-pi
namespace: default
spec:
type: Scala
mode: cluster
image: spark:3.5.1
mainClass: org.apache.spark.examples.SparkPi
mainApplicationFile: local:///opt/spark/examples/jars/spark-examples_2.12-3.5.1.jar
指定部署模式
SparkApplication
应该将 .spec.deployMode
设置为 cluster
,因为 client
当前尚未实现。driver pod 将在内部以 client
模式运行 spark-submit
来运行 driver 程序。有关 SparkApplication
如何运行的更多详细信息,请参阅设计文档。
指定应用程序依赖项
Spark 应用程序通常除了主应用程序资源外还需要其他文件才能运行。这些应用程序依赖项可以包括例如应用程序在运行时需要的 jars 和数据文件。使用 spark-submit
脚本提交 Spark 应用程序时,这些依赖项是使用 --jars
和 --files
选项指定的。为了支持应用程序依赖项的规范,SparkApplication
使用一个可选字段 .spec.deps
,该字段又支持分别指定 jars 和文件。更具体地说,可选字段 .spec.deps.jars
和 .spec.deps.files
分别对应于 spark-submit
脚本的 --jars
和 --files
选项。
此外,.spec.deps
还有一些字段用于指定 jars 和文件应下载到的 driver 和 executor 容器中的位置,即 .spec.deps.jarsDownloadDir
和 .spec.deps.filesDownloadDir
。可选字段 .spec.deps.downloadTimeout
和 .spec.deps.maxSimultaneousDownloads
用于控制下载远程托管(例如,在 HTTP 服务器上,或在外部存储如 HDFS、Google Cloud Storage 或 AWS S3 中)依赖项的超时和最大并行度。
以下是包含容器本地(即容器内)和远程依赖项的示例规范
spec:
deps:
jars:
- local:///opt/spark-jars/gcs-connector.jar
files:
- gs://spark-data/data-file-1.txt
- gs://spark-data/data-file-2.txt
还可以通过向 .spec.deps.packages
添加 Maven 坐标来指定从远程仓库获取的其他 jars。可以通过向 .spec.deps.excludePackages
添加条目来解决传递依赖冲突。可以将其他仓库添加到 .spec.deps.repositories
列表中。这些直接转换为 spark-submit
参数 --packages
、--exclude-packages
和 --repositories
。
注意
packages
列表中的每个包都必须采用 "groupId:artifactId:version" 格式excludePackages
列表中的每个包都必须采用 "groupId:artifactId" 格式
以下示例展示了如何使用这些参数。
spec:
deps:
repositories:
- https://repository.example.com/prod
packages:
- com.example:some-package:1.0.0
excludePackages:
- com.example:other-package
指定 Spark 配置
有两种方法可以添加 Spark 配置:使用可选字段 .spec.sparkConf
设置单个 Spark 配置属性,或使用可选字段 .spec.sparkConfigMap
挂载存储 Spark 配置文件的特殊 Kubernetes ConfigMap (例如 spark-defaults.conf
, spark-env.sh
, log4j.properties
)。如果使用了 .spec.sparkConfigMap
,除了将 ConfigMap 挂载到 driver 和 executors 中,operator 还会额外设置环境变量 SPARK_CONF_DIR
指向 ConfigMap 的挂载路径。
spec:
sparkConf:
spark.ui.port: "4045"
spark.eventLog.enabled: "true"
spark.eventLog.dir: "hdfs://hdfs-namenode-1:8020/spark/spark-events"
指定 Hadoop 配置
有两种方法可以添加 Hadoop 配置:使用可选字段 .spec.hadoopConf
设置单个 Hadoop 配置属性,或使用可选字段 .spec.hadoopConfigMap
挂载存储 Hadoop 配置文件的特殊 Kubernetes ConfigMap (例如 core-site.xml
)。operator 会自动为 .spec.hadoopConf
中单个 Hadoop 配置属性的名称添加前缀 spark.hadoop.
。如果使用了 .spec.hadoopConfigMap
,除了将 ConfigMap 挂载到 driver 和 executors 中,operator 还会额外设置环境变量 HADOOP_CONF_DIR
指向 ConfigMap 的挂载路径。
以下是一个示例,展示了如何使用单个 Hadoop 配置属性
spec:
hadoopConf:
"fs.gs.project.id": spark
"fs.gs.system.bucket": spark
"google.cloud.auth.service.account.enable": true
"google.cloud.auth.service.account.json.keyfile": /mnt/secrets/key.json
编写 Driver 规范
SparkApplication
的 .spec
部分有一个 .spec.driver
字段用于配置 driver。它允许用户设置请求 driver pod 的内存和 CPU 资源,以及 driver 应使用的容器镜像。它还包含可选字段,用于指定 driver pod 的标签、注解和环境变量。默认情况下,应用程序的 driver pod 名称由 Spark 提交客户端自动生成。如果您希望使用特定的名称作为 driver pod 的名称,可以使用可选字段 .spec.driver.podName
。driver pod 默认使用其运行所在命名空间中的 default
服务帐户与 Kubernetes API 服务器通信。然而,default
服务帐户可能没有足够的权限来创建 executor pod 以及 executors 用于连接 driver 的无头服务。如果它没有,并且应使用具有正确权限的自定义服务帐户,则可以使用可选字段 .spec.driver.serviceAccount
来指定自定义服务帐户的名称。当 driver 需要自定义容器镜像时,可以使用字段 .spec.driver.image
来指定。如果也设置了 .spec.image
,则此字段会覆盖 .spec.image
中指定的镜像。如果 .spec.image
和 .spec.driver.image
均未设置,则无效。
对于需要将 Kubernetes Secrets 或 ConfigMaps 挂载到 driver pod 中的应用程序,可以使用字段 .spec.driver.secrets
和 .spec.driver.configMaps
。更多详细信息,请参阅挂载 Secrets 和挂载 ConfigMaps。
以下是一个示例 driver 规范
spec:
driver:
cores: 1
coreLimit: 200m
memory: 512m
labels:
version: 3.1.1
serviceAccount: spark
编写 Executor 规范
SparkApplication
的 .spec
部分有一个 .spec.executor
字段用于配置 executors。它允许用户设置请求 executor pod 的内存和 CPU 资源,以及 executors 应使用的容器镜像。它还包含可选字段,用于指定 executor pod 的标签、注解和环境变量。默认情况下,应用程序只请求一个 executor。如果需要多个 executor,可以使用可选字段 .spec.executor.instances
来指定请求的 executor 数量。当 executors 需要自定义容器镜像时,可以使用字段 .spec.executor.image
来指定。如果也设置了 .spec.image
,则此字段会覆盖 .spec.image
中指定的镜像。如果 .spec.image
和 .spec.executor.image
均未设置,则无效。
对于需要将 Kubernetes Secrets 或 ConfigMaps 挂载到 executor pod 中的应用程序,可以使用字段 .spec.executor.secrets
和 .spec.executor.configMaps
。更多详细信息,请参阅挂载 Secrets 和挂载 ConfigMaps。
以下是一个示例 executor 规范
spec:
executor:
cores: 1
instances: 1
memory: 512m
labels:
version: 3.1.1
serviceAccount: spark
指定额外的 Java 选项
SparkApplication
可以使用可选字段 .spec.driver.javaOptions
为 driver 指定额外的 Java 选项,使用可选字段 .spec.executor.javaOptions
为 executors 指定额外的 Java 选项。示例如下:
spec:
executor:
javaOptions: "-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap"
使用这两个字段指定的值会分别转换为 Spark 配置属性 spark.driver.extraJavaOptions
和 spark.executor.extraJavaOptions
。建议优先使用上述两个字段,而不是配置属性 spark.driver.extraJavaOptions
和 spark.executor.extraJavaOptions
,因为这些字段可以很好地与其他可能修改 spark.driver.extraJavaOptions
或 spark.executor.extraJavaOptions
设置值的字段一起使用。
指定环境变量
有两个字段用于为 driver 和/或 executor 容器指定环境变量,即 .spec.driver.env
(或用于 executor 容器的 .spec.executor.env
)和 .spec.driver.envFrom
(或用于 executor 容器的 .spec.executor.envFrom
)。具体来说,.spec.driver.env
(和 .spec.executor.env
)接受 EnvVar 列表,每个 EnvVar 都指定一个环境变量或环境变量的来源,例如,名称-值对、ConfigMap 键、Secret 键等。或者,.spec.driver.envFrom
(和 .spec.executor.envFrom
)接受 EnvFromSource 列表,并允许使用 ConfigMap 或 Secret 中的所有键值对作为环境变量。以下 SparkApplication
代码片段展示了如何使用这两个字段:
spec:
driver:
env:
- name: ENV1
value: VAL1
- name: ENV2
value: VAL2
- name: ENV3
valueFrom:
configMapKeyRef:
name: some-config-map
key: env3-key
- name: AUTH_KEY
valueFrom:
secretKeyRef:
name: some-secret
key: auth-key
envFrom:
- configMapRef:
name: env-config-map
- secretRef:
name: env-secret
executor:
env:
- name: ENV1
value: VAL1
- name: ENV2
value: VAL2
- name: ENV3
valueFrom:
configMapKeyRef:
name: some-config-map
key: env3-key
- name: AUTH_KEY
valueFrom:
secretKeyRef:
name: some-secret
key: auth-key
envFrom:
- configMapRef:
name: my-env-config-map
- secretRef:
name: my-env-secret
注意:也可用于指定环境变量的遗留字段 envVars
已被弃用,并将在未来的 API 版本中移除。
请求 GPU 资源
SparkApplication
可以使用可选字段 .spec.driver.gpu
或 .spec.executor.gpu
为 driver 或 executor pod 指定 GPU 资源。示例如下:
spec:
driver:
cores: 0.1
coreLimit: "200m"
memory: "512m"
gpu:
name: "amd.com/gpu" # GPU resource name
quantity: 1 # number of GPUs to request
labels:
version: 3.1.1
serviceAccount: spark
executor:
cores: 1
instances: 1
memory: "512m"
serviceAccount: spark
gpu:
name: "nvidia.com/gpu"
quantity: 1
注意,使用此功能需要 mutating admission webhook。有关如何启用 mutating admission webhook 的信息,请参阅入门。
主机网络
SparkApplication
可以使用可选字段 .spec.driver.hostNetwork
或 .spec.executor.hostNetwork
为 driver 或 executor pod 指定 hostNetwork
。当 hostNetwork
为 true
时,operator 将 pod 的 spec.hostNetwork
设置为 true
,并将 pod 的 spec.dnsPolicy
设置为 ClusterFirstWithHostNet
。示例如下:
spec:
driver:
cores: 0.1
coreLimit: "200m"
memory: "512m"
hostNetwork: true
labels:
version: 3.1.1
serviceAccount: spark
executor:
cores: 1
instances: 1
memory: "512m"
注意,使用此功能需要 mutating admission webhook。有关如何启用 mutating admission webhook 的信息,请参阅入门。
挂载 Secrets
如上所述,driver 规范和 executor 规范都包含可选字段 secrets
,用于配置分别挂载到 driver 和 executors 中的 Kubernetes Secrets 列表。该字段是一个 Map,键是 Secrets 的名称,值指定每个 Secret 的挂载路径和类型。例如,以下示例展示了一个 driver 规范,其中包含一个类型为 GCPServiceAccount
的 Secret gcp-svc-account
,将挂载到 driver pod 的 /mnt/secrets
路径下。
spec:
driver:
secrets:
- name: gcp-svc-account
path: /mnt/secrets
secretType: GCPServiceAccount
secretType
字段指定的 Secret 类型向 operator 提供了提示,说明需要为特定类型的 Secrets 进行哪些额外的配置。例如,如果 Secret 的类型是 GCPServiceAccount
,operator 会额外设置环境变量 GOOGLE_APPLICATION_CREDENTIALS
指向 Secret 中存储的 JSON 密钥文件。有关如何使用服务帐户 JSON 密钥文件向 GCP 服务进行身份验证的更多信息,请参阅身份验证入门。请注意,operator 假定 Secret 数据 map 中服务帐户 JSON 密钥文件的键是 key.json
,以便能够自动设置环境变量。类似地,如果 Secret 的类型是 HadoopDelegationToken
,operator 会额外设置环境变量 HADOOP_TOKEN_FILE_LOCATION
指向存储 Hadoop 委托令牌的文件。在这种情况下,operator 假定 Secret 数据 map 中委托令牌文件的键是 hadoop.token
。如果不需要额外的配置,secretType
字段的值应为 Generic
。
注意,使用此功能需要 mutating admission webhook。有关如何启用 mutating admission webhook 的信息,请参阅入门。
挂载 ConfigMaps
driver 规范和 executor 规范都包含可选字段,用于配置分别挂载到 driver 和 executors 中的 Kubernetes ConfigMaps 列表。该字段是一个 Map,键是 ConfigMaps 的名称,值指定每个 ConfigMap 的挂载路径。例如,以下示例展示了一个 driver 规范,其中包含一个名为 configmap1
的 ConfigMap,将挂载到 driver pod 中的 /mnt/config-maps
路径下。
spec:
driver:
configMaps:
- name: configmap1
path: /mnt/config-maps
注意,使用此功能需要 mutating admission webhook。有关如何启用 mutating admission webhook 的信息,请参阅入门。
挂载存储 Spark 配置文件的 ConfigMap
SparkApplication
可以使用可选字段 .spec.sparkConfigMap
指定存储 Spark 配置文件的 Kubernetes ConfigMap,例如 spark-env.sh
或 spark-defaults.conf
,该字段的值是 ConfigMap 的名称。假设该 ConfigMap 与 SparkApplication
位于同一命名空间中。operator 将 ConfigMap 挂载到 driver 和 executors 的路径 /etc/spark/conf
。此外,它还在 driver 和 executors 中设置环境变量 SPARK_CONF_DIR
指向 /etc/spark/conf
。
注意,使用此功能需要 mutating admission webhook。有关如何启用 mutating admission webhook 的信息,请参阅入门。
挂载存储 Hadoop 配置文件的 ConfigMap
SparkApplication
可以使用可选字段 .spec.hadoopConfigMap
指定存储 Hadoop 配置文件的 Kubernetes ConfigMap,例如 core-site.xml
,该字段的值是 ConfigMap 的名称。假设该 ConfigMap 与 SparkApplication
位于同一命名空间中。operator 将 ConfigMap 挂载到 driver 和 executors 的路径 /etc/hadoop/conf
。此外,它还在 driver 和 executors 中设置环境变量 HADOOP_CONF_DIR
指向 /etc/hadoop/conf
。
注意,使用此功能需要 mutating admission webhook。有关如何启用 mutating admission webhook 的信息,请参阅入门。
挂载 Volumes
operator 还支持将用户指定的 Kubernetes volume 挂载到 driver 和 executors 中。SparkApplication
有一个可选字段 .spec.volumes
,用于指定 driver 和 executors 共同需要的 volumes 列表。然后,driver 和 executor 规范都有一个可选字段 volumeMounts
,分别指定 driver 和 executors 所需 volumes 的 volume mounts。以下示例展示了一个包含 driver 和 executor volume mounts 的 SparkApplication
。
spec:
volumes:
- name: spark-data
persistentVolumeClaim:
claimName: my-pvc
- name: spark-work
emptyDir:
sizeLimit: 5Gi
driver:
volumeMounts:
- name: spark-work
mountPath: /mnt/spark/work
executor:
volumeMounts:
- name: spark-data
mountPath: /mnt/spark/data
- name: spark-work
mountPath: /mnt/spark/work
注意,使用此功能需要 mutating admission webhook。有关如何启用 mutating admission webhook 的信息,请参阅入门。
使用 Secrets 作为环境变量
注意:envSecretKeyRefs
已弃用,并将在未来的 API 版本中移除。
SparkApplication
可以使用secrets 作为环境变量,通过 driver pod 的可选字段 .spec.driver.envSecretKeyRefs
和 executor pod 的可选字段 .spec.executor.envSecretKeyRefs
。envSecretKeyRefs
是一个 map,将环境变量名称映射到包含 Secret 名称和 Secret 键的对。示例如下:
spec:
driver:
envSecretKeyRefs:
SECRET_USERNAME:
name: mysecret
key: username
SECRET_PASSWORD:
name: mysecret
key: password
使用 Image Pull Secrets
请注意,此功能需要基于最新 Spark master 分支的镜像。
对于需要 image-pull secrets 才能拉取的镜像,SparkApplication
有一个可选字段 .spec.imagePullSecrets
,用于指定 image-pull secrets 列表。示例如下:
spec:
imagePullSecrets:
- secret1
- secret2
使用 Pod 亲和性
SparkApplication
可以使用可选字段 .spec.driver.affinity
或 .spec.executor.affinity
为 driver 或 executor pod 指定 Affinity
。示例如下:
spec:
driver:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
...
executor:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
...
注意,使用此功能需要 mutating admission webhook。有关如何启用 mutating admission webhook 的信息,请参阅入门。
使用 Tolerations
SparkApplication
可以使用可选字段 .spec.driver.tolerations
或 .spec.executor.tolerations
为 driver 或 executor pod 指定 Tolerations
。示例如下:
spec:
driver:
tolerations:
- key: Key
operator: Exists
effect: NoSchedule
executor:
tolerations:
- key: Key
operator: Equal
value: Value
effect: NoSchedule
注意,使用此功能需要 mutating admission webhook。有关如何启用 mutating admission webhook 的信息,请参阅入门。
使用 Security Context
SparkApplication
可以使用可选字段 .spec.driver.securityContext
或 .spec.executor.securityContext
为 driver 或 executor 容器指定 SecurityContext
。SparkApplication
还可以使用可选字段 .spec.driver.podSecurityContext
或 .spec.executor.podSecurityContext
为 driver 或 executor pod 指定 PodSecurityContext
。示例如下:
spec:
driver:
podSecurityContext:
runAsUser: 1000
securityContext:
allowPrivilegeEscalation: false
runAsUser: 2000
executor:
podSecurityContext:
runAsUser: 1000
securityContext:
allowPrivilegeEscalation: false
runAsUser: 2000
注意,使用此功能需要 mutating admission webhook。有关如何启用 mutating admission webhook 的信息,请参阅入门。
使用 Sidecar 容器
SparkApplication
可以使用可选字段 .spec.driver.sidecars
或 .spec.executor.sidecars
为 driver 或 executor pod 指定一个或多个可选的 sidecar 容器。每个 sidecar 容器的规范遵循 Container API 定义。示例如下:
spec:
driver:
sidecars:
- name: "sidecar1"
image: "sidecar1:latest"
...
executor:
sidecars:
- name: "sidecar1"
image: "sidecar1:latest"
...
注意,使用此功能需要 mutating admission webhook。有关如何启用 mutating admission webhook 的信息,请参阅入门。
使用 Init-Containers
SparkApplication
可以使用可选字段 .spec.driver.initContainers
或 .spec.executor.initContainers
,分别为 driver 或 executor pod 指定一个或多个 init-containers。每个 init-container 的规范遵循 Container API 定义。示例如下:
spec:
driver:
initContainers:
- name: "init-container1"
image: "init-container1:latest"
...
executor:
initContainers:
- name: "init-container1"
image: "init-container1:latest"
...
注意,使用此功能需要 mutating admission webhook。有关如何启用 mutating admission webhook 的信息,请参阅入门。
使用 DNS 设置
SparkApplication
可以通过添加标准的 Kubernetes DNS 设置来定义 driver 和/或 executor pod 的 DNS 设置。添加此类配置的字段是 .spec.driver.dnsConfig
和 .spec.executor.dnsConfig
。示例如下:
spec:
driver:
dnsConfig:
nameservers:
- 1.2.3.4
searches:
- ns1.svc.cluster.local
- my.dns.search.suffix
options:
- name: ndots
value: "2"
- name: edns0
注意,使用此功能需要 mutating admission webhook。有关如何启用 mutating admission webhook 的信息,请参阅入门。
为临时空间使用 Volume
默认情况下,Spark 使用临时临时空间将数据溢出到磁盘进行 shuffle 和其他操作。临时目录默认为容器的 /tmp
。如果该存储空间不足或您想使用特定路径,可以使用一个或多个 volume。volume 名称应以 spark-local-dir-
开头。
spec:
volumes:
- name: "spark-local-dir-1"
hostPath:
path: "/tmp/spark-local-dir"
executor:
volumeMounts:
- name: "spark-local-dir-1"
mountPath: "/tmp/spark-local-dir"
...
然后,您将在 pod 中得到 SPARK_LOCAL_DIRS
设置为 /tmp/spark-local-dir
,如下所示。
Environment:
SPARK_USER: root
SPARK_DRIVER_BIND_ADDRESS: (v1:status.podIP)
SPARK_LOCAL_DIRS: /tmp/spark-local-dir
SPARK_CONF_DIR: /opt/spark/conf
注意:可以同时使用多个 volume
spec:
volumes:
- name: "spark-local-dir-1"
hostPath:
path: "/mnt/dir1"
- name: "spark-local-dir-2"
hostPath:
path: "/mnt/dir2"
executor:
volumeMounts:
- name: "spark-local-dir-1"
mountPath: "/tmp/dir1"
- name: "spark-local-dir-2"
mountPath: "/tmp/dir2"
...
注意:除了
hostPath
,也可以使用persistentVolumeClaim
。
spec:
volumes:
- name: "spark-local-dir-1"
persistentVolumeClaim:
claimName: network-file-storage
executor:
volumeMounts:
- name: "spark-local-dir-1"
mountPath: "/tmp/dir1"
使用终止优雅期限
Spark Application 可以选择为 driver 和 executor pods 指定终止优雅期限秒数。更多信息
spec:
driver:
terminationGracePeriodSeconds: 60
使用容器生命周期 Hook
Spark Application 可以选择为 driver 指定容器生命周期 Hook。这在您需要为 driver 和 executor 指定 PreStop 或 PostStart hook 时非常有用。
spec:
driver:
lifecycle:
preStop:
exec:
command:
- /bin/bash
- -c
- touch /var/run/killspark && sleep 65
在 Spark Streaming 或 Spark Structured Streaming 应用程序等情况下,您可以测试文件是否存在以启动优雅关闭并手动停止所有流式查询。
Python 支持
可以通过将 .spec.mainApplicationFile
设置为您 Python 应用程序的路径来启用 Python 支持。另外,可以使用 .spec.pythonVersion
字段设置用于运行 driver 和 executor 容器的 Docker 镜像的主 Python 版本。以下是一个示例,展示了 SparkApplication
规范的一部分:
spec:
type: Python
pythonVersion: 2
mainApplicationFile: local:///opt/spark/examples/src/main/python/pyfiles.py
一些 PySpark 应用程序需要额外的 Python 包才能运行。这些依赖项通过可选字段 .spec.deps.pyFiles
指定,该字段转换为 spark-submit 命令的 --py-files
选项。
spec:
deps:
pyFiles:
- local:///opt/spark/examples/src/main/python/py_container_checks.py
- gs://spark-data/python-dep.zip
为了使用远程托管的依赖项,在 Spark 2.4 中可以使用以下 PySpark 代码。
python_dep_file_path = SparkFiles.get("python-dep.zip")
spark.sparkContext.addPyFile(dep_file_path)
请注意,PySpark 的 Python 绑定在 Apache Spark 2.4 中可用。
监控
operator 支持使用 Spark 指标系统将指标暴露给各种接收器。特别是,它能够自动配置指标系统将指标暴露给 Prometheus。具体来说,字段 .spec.monitoring
指定如何处理应用程序监控以及如何报告指标。指标系统通过配置文件 metrics.properties
配置,其内容来自字段 .spec.monitoring.metricsProperties
。如果未指定 .spec.monitoring.metricsProperties
,将使用 metrics.properties 的内容作为默认值。.spec.monitoring.metricsPropertiesFile
将覆盖 spark.properties 中 spark.metrics.conf
的值,并且不会使用 .spec.monitoring.metricsProperties
中的内容。您可以使用字段 .spec.monitoring.exposeDriverMetrics
和 .spec.monitoring.exposeExecutorMetrics
分别选择启用或禁用报告 driver 和 executor 指标。
此外,字段 .spec.monitoring.prometheus
指定如何使用 Prometheus JMX exporter 将指标暴露给 Prometheus。指定 .spec.monitoring.prometheus
后,operator 会自动配置 JMX exporter 作为 Java agent 运行。.spec.monitoring.prometheus
中唯一必需的字段是 jmxExporterJar
,它指定了容器中 Prometheus JMX exporter Java agent jar 的路径。如果您使用镜像 gcr.io/spark-operator/spark:v3.1.1-gcs-prometheus
,该 jar 位于 /prometheus/jmx_prometheus_javaagent-0.11.0.jar
。字段 .spec.monitoring.prometheus.port
指定 JMX exporter Java agent 绑定的端口,如果未指定,默认为 8090
。字段 .spec.monitoring.prometheus.configuration
指定要与 JMX exporter 一起使用的配置内容。如果未指定 .spec.monitoring.prometheus.configuration
,将使用 prometheus.yaml 的内容作为默认值。
以下示例展示了如何配置指标系统以使用 Prometheus JMX exporter 将指标暴露给 Prometheus。请注意,JMX exporter Java agent jar 在 Spark 2.3.x 中被列为依赖项,并将下载到 .spec.dep.jarsDownloadDir
指向的位置,默认情况下是 /var/spark-data/spark-jars
。在 Spark 2.4 中有所不同,因为依赖项将下载到本地工作目录。完整示例请参阅 examples/spark-pi-prometheus.yaml。
spec:
deps:
jars:
- http://central.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.11.0/jmx_prometheus_javaagent-0.11.0.jar
monitoring:
exposeDriverMetrics: true
prometheus:
jmxExporterJar: "/var/spark-data/spark-jars/jmx_prometheus_javaagent-0.11.0.jar"
operator 会自动在 driver 和/或 executor pod 上添加注解(取决于 .spec.monitoring.exposeDriverMetrics
和 .spec.monitoring.exposeExecutorMetrics
的值),例如 prometheus.io/scrape=true
,以便同一集群中的 Prometheus 服务器可以抓取 pod 上暴露的指标。
动态分配
operator 通过 Spark 3.0.0 中引入的 shuffle 跟踪增强功能支持有限形式的Spark 动态资源分配,而无需外部 shuffle 服务(在 Kubernetes 模式下不可用)。有关增强功能的详细信息,请参阅此 issue。要启用这种有限形式的动态分配,请按照以下示例操作
spec:
dynamicAllocation:
enabled: true
initialExecutors: 2
minExecutors: 2
maxExecutors: 10
注意,如果启用了动态分配,并且同时设置了 .spec.dynamicAllocation.initialExecutors
和 .spec.executor.instances
,则初始请求的 executor 数量将设置为两者中较大的值。