All Products
Search
Document Center

Container Service for Kubernetes:Jalankan pekerjaan Spark dengan Spark Operator

Last Updated:Jun 16, 2026

Instal Spark Operator pada ACK untuk mengelola seluruh siklus hidup pekerjaan Spark menggunakan manifes Kubernetes deklaratif.

Prasyarat

Cara kerja

Spark Operator mengotomatiskan siklus hidup pekerjaan Spark di Kubernetes menggunakan sumber daya CustomResourceDefinition (CRD) seperti SparkApplication dan ScheduledSparkApplication. Operator ini memanfaatkan fitur native Kubernetes seperti auto-scaling, pemeriksaan kesehatan, dan manajemen sumber daya. ACK menyediakan ack-spark-operator berdasarkan kubeflow/spark-operator. Lihat Spark Operator | Kubeflow.

Manfaat:

  • Manajemen yang disederhanakan: Otomatiskan penerapan dan siklus hidup pekerjaan Spark dengan konfigurasi Kubernetes deklaratif.

  • Dukungan multi-tenancy: Gunakan namespace Kubernetes dan kuota sumber daya untuk isolasi sumber daya. Gunakan node selection untuk menjalankan beban kerja Spark pada sumber daya khusus.

  • Provisioning sumber daya elastis: Lakukan penskalaan dengan sumber daya elastis seperti Elastic Container Instance (ECI) atau elastic node pools selama beban puncak untuk menyeimbangkan performa dan biaya.

Kasus penggunaan:

  • Analytika data: Gunakan Spark untuk analitik interaktif dan pembersihan data.

  • Komputasi batch: Jalankan pekerjaan batch terjadwal untuk memproses set data berskala besar.

  • Pemrosesan real-time: Spark Streaming memungkinkan pemrosesan aliran data secara real-time.

Ikhtisar prosedur

Alur kerja mencakup penerapan Spark Operator, pengiriman pekerjaan, pemantauan eksekusi, dan pengelolaan siklus hidup pekerjaan.

  1. Terapkan komponen ack-spark-operator: Instal Spark Operator di kluster ACK Anda.

  2. Kirim pekerjaan Spark: Buat dan kirim manifes pekerjaan Spark.

  3. Pantau pekerjaan Spark: Periksa status pekerjaan, status pod, dan log.

  4. Akses UI web Spark: Lihat detail eksekusi pekerjaan di browser.

  5. Perbarui pekerjaan Spark: Ubah dan terapkan ulang manifes pekerjaan.

  6. Hapus pekerjaan Spark: Hapus pekerjaan dan lepaskan sumber daya.

Langkah 1: Terapkan komponen ack-spark-operator

  1. Masuk ke ACK console. Di panel navigasi kiri, klik Marketplace > Marketplace.

  2. Di halaman Marketplace, klik tab App Catalog, lalu cari dan pilih ack-spark-operator.

  3. Di halaman ack-spark-operator, klik Deploy.

  4. Di panel Create, pilih kluster dan namespace, lalu klik Next.

  5. Di halaman Parameters, konfigurasikan parameter, lalu klik OK.

    Parameter utama tercantum di bawah ini. Untuk daftar lengkap, lihat tab ConfigMaps di halaman ack-spark-operator.

    Parameter

    Deskripsi

    Bawaan

    controller.replicas

    Jumlah replika controller.

    1

    webhook.replicas

    Jumlah replika webhook.

    1

    spark.jobNamespaces

    Namespace tempat pekerjaan Spark dapat dijalankan. String kosong memungkinkan semua namespace. Pisahkan beberapa nilai dengan koma (,).

    • ["default"] (bawaan)

    • [""] (semua namespace)

    • ["ns1","ns2","ns3"] (beberapa namespace)

    spark.serviceAccount.name

    Spark Operator membuat ServiceAccount bernama spark-operator-spark dan sumber daya RBAC yang diperlukan di setiap namespace yang ditentukan oleh spark.jobNamespaces. Jika dikustomisasi, tentukan nama baru saat mengirim pekerjaan Spark.

    spark-operator-spark

Langkah 2: Kirim pekerjaan Spark

Buat manifes SparkApplication untuk mengirim pekerjaan Spark.

  1. Buat manifes berikut dan simpan sebagai spark-pi.yaml.

    apiVersion: sparkoperator.k8s.io/v1beta2
    kind: SparkApplication
    metadata:
      name: spark-pi
      namespace: default     # Namespace harus ada dalam daftar namespace yang ditentukan oleh spark.jobNamespaces.
    spec:
      type: Scala
      mode: cluster
      image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/spark:3.5.4
      imagePullPolicy: IfNotPresent
      mainClass: org.apache.spark.examples.SparkPi
      mainApplicationFile: local:///opt/spark/examples/jars/spark-examples_2.12-3.5.4.jar
      arguments:
      - "1000"
      sparkVersion: 3.5.4
      driver:
        cores: 1
        coreLimit: 1200m
        memory: 512m
        serviceAccount: spark-operator-spark   # Jika Anda mengkustomisasi nama ServiceAccount, ubah nilainya sesuai.
      executor:
        instances: 1
        cores: 1
        coreLimit: 1200m
        memory: 512m
      restartPolicy:
        type: Never
  2. Kirim pekerjaan Spark:

    kubectl apply -f spark-pi.yaml

    Output yang diharapkan:

    sparkapplication.sparkoperator.k8s.io/spark-pi created

