全部产品
Search
文档中心

Elastic Container Instance:Jalankan tugas Spark pada instance kontainer elastis

更新时间:Jul 06, 2025

Anda dapat menjalankan tugas Spark pada Elastic Container Instance di dalam kluster Kubernetes. Elastic Container Instance menyediakan sumber daya yang dapat diskalakan serta memastikan penyebaran otomatis dan ketersediaan tinggi untuk tugas Spark, meningkatkan efisiensi dan stabilitas pelaksanaannya. Topik ini menjelaskan cara menginstal Kubernetes Operator untuk Apache Spark di kluster ACK Serverless dan menjalankan tugas Spark pada instance kontainer elastis.

Informasi latar belakang

Apache Spark adalah program open source yang banyak digunakan untuk menganalisis beban kerja dalam skenario seperti komputasi data besar dan pembelajaran mesin. Anda dapat menggunakan Kubernetes untuk menjalankan dan mengelola sumber daya pada Apache Spark 2.3.0 dan versi lebih baru.

Kubernetes Operator untuk Apache Spark dirancang untuk menjalankan tugas Spark di dalam kluster Kubernetes. Ini memungkinkan Anda menyerahkan tugas Spark yang didefinisikan dalam definisi sumber daya kustom (CRD) ke kluster Kubernetes. Kubernetes Operator untuk Apache Spark memberikan manfaat berikut:

  • Menyediakan lebih banyak fitur dibandingkan dengan Apache Spark open source.

  • Dapat diintegrasikan dengan komponen penyimpanan, pemantauan, dan pencatatan Kubernetes.

  • Mendukung fitur canggih Kubernetes seperti pemulihan bencana dan penskalaan otomatis, serta mengoptimalkan penjadwalan sumber daya.

Persiapan

  1. Buat sebuah kluster ACK Serverless.

    Buat sebuah kluster ACK Serverless di konsol ACK. Untuk informasi lebih lanjut, lihat Buat kluster ACK Serverless.

    Penting

    Jika Anda perlu menarik gambar melalui Internet atau jika pekerjaan pelatihan Anda memerlukan akses ke Internet, Anda harus mengonfigurasi Gateway NAT Internet.

    Anda dapat menggunakan kubectl dan salah satu metode berikut untuk mengelola dan mengakses kluster ACK Serverless:

  2. Buat sebuah bucket OSS.

    Anda harus membuat bucket Object Storage Service (OSS) untuk menyimpan data, termasuk data uji, hasil uji, dan log. Untuk informasi lebih lanjut, lihat Buat bucket.

Instal Kubernetes Operator untuk Apache Spark

  1. Instal Kubernetes Operator untuk Apache Spark.

    1. Di panel navigasi sisi kiri konsol ACK, pilih Marketplace > Marketplace.

    2. Di tab App Catalog, masukkan ack-spark-operator di kotak pencarian, temukan ack-spark-operator, dan klik ikonnya.

    3. Di pojok kanan atas halaman, klik Deploy.

    4. Di panel Deploy, pilih kluster tempat Anda ingin menginstal Kubernetes Operator untuk Apache Spark dan ikuti petunjuk di layar untuk menyelesaikan konfigurasi.

  2. Buat ServiceAccount, Role, dan RoleBinding.

    Tugas Spark memerlukan ServiceAccount untuk mendapatkan izin membuat pod. Oleh karena itu, Anda harus membuat ServiceAccount, Role, dan RoleBinding. Contoh YAML berikut menunjukkan cara membuat ServiceAccount, Role, dan RoleBinding. Ganti namespaces dengan nilai sebenarnya.

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: spark
      namespace: default
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      namespace: default
      name: spark-role
    rules:
    - apiGroups: [""]
      resources: ["pods"]
      verbs: ["*"]
    - apiGroups: [""]
      resources: ["services"]
      verbs: ["*"]
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: spark-role-binding
      namespace: default
    subjects:
    - kind: ServiceAccount
      name: spark
      namespace: default
    roleRef:
      kind: Role
      name: spark-role
      apiGroup: rbac.authorization.k8s.io

