All Products
Search
Document Center

Container Service for Kubernetes:Jalankan pekerjaan Spark dengan Spark Operator

Last Updated:Mar 25, 2026

Apache Spark adalah mesin komputasi berkecepatan tinggi untuk pemrosesan data skala besar yang banyak digunakan dalam analitik data dan pembelajaran mesin. Spark Operator mengotomatiskan penerapan dan manajemen siklus hidup pekerjaan Spark di Kubernetes. Topik ini memandu Anda dalam menggunakan Spark Operator untuk menjalankan dan mengelola pekerjaan Spark pada kluster ACK guna menangani beban kerja data besar secara efisien.

Prasyarat

Cara kerja

Spark Operator mengotomatiskan siklus hidup pekerjaan Spark di Kubernetes. Operator ini menggunakan sumber daya CustomResourceDefinition (CRD) seperti SparkApplication dan ScheduledSparkApplication untuk mengelola pekerjaan Spark secara deklaratif. Spark Operator memanfaatkan fitur asli Kubernetes seperti auto-scaling, pemeriksaan kesehatan, dan manajemen sumber daya guna menjalankan serta memantau beban kerja Anda secara efisien. ACK menyediakan komponen ack-spark-operator yang didasarkan pada kubeflow/spark-operator dari komunitas. Untuk informasi selengkapnya, lihat Spark Operator | Kubeflow.

Manfaat:

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

  • Dukungan multi-tenancy: Gunakan namespace Kubernetes dan kuota sumber daya untuk isolasi serta alokasi sumber daya tingkat pengguna. Gunakan node selection untuk memastikan beban kerja Spark berjalan pada sumber daya khusus.

  • Penyediaan sumber daya elastis: Manfaatkan sumber daya elastis seperti Elastic Container Instance (ECI) atau elastic node pools untuk segera mendapatkan jumlah besar sumber daya elastis saat puncak bisnis, sehingga menyeimbangkan performa dan biaya.

Kasus penggunaan:

  • Analistik data: Ilmuwan data dapat menggunakan Spark untuk analitik data interaktif dan pembersihan data.

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

  • Pemrosesan real-time: Pustaka Spark Streaming menyediakan kemampuan untuk pemrosesan aliran data real-time.

Ikhtisar prosedur

Topik ini menjelaskan cara menggunakan Spark Operator untuk menjalankan dan mengelola pekerjaan Spark pada kluster ACK.

  1. Terapkan komponen ack-spark-operator: Pasang Spark Operator di kluster ACK Anda untuk mengaktifkan manajemen dan eksekusi pekerjaan Spark.

  2. Kirim pekerjaan Spark: Buat dan kirim manifes pekerjaan Spark untuk menjalankan tugas pemrosesan data tertentu.

  3. Pantau pekerjaan Spark: Pantau status berjalan pekerjaan tersebut dan peroleh informasi eksekusi beserta log secara detail.

  4. Akses UI web Spark: Akses UI web untuk tampilan eksekusi pekerjaan Spark yang lebih intuitif.

  5. Perbarui pekerjaan Spark: Sesuaikan konfigurasi pekerjaan sesuai kebutuhan Anda dan terapkan pembaruan tersebut.

  6. Hapus pekerjaan Spark: Bersihkan pekerjaan Spark yang telah selesai atau tidak diperlukan lagi untuk menghindari biaya tak terduga.

Langkah 1: Terapkan komponen ack-spark-operator

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

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

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

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

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

    Tabel berikut menjelaskan parameter konfigurasi utama. Untuk daftar lengkap, lihat tab ConfigMaps pada halaman ack-spark-operator.

    Parameter

    Deskripsi

    Bawaan

    controller.replicas

    Jumlah replika controller.

    1

    webhook.replicas

    Jumlah replika webhook.

    1

    spark.jobNamespaces

    Daftar namespace tempat pekerjaan Spark dapat dijalankan. String kosong "" memungkinkan semua namespace. Beberapa namespace dipisahkan dengan koma (,).

    • ["default"] (bawaan)

    • [""] (semua namespace)

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

    spark.serviceAccount.name

    Spark Operator secara otomatis membuat ServiceAccount bernama spark-operator-spark dan sumber daya RBAC yang diperlukan di setiap namespace yang ditentukan oleh spark.jobNamespaces. Jika Anda menyesuaikan nama ini, Anda harus menentukan nama baru tersebut saat mengirim pekerjaan Spark.

    spark-operator-spark