Langkah 3: Pantau pekerjaan Spark

Periksa status, pod, dan log pekerjaan Spark.

  1. Periksa status pekerjaan Spark:

    kubectl get sparkapplication spark-pi

    Output yang diharapkan:

    NAME       STATUS      ATTEMPTS   START                  FINISH       AGE
    spark-pi   SUBMITTED   1          2024-06-04T03:17:11Z   <no value>   15s
  2. Periksa status pod. Ini memfilter pod berdasarkan label sparkoperator.k8s.io/app-name=spark-pi:

    kubectl get pod -l sparkoperator.k8s.io/app-name=spark-pi

    Output yang diharapkan:

    NAME                               READY   STATUS    RESTARTS   AGE
    spark-pi-driver                    1/1     Running   0          49s
    spark-pi-7272428fc8f5f392-exec-1   1/1     Running   0          13s

    Setelah pekerjaan selesai, driver menghapus semua pod executor.

  3. Lihat detail pekerjaan Spark:

    kubectl describe sparkapplication spark-pi

    Contoh output

    Output bervariasi tergantung status pekerjaan.

    Name:         spark-pi
    Namespace:    default
    Labels:       <none>
    Annotations:  <none>
    API Version:  sparkoperator.k8s.io/v1beta2
    Kind:         SparkApplication
    Metadata:
      Creation Timestamp:  2024-06-04T03:16:59Z
      Generation:          1
      Resource Version:    1350200
      UID:                 1a1f9160-5dbb-XXXX-XXXX-be1c1fda4859
    Spec:
      Arguments:
        1000
      Driver:
        Core Limit:  1200m
        Cores:       1
        Memory:           512m
        Service Account:  spark
      Executor:
        Core Limit:  1200m
        Cores:       1
        Instances:   1
        Memory:               512m
      Image:                  registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/spark:3.5.4
      Image Pull Policy:      IfNotPresent
      Main Application File:  local:///opt/spark/examples/jars/spark-examples_2.12-3.5.4.jar
      Main Class:             org.apache.spark.examples.SparkPi
      Mode:                   cluster
      Restart Policy:
        Type:         Never
      Spark Version:  3.5.4
      Type:           Scala
    Status:
      Application State:
        State:  COMPLETED
      Driver Info:
        Pod Name:             spark-pi-driver
        Web UI Address:       172.XX.XX.92:0
        Web UI Port:          4040
        Web UI Service Name:  spark-pi-ui-svc
      Execution Attempts:     1
      Executor State:
        spark-pi-26c5XXXXX1408337-exec-1:  COMPLETED
      Last Submission Attempt Time:        2024-06-04T03:17:11Z
      Spark Application Id:                spark-0042dead12XXXXXX43675f09552a946
      Submission Attempts:                 1
      Submission ID:                       117ee161-3951-XXXX-XXXX-e7d24626c877
      Termination Time:                    2024-06-04T03:17:55Z
    Events:
      Type    Reason                     Age   From            Message
      ----    ------                     ----  ----            -------
      Normal  SparkApplicationAdded      91s   spark-operator  SparkApplication spark-pi was added, enqueuing it for submission
      Normal  SparkApplicationSubmitted  79s   spark-operator  SparkApplication spark-pi was submitted successfully
      Normal  SparkDriverRunning         61s   spark-operator  Driver spark-pi-driver is running
      Normal  SparkExecutorPending       56s   spark-operator  Executor [spark-pi-26c5XXXXX1408337-exec-1] is pending
      Normal  SparkExecutorRunning       53s   spark-operator  Executor [spark-pi-26c5XXXXX1408337-exec-1] is running
      Normal  SparkDriverCompleted       35s   spark-operator  Driver spark-pi-driver completed
      Normal  SparkApplicationCompleted  35s   spark-operator  SparkApplication spark-pi completed
      Normal  SparkExecutorCompleted     35s   spark-operator  Executor [spark-pi-26c5XXXXX1408337-exec-1] completed
  4. Lihat 20 baris terakhir log pod driver:

    kubectl logs --tail=20 spark-pi-driver

    Output yang diharapkan:

    24/05/30 10:05:30 INFO TaskSchedulerImpl: Removed TaskSet 0.0, whose tasks have all completed, from pool
    24/05/30 10:05:30 INFO DAGScheduler: ResultStage 0 (reduce at SparkPi.scala:38) finished in 7.942 s
    24/05/30 10:05:30 INFO DAGScheduler: Job 0 is finished. Cancelling potential speculative or zombie tasks for this job
    24/05/30 10:05:30 INFO TaskSchedulerImpl: Killing all running tasks in stage 0: Stage finished
    24/05/30 10:05:30 INFO DAGScheduler: Job 0 finished: reduce at SparkPi.scala:38, took 8.043996 s
    Pi is roughly 3.1419522314195225
    24/05/30 10:05:30 INFO SparkContext: SparkContext is stopping with exitCode 0.
    24/05/30 10:05:30 INFO SparkUI: Stopped Spark web UI at http://spark-pi-1e18858fc8f56b14-driver-svc.default.svc:4040
    24/05/30 10:05:30 INFO KubernetesClusterSchedulerBackend: Shutting down all executors
    24/05/30 10:05:30 INFO KubernetesClusterSchedulerBackend$KubernetesDriverEndpoint: Asking each executor to shut down
    24/05/30 10:05:30 WARN ExecutorPodsWatchSnapshotSource: Kubernetes client has been closed.
    24/05/30 10:05:30 INFO MapOutputTrackerMasterEndpoint: MapOutputTrackerMasterEndpoint stopped!
    24/05/30 10:05:30 INFO MemoryStore: MemoryStore cleared
    24/05/30 10:05:30 INFO BlockManager: BlockManager stopped
    24/05/30 10:05:30 INFO BlockManagerMaster: BlockManagerMaster stopped
    24/05/30 10:05:30 INFO OutputCommitCoordinator$OutputCommitCoordinatorEndpoint: OutputCommitCoordinator stopped!
    24/05/30 10:05:30 INFO SparkContext: Successfully stopped SparkContext
    24/05/30 10:05:30 INFO ShutdownHookManager: Shutdown hook called
    24/05/30 10:05:30 INFO ShutdownHookManager: Deleting directory /var/data/spark-14ed60f1-82cd-4a33-b1b3-9e5d975c5b1e/spark-01120c89-5296-4c83-8a20-0799eef4e0ee
    24/05/30 10:05:30 INFO ShutdownHookManager: Deleting directory /tmp/spark-5f98ed73-576a-41be-855d-dabdcf7de189