Bangun gambar tugas Spark

Anda perlu mengompilasi paket Java Archive (JAR) dari tugas Spark dan menggunakan Dockerfile untuk mengemas gambar tersebut.

Contoh berikut menunjukkan cara mengonfigurasi Dockerfile ketika gambar dasar Spark dari ACK digunakan.

FROM registry.aliyuncs.com/acs/spark:ack-2.4.5-latest
RUN mkdir -p /opt/spark/jars
# Jika Anda ingin membaca data dari OSS atau sink peristiwa ke OSS, tambahkan paket JAR berikut ke dalam gambar.
ADD https://repo1.maven.org/maven2/com/aliyun/odps/hadoop-fs-oss/3.3.8-public/hadoop-fs-oss-3.3.8-public.jar $SPARK_HOME/jars
ADD https://repo1.maven.org/maven2/com/aliyun/oss/aliyun-sdk-oss/3.8.1/aliyun-sdk-oss-3.8.1.jar $SPARK_HOME/jars
ADD https://repo1.maven.org/maven2/org/aspectj/aspectjweaver/1.9.5/aspectjweaver-1.9.5.jar $SPARK_HOME/jars
ADD https://repo1.maven.org/maven2/org/jdom/jdom/1.1.3/jdom-1.1.3.jar $SPARK_HOME/jars
COPY SparkExampleScala-assembly-0.1.jar /opt/spark/jars
Penting

Mungkin memakan waktu lama untuk menarik gambar Spark yang besar. Anda dapat menggunakan ImageCache untuk mempercepat penarikan gambar. Untuk informasi lebih lanjut, lihat Kelola cache gambar dan Gunakan ImageCache untuk mempercepat pembuatan pod.

Anda juga dapat menggunakan gambar dasar Spark dari Alibaba Cloud. Alibaba Cloud menyediakan gambar dasar Spark 2.4.5, yang dioptimalkan untuk penjadwalan sumber daya dan penskalaan otomatis di kluster Kubernetes. Gambar dasar ini mempercepat penjadwalan sumber daya dan startup aplikasi. Anda dapat mengaktifkan fitur optimasi penjadwalan dengan mengatur variabel enableAlibabaCloudFeatureGates di Helm chart menjadi true. Jika Anda ingin memulai aplikasi lebih cepat, Anda dapat mengatur enableWebhook menjadi false. spark-3

Buat template tugas Spark dan kirimkan tugas

Buat file YAML untuk tugas Spark dan terapkan tugas Spark.

  1. Buat file bernama spark-pi.yaml.

    Kode berikut memberikan contoh template dari tugas Spark tipikal. Untuk informasi lebih lanjut, lihat spark-on-k8s-operator.

    apiVersion: "sparkoperator.k8s.io/v1beta2"
    kind: SparkApplication
    metadata:
      name: spark-pi
      namespace: default
    spec:
      type: Scala
      mode: cluster
      image: "registry.aliyuncs.com/acs/spark:ack-2.4.5-latest"
      imagePullPolicy: Always
      mainClass: org.apache.spark.examples.SparkPi
      mainApplicationFile: "local:///opt/spark/examples/jars/spark-examples_2.11-2.4.5.jar"
      sparkVersion: "2.4.5"
      restartPolicy:
        type: Never
      driver:
        cores: 2
        coreLimit: "2"
        memory: "3g"
        memoryOverhead: "1g"
        labels:
          version: 2.4.5
        serviceAccount: spark
        annotations:
          k8s.aliyun.com/eci-kube-proxy-enabled: 'true'
          k8s.aliyun.com/eci-auto-imc: "true"
        tolerations:
        - key: "virtual-kubelet.io/provider"
          operator: "Exists"
      executor:
        cores: 2
        instances: 1
        memory: "3g"
        memoryOverhead: "1g"
        labels:
          version: 2.4.5
        annotations:
          k8s.aliyun.com/eci-kube-proxy-enabled: 'true'
          k8s.aliyun.com/eci-auto-imc: "true"
        tolerations:
        - key: "virtual-kubelet.io/provider"
          operator: "Exists"
  2. Terapkan tugas Spark.

    kubectl apply -f spark-pi.yaml

