Kubernetes Spark节点

通过创建Kubernetes Spark节点,您可以在DataWorks中利用Kubernetes集群作为计算资源,开发、调试和周期性调度运行Spark任务。

适用范围

  • 计算资源限制:仅支持使用已绑定Kubernetes计算资源的工作空间。

  • 资源组限制:仅支持使用Serverless资源组运行该类型任务,并需确保资源组与Kubernetes集群API Server网络连通。

  • 权限限制:(可选,RAM账号需要)进行任务开发的RAM账号已被添加至对应工作空间中,并具有开发空间管理员(权限较大,谨慎添加)角色权限,添加成员的操作详情请参见为工作空间添加空间成员

    如果您使用的是主账号,则可忽略该添加操作。

新建节点

新建入口参考:创建节点

开发节点

Kubernetes Spark节点提供可视化表单YAML编辑器两种配置方式,两者内容会实时双向同步。建议您优先使用可视化表单完成常用配置,对于复杂需求再通过YAML编辑器进行补充。

可视化表单配置

在节点编辑页面,您可以配置Spark任务运行所需的各项参数。

参数

具体描述

Type

选择Spark任务的开发语言类型,支持ScalaJavaPython

Name

Spark应用在Kubernetes中运行时所采用的名称。

该名称将作为SparkApplication资源和Driver Pod的名称前缀(系统会自动在其后附加 -driver 后缀)。

Main Application File

指定主应用程序文件的路径。

  • 最佳实践:推荐将您的 Jar 包或 Python 脚本上传至OSS,并使用oss://路径。这可以使镜像和代码解耦,便于代码的快速迭代。

  • local:///path/in/image.jar:如果您的应用程序已经打包在镜像中,可以使用local://协议指向镜像内的绝对路径。

Image

指定Spark DriverExecutor运行时所使用的Docker镜像地址。

重要

镜像中必须包含与您的任务兼容的Spark版本和Hadoop客户端依赖。如果任务需要访问OSS,请确保镜像中包含正确的hadoop-aliyun依赖。

Main Class

TypeJavaScala时必填。指定Spark应用程序的入口主类全名。

+ 添加

单击可添加更多Spark配置项,例如ArgumentsDriver MemoryExecutor Cores等。DataWorks内置常用Spark配置项供您快速选择。

重要

完整参数介绍请参见Spark on Kubernetes参数说明

Labels

为任务创建的所有Pods添加Kubernetes Labels。用于资源筛选、策略应用等。格式为key:value,多个Labels请换行输入。

Executor Annotations

Executor Pods添加Kubernetes Annotations。格式为key:value,多个Annotations请换行输入。

常用于配置第三方工具集成,如配置prometheus.io/scrape: 'true'以启用Prometheus监控指标采集。

Driver Annotations

Driver Pod添加Kubernetes Annotations。

YAML编辑器配置

所有在可视化表单中配置的参数都会实时映射为下方的YAML内容。该YAML文件遵循Spark on Kubernetes OperatorSparkApplicationCRD规范。

  • 双向同步:修改上方表单,YAML内容会自动更新;反之,在YAML编辑器中直接修改内容,上方对应的表单项也会同步变更。

  • 高级配置与问题排查:对于一些复杂或不常用的Spark属性(如volumesnodeSelectortolerations等),您可以在YAML编辑器中直接编写。这是解决高级调度问题和挂载特定存储的关键。

# 示例:通过添加 sparkConf 配置 OSS 访问凭证,并从 OSS 拉取应用代码(解藕示例)
# 完整结构示例
apiVersion: sparkoperator.k8s.io/v1beta2
kind: SparkApplication
metadata:
  name: spark-pi-example
  namespace: default
