You need to enable JavaScript to run this app.
导航

使用 VCI 运行 Spark 数据处理任务

最近更新时间2023.12.08 18:01:42

首次发布时间2023.12.08 17:53:08

使用弹性容器实例(VCI)运行 Spark 数据处理任务,可以不受限于容器服务(VKE)集群的节点计算容量,能够按需灵活动态地创建 Pod,有效地降低计算成本。本文主要介绍在 VKE 集群中安装 Spark Operator,并使用 VCI 运行 Spark 数据处理任务的操作。

背景信息

本文将使用 Kubernetes 原生 Spark Operator 方式,介绍使用 VCI 运行 Spark 任务的操作。主要流程如下:

  1. 创建集群
  2. 连接集群
  3. 安装 spark-operator
  4. 测试 spark-operator

如果您需要使用更多 VCI 的高级功能,可以通过设置 Annotation(注解)对 VCI 进行参数配置。详情请参见 Pod Annotation 说明

前提条件

  • 本地已安装 kubectl 工具。详细操作,请参见 kubectl 安装指导
  • 本地已安装 Helm 工具。详细操作,请参见 Helm 安装指导
  • 创建集群前,需要确保已完成准备工作。详细情况,请参见 准备工作
  • 已开通弹性容器实例。详细操作,请参见 VCI 入门指引

步骤一:创建 VPC-CNI 容器网络模型的集群

  1. 登录 容器服务控制台
  2. 在顶部导航栏,选择靠近您业务的地域。
  3. 在左侧导航栏单击 集群
  4. 集群 页面,单击 创建集群
  5. 创建集群 页面,根据配置向导创建完成 VPC-CNI 网络模型的集群。部分参数配置如下所示,其余参数,请参见 创建集群 中的说明,完成配置。

    说明

    创建集群过程中添加节点时,建议您结合自己业务实际需求和安装运行 Spark Operator 的需求,选择合适的节点规格,保证节点的 vCPU、内存等满足您的业务运行需求。

    alt
  6. 集群创建需要 15~20 分钟,请在 集群列表 查看创建进度,并确认集群创建成功。

步骤二:连接集群

  1. 在 容器服务控制台 的 集群 页面,找到本文上方 步骤一 中已创建的集群,单击集群名称。
  2. 在集群 基本信息 页面,单击 连接信息 页签。
  3. 查看 公网访问 Config,获取集群访问凭证。
    alt
  4. 登录 kubectl 客户端,进入.kube目录,修改 config 文件。
    cd .kube
    vi config
    
  5. 将获取集群访问凭证信息导入到 config 文件中,然后按 ESC 键退出编辑,执行:wq命令保存文件。
  6. 验证集群是否连接成功。
    kubectl get nodes
    
    返回类似如下信息,表示 kubectl 已连接集群。
    alt

步骤三:安装 Spark Operator

通过 kubectl 客户端安装 Spark Operator。

  1. 创建 serviceaccount。
    kubectl create serviceaccount spark
    kubectl create clusterrolebinding spark-role --clusterrole=edit --serviceaccount=default:spark --namespace=default
    
  2. 集群内创建一个名为 spark-operator 的命名空间。
    kubectl create namespace spark-operator
    
  3. 安装 Spark Operator。
    helm repo add spark-operator https://googlecloudplatform.github.io/spark-on-k8s-operator
    helm install my-release spark-operator/spark-operator --namespace spark-operator --set enableBatchScheduler=true --set enableWebhook=true
    

    注意

    安装 Spark Operator 时如果出现拉取 spark-operator 镜像失败,可以直接在 容器服务控制台 目标集群的 无状态负载 页面,将 spark-operator 命名空间下的 my-release 负载的镜像地址更新为doc-cn-beijing.cr.volces.com/vke/spark:v1beta2-1.3.8-3.1.1,即可正常安装 Spark Operator。

步骤四:使用 VCI 运行 Spark 任务