Konfigurasikan pengumpulan log

Untuk mengumpulkan log stdout dari tugas Spark, Anda dapat mengonfigurasi variabel lingkungan di bidang envVars dari Spark driver dan Spark executor. Log akan dikumpulkan secara otomatis. Untuk informasi lebih lanjut, lihat Sesuaikan pengumpulan log untuk instance kontainer elastis.

envVars:
   aliyun_logs_test-stdout_project: test-k8s-spark
   aliyun_logs_test-stdout_machinegroup: k8s-group-app-spark
   aliyun_logs_test-stdout: stdout

Sebelum mengirimkan tugas Spark, Anda dapat mengonfigurasi variabel lingkungan dari Spark driver dan Spark executor seperti yang ditunjukkan dalam kode sebelumnya untuk mengimplementasikan pengumpulan log otomatis. spark-1

Konfigurasikan server histori

Server histori Spark memungkinkan Anda meninjau tugas Spark. Anda dapat mengatur bidang SparkConf di CRD aplikasi Spark untuk memungkinkan aplikasi menyinkronkan peristiwa ke OSS. Lalu, Anda dapat menggunakan server histori untuk mengambil data dari OSS. Kode berikut memberikan contoh konfigurasi:

sparkConf:
   "spark.eventLog.enabled": "true"
   "spark.eventLog.dir": "oss://bigdatastore/spark-events"
   "spark.hadoop.fs.oss.impl": "org.apache.hadoop.fs.aliyun.oss.AliyunOSSFileSystem"
   # oss bucket endpoint seperti oss-cn-beijing.aliyuncs.com
   "spark.hadoop.fs.oss.endpoint": "oss-cn-beijing.aliyuncs.com"
   "spark.hadoop.fs.oss.accessKeySecret": ""
   "spark.hadoop.fs.oss.accessKeyId": ""

Alibaba Cloud menyediakan Helm chart untuk menerapkan server histori Spark. Untuk menerapkannya, masuk ke konsol Container Service ACK, pilih Marketplace > Marketplace di panel navigasi sisi kiri. Di tab App Catalog, cari dan terapkan ack-spark-history-server. Saat menerapkan server histori Spark, tentukan informasi OSS di bagian Parameters. Kode berikut menunjukkan contohnya:

oss:
  enableOSS: true
  # Masukkan accessKeyId Anda
  alibabaCloudAccessKeyId: ""
  # Masukkan accessKeySecret Anda
  alibabaCloudAccessKeySecret: ""
  # oss bucket endpoint seperti oss-cn-beijing.aliyuncs.com
  alibabaCloudOSSEndpoint: "oss-cn-beijing.aliyuncs.com"
  # jalur file oss seperti oss://bucket-name/path
  eventsDir: "oss://bigdatastore/spark-events"

Setelah menerapkan server histori Spark, Anda dapat melihat titik akhir eksternalnya di halaman Services. Akses titik akhir eksternal server histori Spark untuk melihat tugas Spark historis. spark-2