spec:
  type: Scala
  mode: cluster 
  image: "registry.cn-hangzhou.aliyuncs.com/spark-operator/spark:v3.1.1" 
  mainClass: org.apache.spark.examples.SparkPi 
  mainApplicationFile: "oss://your-bucket-name/path/to/spark-examples_2.12-3.1.1.jar"
  sparkVersion: "3.1.1"
  restartPolicy:
    type: Never
  driver:
    cores: 1
    memory: "512m"
    labels:
      version: 3.1.1
    # 确保 ServiceAccount 有权限访问 OSS(如果使用 RAM 角色授权)
    serviceAccountName: spark 
  executor:
    cores: 1
    instances: 1
    memory: "512m"
    labels:
      version: 3.1.1
  # ↓↓↓ 这部分配置现在至关重要,因为它不仅用于读写数据,还用于下载 mainApplicationFile ↓↓↓
  sparkConf:
    spark.hadoop.fs.oss.accessKeyId: "YOUR_ACCESS_KEY_ID"
    spark.hadoop.fs.oss.accessKeySecret: "YOUR_ACCESS_KEY_SECRET"
    spark.hadoop.fs.oss.endpoint: "oss-cn-hangzhou-internal.aliyuncs.com"

调试节点

  1. 单击节点编辑页面右侧的调试配置,配置任务运行所需资源。

    配置项

    说明

    计算资源

    选择已绑定的Kubernetes计算资源。该下拉框仅展示Kubernetes类型的计算资源。

    资源组

    选择用于执行任务的独享资源组。

    脚本参数

    当您在YAMLArguments参数中通过${参数名}的方式定义变量时,需要在此处配置参数名和临时的参数值用于调试运行。详情请参见调度参数来源及其表达式

  2. 在节点编辑页面上方工具栏,单击运行任务。

  3. 在底部的运行日志面板中,查看任务的实时日志和最终运行结果。如果任务失败,请仔细阅读日志中的ERRORException信息,并对照上文的常见问题进行排查。

常见问题与开发实践

在开发Kubernetes Spark节点时,您可能会遇到以下常见问题,请参考对应的解决方案。

  • Q:如何查看周期调度实例对应的Spark作业?

    • 若节点填写Name字段,通过周期调度运行的Spark作业名格式为:{Name}-{实例ID}

    • 若节点未填写Name字段,通过周期调度运行的Spark作业名格式为:DataWorks-Job-{实例ID}

  • Q:任务长时间处于SUBMITTED状态,无法启动Driver Pod。

    可能原因与解决方案:

    • 镜像拉取失败:检查您填写的Image地址是否正确,以及Kubernetes集群节点是否有权限从该镜像仓库拉取镜像。对于私有仓库,需要配置imagePullSecrets

    • 资源不足:Kubernetes集群没有足够的CPU或内存资源来调度Driver Pod。请检查集群资源使用情况。

    • 权限问题:运行任务的ServiceAccount没有创建Pod的权限。请在YAML中通过spec.driver.serviceAccountName指定一个具有正确RBAC权限的账户。

  • Q:Driver已启动,但Executor无法启动或一直处于Pending状态。

    可能原因与解决方案:

    • 资源不足:同上,集群没有足够资源来创建Executor Pods。

    • 调度约束:您可能通过nodeSelectoraffinitytolerations设置了调度规则,但集群中没有满足条件的节点。请检查YAML中的相关配置。

  • Q:任务因java.lang.ClassNotFoundExceptionNoClassDefFoundError失败。

    可能原因与解决方案:

    • 依赖缺失:您的应用程序依赖了某些第三方库,但这些库没有被正确地包含进来。

      • 解决方案1(推荐):将所有依赖的JAR包构建到您的自定义Image中。

      • 解决方案2:使用+ 添加功能,添加JarsFiles参数,并指定依赖文件在OSS上的路径。

  • Q:任务在运行时报错,提示访问OSS/HDFS等数据源权限被拒绝。

    可能原因与解决方案:

    • 凭证未配置:任务运行时需要访问数据源的凭证信息。请通过+ 添加 > spark conf的方式,或者直接在YAMLsparkConf部分,添加访问数据源所需的配置,如spark.hadoop.fs.oss.accessKeyId等。

后续步骤

  • 节点调度配置:若项目目录下的节点需要周期性调度执行,您需要在节点右侧的调度配置中设置调度策略,配置相关的调度属性。

  • 节点发布:若任务需要发布至生产环境执行,请单击界面image图标唤起发布流程,通过该流程将任务发布至生产环境。项目目录下的节点只有在发布至生产环境后,才会进行周期性调度。

  • 任务运维:任务发布后,您可以在运维中心查看周期任务的运行情况。详情请参见运维中心入门