本示例以创建名为 spark-pi 的无状态负载(Deployment)YAML 文件为例。

  1. 在 容器服务控制台 的 集群 页面,找到本文上方 步骤一 中已创建的集群,单击集群名称。
  2. 在集群管理页面左侧导航栏选择 工作负载 > 无状态负载
  3. 单击 使用 Yaml 创建类型 选择 自定义Yaml 处输入下方示例代码,并单击 确定
    alt

    说明

    Git 代码内镜像地址拉取稳定性不高,故将镜像拉取到火山引擎镜像仓库(CR)。本示例可直接使用如下镜像地址:

    cr-share-cn-shanghai.cr.volces.com/spark/spark-operator:v3.1.1
    
    # Copyright 2017 Google LLC
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     https://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    
    apiVersion: "sparkoperator.k8s.io/v1beta2"
    kind: SparkApplication
    metadata:
      name: spark-pi
      namespace: default
    spec:
      type: Scala
      mode: cluster
      image: "cr-share-cn-shanghai.cr.volces.com/spark/spark-operator:v3.1.1" #修改了官方地址为火山引擎镜像仓库地址
      imagePullPolicy: Always
      mainClass: org.apache.spark.examples.SparkPi
      mainApplicationFile: "local:///opt/spark/examples/jars/spark-examples_2.12-3.1.1.jar"
      sparkVersion: "3.1.1"
      restartPolicy:
        type: Never
      volumes:
        - name: "test-volume"
          hostPath:
            path: "/tmp"
            type: Directory
      driver:
        cores: 1
        coreLimit: "1200m"
        memory: "512m"
        labels:
          version: 3.1.1
        serviceAccount: spark
        volumeMounts:
          - name: "test-volume"
            mountPath: "/tmp"
      executor:
        annotations:
          vke.volcengine.com/burst-to-vci: enforce  #指定 Spark 任务运行在 VCI 上。
        cores: 1
        instances: 1
        memory: "512m"
        labels:
          version: 3.1.1
        volumeMounts:
          - name: "test-volume"
            mountPath: "/tmp"
    
  4. 执行如下命令,测试验证运行结果。
    kubectl get sparkapplication
    
    返回类似如下信息,表示 Spark 任务运行完成。
    alt
    Spark 任务成功运行后,您可以执行如下命令,获取 Spark 任务详细信息。
    kubectl describe sparkapplication spark-pi
    
    预期返回结果:
    Name:         spark-pi
    Namespace:    default
    Labels:       <none>
    Annotations:  <none>
    API Version:  sparkoperator.k8s.io/v1beta2
    Kind:         SparkApplication
    Metadata:
      Creation Timestamp:  2023-11-27T15:45:20Z
      Generation:          1
      Resource Version:    24933
      UID:                 ad8fa50c-1d45-4a33-97bd-2c1de4155f7b
    Spec:
      Driver:
        Core Limit:  1200m
        Cores:       1
        Labels:
          Version:        3.1.1
        Memory:           512m
        Service Account:  spark
        Volume Mounts:
          Mount Path:  /tmp
          Name:        test-volume
      Executor:
        Annotations:
          vke.volcengine.com/burst-to-vci:  enforce
        Cores:                              1
        Instances:                          1
        Labels:
          Version:  3.1.1
        Memory:     512m
        Volume Mounts:
          Mount Path:         /tmp
          Name:               test-volume
      Image:                  cr-share-cn-shanghai.cr.volces.com/spark/spark-operator:v3.1.1
      Image Pull Policy:      Always
      Main Application File:  local:///opt/spark/examples/jars/spark-examples_2.12-3.1.1.jar
      Main Class:             org.apache.spark.examples.SparkPi
      Mode:                   cluster
      Restart Policy:
        Type:         Never
      Spark Version:  3.1.1
      Type:           Scala
      Volumes:
        Host Path:
          Path:  /tmp
          Type:  Directory
        Name:    test-volume
    Status:
      Application State:
        State:  COMPLETED
      Driver Info:
        Pod Name:             spark-pi-driver
        Web UI Address:       10.234.70.207:0
        Web UI Port:          4040
        Web UI Service Name:  spark-pi-ui-svc
      Execution Attempts:     1
      Executor State:
        spark-pi-4a08948c1174fd43-exec-1:  FAILED
      Last Submission Attempt Time:        2023-11-27T15:45:23Z
      Spark Application Id:                spark-aadd883935dd422eb0526412b846c9b1
      Submission Attempts:                 1
      Submission ID:                       923c3ed6-50de-4b65-a0e2-7c506b72dd2a
      Termination Time:                    2023-11-27T15:48:10Z
    Events:
      Type     Reason                     Age   From            Message
      ----     ------                     ----  ----            -------
      Normal   SparkApplicationAdded      18m   spark-operator  SparkApplication spark-pi was added, enqueuing it for submission
      Normal   SparkApplicationSubmitted  18m   spark-operator  SparkApplication spark-pi was submitted successfully
      Normal   SparkDriverRunning         18m   spark-operator  Driver spark-pi-driver is running
      Normal   SparkExecutorPending       18m   spark-operator  Executor [spark-pi-4a08948c1174fd43-exec-1] is pending
      Normal   SparkExecutorRunning       16m   spark-operator  Executor [spark-pi-4a08948c1174fd43-exec-1] is running
      Normal   SparkDriverCompleted       16m   spark-operator  Driver spark-pi-driver completed
      Normal   SparkApplicationCompleted  16m   spark-operator  SparkApplication spark-pi completed
      Warning  SparkExecutorFailed        15m   spark-operator  Executor [spark-pi-4a08948c1174fd43-exec-1 %!s(int=-1) Unknown (Container not Found)] failed with ExitCode: %!d(MISSING), Reason: %!s(MISSING)
    

Spark 任务日志收集

可通过火山引擎日志服务采集弹性容器 VCI 日志。更多信息,请参见 采集 VCI 容器日志

使用镜像缓存

Spark 镜像如果较大(2GB 以上),则拉取需要较长时间,您可以通过 ImageCache 加速镜像拉取。更多信息,请参见 镜像缓存