Lihat hasil dari tugas Spark

  1. Kueri status pod.

    kubectl get pods

    Output yang diharapkan:

    NAME                            READY      STATUS     RESTARTS   AGE
    spark-pi-1547981232122-driver   1/1       Running    0          12s
    spark-pi-1547981232122-exec-1   1/1       Running    0          3s
  2. Kueri antarmuka pengguna Spark real-time.

    kubectl port-forward spark-pi-1547981232122-driver 4040:4040
  3. Kueri status aplikasi Spark.

    kubectl describe sparkapplication spark-pi

    Output yang diharapkan:

    Name:         spark-pi
    Namespace:    default
    Labels:       <none>
    Annotations:  kubectl.kubernetes.io/last-applied-configuration:
                    {"apiVersion":"sparkoperator.k8s.io/v1alpha1","kind":"SparkApplication","metadata":{"annotations":{},"name":"spark-pi","namespace":"default"...}
    API Version:  sparkoperator.k8s.io/v1alpha1
    Kind:         SparkApplication
    Metadata:
      Creation Timestamp:  2019-01-20T10:47:08Z
      Generation:          1
      Resource Version:    4923532
      Self Link:           /apis/sparkoperator.k8s.io/v1alpha1/namespaces/default/sparkapplications/spark-pi
      UID:                 bbe7445c-1ca0-11e9-9ad4-062fd7c19a7b
    Spec:
      Deps:
      Driver:
        Core Limit:  200m
        Cores:       0.1
        Labels:
          Version:        2.4.0
        Memory:           512m
        Service Account:  spark
        Volume Mounts:
          Mount Path:  /tmp
          Name:        test-volume
      Executor:
        Cores:      1
        Instances:  1
        Labels:
          Version:  2.4.0
        Memory:     512m
        Volume Mounts:
          Mount Path:         /tmp
          Name:               test-volume
      Image:                  gcr.io/spark-operator/spark:v2.4.0
      Image Pull Policy:      Always
      Main Application File:  local:///opt/spark/examples/jars/spark-examples_2.11-2.4.0.jar
      Main Class:             org.apache.spark.examples.SparkPi
      Mode:                   cluster
      Restart Policy:
        Type:  Never
      Type:    Scala
      Volumes:
        Host Path:
          Path:  /tmp
          Type:  Directory
        Name:    test-volume
    Status:
      Application State:
        Error Message:
        State:          COMPLETED
      Driver Info:
        Pod Name:             spark-pi-driver
        Web UI Port:          31182
        Web UI Service Name:  spark-pi-ui-svc
      Execution Attempts:     1
      Executor State:
        Spark - Pi - 1547981232122 - Exec - 1:  COMPLETED
      Last Submission Attempt Time:             2019-01-20T10:47:14Z
      Spark Application Id:                     spark-application-1547981285779
      Submission Attempts:                      1
      Termination Time:                         2019-01-20T10:48:56Z
    Events:
      Type    Reason                     Age                 From            Message
      ----    ------                     ----                ----            -------
      Normal  SparkApplicationAdded      55m                 spark-operator  SparkApplication spark-pi was added, Enqueuing it for submission
      Normal  SparkApplicationSubmitted  55m                 spark-operator  SparkApplication spark-pi was submitted successfully
      Normal  SparkDriverPending         55m (x2 over 55m)   spark-operator  Driver spark-pi-driver is pending
      Normal  SparkExecutorPending       54m (x3 over 54m)   spark-operator  Executor spark-pi-1547981232122-exec-1 is pending
      Normal  SparkExecutorRunning       53m (x4 over 54m)   spark-operator  Executor spark-pi-1547981232122-exec-1 is running
      Normal  SparkDriverRunning         53m (x12 over 55m)  spark-operator  Driver spark-pi-driver is running
      Normal  SparkExecutorCompleted     53m (x2 over 53m)   spark-operator  Executor spark-pi-1547981232122-exec-1 completed
  4. Lihat hasil dari tugas Spark di log.

    NAME                                      READY     STATUS      RESTARTS   AGE
    spark-pi-1547981232122-driver   0/1       Completed   0          1m

    Jika aplikasi Spark berada dalam status Succeed, atau pod driver Spark berada dalam status Completed, hasil dari tugas Spark tersedia. Anda dapat mencetak log dan melihat hasil dari tugas Spark di log.

    kubectl logs spark-pi-1547981232122-driver
    Pi is roughly 3.152155760778804