You need to enable JavaScript to run this app.
容器服务

容器服务

复制全文
最佳实践
使用 VCI 运行 Spark 数据处理任务
复制全文
使用 VCI 运行 Spark 数据处理任务

使用弹性容器实例(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 说明

使用限制

下文主要介绍 VCI 测试并验证通过的实践内容,为了获得符合预期的结果,同时符合 VCI 的 使用限制,请按照本文方案(或在本文推荐的资源上)操作。如需替换方案,您可以联系对应的火山引擎客户经理咨询。

前提条件

  • 本地已安装 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 加速镜像拉取。更多信息,请参见 镜像缓存

最近更新时间:2025.03.20 11:47:58
这个页面对您有帮助吗?
有用
有用
无用
无用