编写 SparkApplication

编写 SparkApplication

与所有其他 Kubernetes API 对象一样,SparkApplication 需要 apiVersionkindmetadata 字段。有关使用清单文件的常规信息,请参阅使用 kubectl 进行对象管理

SparkApplication 还需要一个 .spec。该节包含用于指定应用程序各种方面的字段,包括其类型(ScalaJavaPythonR)、部署模式(clusterclient)、主应用程序资源 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 SecretsConfigMaps 挂载到 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 SecretsConfigMaps 挂载到 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.extraJavaOptionsspark.executor.extraJavaOptions建议优先使用上述两个字段,而不是配置属性 spark.driver.extraJavaOptionsspark.executor.extraJavaOptions,因为这些字段可以很好地与其他可能修改 spark.driver.extraJavaOptionsspark.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。当 hostNetworktrue 时,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.shspark-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.envSecretKeyRefsenvSecretKeyRefs 是一个 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 容器指定 SecurityContextSparkApplication 还可以使用可选字段 .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 数量将设置为两者中较大的值。

反馈

此页面有帮助吗?