Langkah 2: Kirim pekerjaan Spark

Buat manifes SparkApplication untuk mengirim pekerjaan Spark guna pemrosesan data.

  1. Buat manifes SparkApplication 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 menyesuaikan nama ServiceAccount, ubah nilai ini sesuai.
      executor:
        instances: 1
        cores: 1
        coreLimit: 1200m
        memory: 512m
      restartPolicy:
        type: Never
  2. Jalankan perintah berikut untuk mengirim pekerjaan Spark.

    kubectl apply -f spark-pi.yaml

    Output yang diharapkan:

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

Langkah 3: Pantau pekerjaan Spark

Jalankan perintah berikut untuk memeriksa status, Pod terkait, dan log pekerjaan Spark.

  1. Jalankan perintah berikut untuk memeriksa 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. Jalankan perintah berikut untuk memeriksa status Pod pekerjaan Spark. Perintah ini memfilter Pod berdasarkan label sparkoperator.k8s.io/app-name dengan nilai 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 Spark selesai, driver secara otomatis menghapus semua Pod executor.

  3. Jalankan perintah berikut untuk melihat detail pekerjaan Spark.

    kubectl describe sparkapplication spark-pi

    Contoh output

    Output spesifik bervariasi tergantung status pekerjaan saat ini.

    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. Jalankan perintah berikut untuk melihat 20 baris terakhir log dari 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 dapat diakses selama Pod driver pekerjaan Spark berada dalam status Running. UI menjadi tidak tersedia setelah pekerjaan selesai.

Secara bawaan, saat Anda menerapkan komponen ack-spark-operator, parameter controller.uiService.enable diatur ke true. Hal ini secara otomatis membuat Service untuk mengekspos UI web, yang kemudian dapat Anda akses menggunakan penerusan port. Jika Anda mengatur parameter ini ke false saat penerapan, Service tidak akan dibuat. Dalam kasus ini, Anda harus meneruskan port langsung dari Pod driver.

Penting

Menggunakan kubectl port-forward cocok untuk verifikasi cepat di lingkungan pengujian, tetapi tidak disarankan untuk produksi karena risiko keamanan.

  1. Teruskan port UI web ke mesin lokal Anda dengan menggunakan salah satu perintah berikut sesuai skenario Anda:

    • Penerusan port melalui Service

      kubectl port-forward services/spark-pi-ui-svc 4040
    • Penerusan port 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 web Anda untuk mengakses UI web.

(Opsional) Langkah 5: Perbarui pekerjaan Spark

Jika Anda perlu mengubah parameter pekerjaan Spark, Anda dapat memperbarui manifesnya.

  1. Edit manifes spark-pi.yaml. Misalnya, ubah nilai 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 menyesuaikan nama ServiceAccount, ubah nilai ini sesuai.
      executor:
        instances: 2
        cores: 1
        coreLimit: 1200m
        memory: 512m
      restartPolicy:
        type: Never
  2. Jalankan perintah berikut untuk menerapkan perubahan.

    kubectl apply -f spark-pi.yaml
  3. Jalankan perintah berikut untuk memeriksa status pekerjaan.

    kubectl get sparkapplication spark-pi

    Pekerjaan Spark dijalankan kembali. Output yang diharapkan menunjukkan status RUNNING:

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

(Opsional) Langkah 6: Hapus pekerjaan Spark

Saat Anda tidak lagi memerlukan pekerjaan Spark, hapus pekerjaan tersebut untuk melepaskan sumber daya terkaitnya.

Hapus pekerjaan Spark yang telah Anda buat.

kubectl delete -f spark-pi.yaml

Atau, Anda dapat menjalankan perintah berikut:

kubectl delete sparkapplication spark-pi

Referensi