Langkah 4: Akses UI web Spark

UI web hanya tersedia selama pod driver berstatus Running.

Secara bawaan, controller.uiService.enable bernilai true, yang membuat Service untuk mengekspos UI web guna penerusan port. Jika diatur ke false, tidak ada Service yang dibuat dan Anda harus melakukan port-forward langsung dari pod driver.

Penting

kubectl port-forward cocok untuk pengujian tetapi tidak disarankan untuk produksi karena risiko keamanan.

  1. Teruskan port UI web ke mesin lokal Anda:

    • Port-forward melalui Service

      kubectl port-forward services/spark-pi-ui-svc 4040
    • Port-forward melalui pod

      kubectl port-forward pods/spark-pi-driver 4040

      Output yang diharapkan:

      Forwarding from 127.0.0.1:4040 -> 4040
      Forwarding from [::1]:4040 -> 4040
  2. Buka http://127.0.0.1:4040 di browser Anda.

(Opsional) Langkah 5: Perbarui pekerjaan Spark

Perbarui manifes pekerjaan untuk mengubah parameter pekerjaan Spark.

  1. Edit spark-pi.yaml. Misalnya, atur arguments menjadi 10000 dan jumlah instans executor menjadi 2.

    apiVersion: sparkoperator.k8s.io/v1beta2
    kind: SparkApplication
    metadata:
      name: spark-pi
    spec:
      type: Scala
      mode: cluster
      image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/spark:3.5.4
      imagePullPolicy: IfNotPresent
      mainClass: org.apache.spark.examples.SparkPi
      mainApplicationFile: local:///opt/spark/examples/jars/spark-examples_2.12-3.5.4.jar
      arguments:
      - "10000"
      sparkVersion: 3.5.4
      driver:
        cores: 1
        coreLimit: 1200m
        memory: 512m
        serviceAccount: spark-operator-spark # Jika Anda mengkustomisasi nama ServiceAccount, ubah nilainya sesuai.
      executor:
        instances: 2
        cores: 1
        coreLimit: 1200m
        memory: 512m
      restartPolicy:
        type: Never
  2. Terapkan perubahan:

    kubectl apply -f spark-pi.yaml
  3. Periksa status pekerjaan:

    kubectl get sparkapplication spark-pi

    Pekerjaan Spark akan dijalankan kembali. Output yang diharapkan:

    NAME       STATUS    ATTEMPTS   START                  FINISH       AGE
    spark-pi   RUNNING   1          2024-06-04T03:37:34Z   <no value>   20m

(Opsional) Langkah 6: Hapus pekerjaan Spark

Hapus pekerjaan Spark untuk melepaskan sumber daya yang terkait.

kubectl delete -f spark-pi.yaml

Atau:

kubectl delete sparkapplication spark-pi

Referensi