使用BestEffort实例运行Spark应用

阿里云容器计算服务 ACS(Container Compute Service)提供了Serverless形态的容器算力,对于大数据类型的计算任务,使用BestEffort算力质量的实例可以在满足其弹性算力需求的同时,降低任务的计算成本。本文主要为您介绍如何通过ACS提供的BestEffort实例运行Spark应用。

背景信息

Apache Spark和Spark Operator

Apache Spark在数据科学和机器学习等领域具有强大的能力,能够应对各种复杂的数据处理和分析任务。无论是离线批处理还是实时流处理,Spark都提供了高效的解决方案。Spark Operator使用了Kubernetes的操作方式和自定义资源,支持通过YAML创建Spark应用程序,使其在云原生环境中更加易用和高效。

BestEffort实例

通过Spark Operator在Kubernetes环境中管理和调度Spark应用程序,能够极大地提升数据处理和分析效率。结合ACS支持的BestEffort算力质量的实例(本文中简称为BestEffort实例),为短时间运行的Job任务和具备高扩展性和容错率的无状态应用提供了一个经济高效的解决方案。这不仅有效节省了计算成本,还保证了任务的高效执行。关于BestEffort实例的详细内容,请参见BestEffort算力质量概述

说明

本文将以一个基础的Spark应用程序为例,介绍如何通过ACS提供的BestEffort实例运行该应用。如果您打算在生产环境中使用Apache Spark和Spark Operator,建议您按照Spark官方的推荐配置进行设置。

前提条件

操作步骤

步骤一:创建Spark应用相关配置和权限

  1. 使用以下YAML内容,创建spark-sa.yaml文件,赋予名为sparkServiceAccount对集群资源进行编辑操作的权限。

    apiVersion: v1
    kind: Namespace
    metadata:
      name: spark-demo
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      namespace: spark-demo
      name: spark
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: spark-role-binding
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: edit
    subjects:
      - kind: ServiceAccount
        name: spark
        namespace: spark-demo
  2. 执行以下命令,创建Spark应用相关配置。

    kubectl apply -f spark-sa.yaml

步骤二:使用BestEffort实例运行Spark应用

  1. 使用以下YAML内容,创建spark-pi.yaml。其中.spec.executor.labels指定了alibabacloud.com/compute-qos: best-effort,表示Spark应用中执行计算任务的executor使用了BestEffort类型实例。

    apiVersion: "sparkoperator.k8s.io/v1beta2"
    kind: SparkApplication
    metadata:
      namespace: spark-demo
      name: spark-pi
    spec:
      type: Scala
      mode: cluster
      image: "registry.cn-hangzhou.aliyuncs.com/koordinator-sh/spark-test:v3.4.1-0.1"
      imagePullPolicy: IfNotPresent
      mainClass: org.apache.spark.examples.SparkPi
      mainApplicationFile: "local:///opt/spark/examples/jars/spark-examples_2.12-3.4.1.jar"
      sparkVersion: "3.4.1"
      restartPolicy:
        type: Never
      driver:
        cores: 1
        coreLimit: "1"
        memory: "512m"
        labels:
          version: 3.4.1
        serviceAccount: spark
      executor:
        cores: 1
        coreLimit: "1"
        instances: 1
        memory: "512m"
        deleteOnTermination: false  
        labels:
          version: 3.4.1
          alibabacloud.com/compute-qos: best-effort     # best-effort表示executor使用BestEffort算力
  2. 执行以下命令,部署Spark示例应用。

    kubectl apply -f spark-pi.yaml

步骤三:检查Spark应用状态

  1. 执行以下命令,查看Spark应用的Pod状态。

    kubectl get pod -n spark-demo -o wide

    预期输出:

    NAME                               READY   STATUS    RESTARTS   AGE   IP              NODE                           NOMINATED NODE   READINESS GATES
    spark-pi-xxxxx591db3xxxxx-exec-1   1/1     Running   0          15s   192.168.x.xxx   virtual-kubelet-cn-xxxxxxx-x   <none>           <none>
    spark-pi-driver                    1/1     Running   0          39s   192.168.x.xxx   virtual-kubelet-cn-xxxxxxx-x   <none>           <none>

    由预期输出得到,Pod的状态为Running,表示Spark应用已在ACS集群中正常运行。

结果验证

  1. Spark应用的状态变为Completed后,执行以下命令,查看Spark应用运行结果。

    kubectl logs -n spark-demo spark-pi-driver

    预期输出:

    ......
    24/09/10 07:21:30 INFO DAGScheduler: Job 0 finished: reduce at SparkPi.scala:38, took 1.346414 s
    Pi is roughly 3.1402757013785068
    ......

    从结果中可以看到,执行Spark计算任务的耗时为1.346414 s,计算出Pi的值为3.1402757013785068

    重要

    本步骤中输出的耗时和Pi值数据仅为参考值,实际数据以您的操作环境为准。

  2. 执行以下命令,通过alibabacloud.com/compute-qos标签来查看Pod算力质量。

    kubectl get pod -n spark-demo -Lalibabacloud.com/compute-qos -o wide

    预期输出:

    NAME                               READY   STATUS      RESTARTS   AGE     IP              NODE                           NOMINATED NODE   READINESS GATES   COMPUTE-QOS
    spark-pi-xxxxx591db3xxxxx-exec-1   0/1     Completed   0          6m35s   192.168.x.xxx   virtual-kubelet-cn-xxxxxxx-x   <none>           <none>            best-effort
    spark-pi-driver                    0/1     Completed   0          8m11s   192.168.x.xxx   virtual-kubelet-cn-xxxxxxx-x   <none>           <none>            default

    从结果中最右侧一栏COMPUTE-QOS可以看到,执行Spark计算任务的Pod的算力质量为best-effort