全部产品
Search
文档中心

Container Service for Kubernetes:Gunakan Spark Operator untuk menjalankan pekerjaan Spark

更新时间:Jul 02, 2025

Apache Spark adalah mesin komputasi untuk pemrosesan data skala besar. Alat ini banyak digunakan untuk menganalisis beban kerja dalam skenario komputasi data besar dan pembelajaran mesin. Spark Operator menyediakan kemampuan untuk mengotomatiskan penyebaran pekerjaan Spark serta mengelola siklus hidup pekerjaan Spark di kluster Kubernetes. Topik ini menjelaskan cara menggunakan Spark Operator untuk menjalankan pekerjaan Spark di kluster ACK, membantu insinyur data dengan cepat dan efisien menjalankan serta mengelola tugas pemrosesan data besar.

Prasyarat

Pengenalan Spark Operator

Spark Operator dirancang untuk menjalankan pekerjaan Spark di kluster Kubernetes dan mengotomatiskan manajemen siklus hidup pekerjaan Spark. Anda dapat mengirimkan dan mengelola pekerjaan Spark menggunakan CustomResourceDefinitions (CRDs) seperti SparkApplication dan ScheduledSparkApplication. Spark Operator dapat secara efisien memantau dan mengoptimalkan eksekusi pekerjaan Spark dengan memanfaatkan fitur Kubernetes seperti penskalaan otomatis, pemeriksaan kesehatan, dan manajemen sumber daya. ACK menyediakan komponen ack-spark-operator berdasarkan komponen open source kubeflow/spark-operator. Untuk informasi lebih lanjut, lihat Spark Operator | Kubeflow.

Keuntungan:

  • Manajemen yang Disederhanakan: Mengotomatiskan penyebaran pekerjaan Spark dan mengelola siklus hidupnya menggunakan konfigurasi pekerjaan deklaratif di Kubernetes.

  • Dukungan untuk Multi-Tenancy: Anda dapat menggunakan mekanisme namespace dan kuota sumber daya Kubernetes untuk mengalokasikan dan mengisolasi sumber daya pengguna. Mekanisme pemilihan node Kubernetes juga memastikan bahwa pekerjaan Spark dapat menggunakan sumber daya khusus.

  • Provisioning Sumber Daya Elastis: Instance kontainer elastis atau kolam node elastis digunakan untuk menyediakan sejumlah besar sumber daya elastis selama jam sibuk guna menyeimbangkan performa dan biaya.

Skenario yang Sesuai:

  • Analisis Data: Ilmuwan data dapat menggunakan Spark untuk analisis data interaktif dan pembersihan data.

  • Komputasi Data Batch: Anda dapat menjalankan pekerjaan batch terjadwal untuk memproses sejumlah besar dataset.

  • Pemrosesan Data Real-Time: Pustaka Spark Streaming memberikan kemampuan untuk streaming data real-time.

Ikhtisar prosedur

Topik ini menjelaskan cara menggunakan Spark Operator untuk menjalankan dan mengelola pekerjaan Spark di kluster ACK untuk memproses data besar secara efisien.

  1. Instal komponen ack-spark-operator: Instal Spark Operator di kluster ACK untuk mengelola dan menjalankan pekerjaan Spark.

  2. Kirimkan Pekerjaan Spark: Buat dan kirimkan file konfigurasi pekerjaan Spark untuk menjalankan tugas pemrosesan data.

  3. Lihat Pekerjaan Spark: Pantau status pekerjaan dan peroleh informasi detail serta log.

  4. Akses Antarmuka Web Spark: Lihat eksekusi pekerjaan Spark pada antarmuka web.

  5. Perbarui Pekerjaan Spark: Modifikasi konfigurasi pekerjaan berdasarkan kebutuhan bisnis dan secara dinamis ubah parameter.

  6. Hapus Pekerjaan Spark: Hapus pekerjaan Spark yang sudah selesai atau tidak lagi diperlukan untuk mengurangi biaya.

Langkah 1: Instal komponen ack-spark-operator

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

  2. Di halaman Marketplace, klik tab App Catalog. Temukan dan klik ack-spark-operator.

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

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

  5. Di langkah Parameters, konfigurasikan parameter dan klik OK.

    Tabel berikut menjelaskan beberapa parameter. Anda dapat menemukan konfigurasi parameter di bagian Parameters pada halaman ack-spark-operator.

    Parameter

    Deskripsi

    Contoh

    controller.replicas

    Jumlah replika controller.

    Nilai default: 1.

    webhook.replicas

    Jumlah replika webhook.

    Nilai default: 1.

    spark.jobNamespaces

    Namespace yang dapat menjalankan pekerjaan Spark. Jika parameter ini dibiarkan kosong, pekerjaan Spark dapat dijalankan di semua namespace. Pisahkan beberapa namespace dengan koma (,).

    • Nilai default: ["default"].

    • [""]: Semua namespace.

    • ["ns1","ns2","ns3"]: Tentukan satu atau lebih namespace.

    spark.serviceAccount.name

    Pekerjaan Spark secara otomatis membuat ServiceAccount bernama spark-operator-spark dan sumber daya kontrol akses berbasis peran (RBAC) yang sesuai di setiap namespace yang ditentukan oleh spark.jobNamespaces. Anda dapat menentukan nama kustom untuk ServiceAccount dan kemudian menentukan nama kustom saat Anda mengirimkan pekerjaan Spark.

    Nilai default: spark-operator-spark.

Langkah 2: Kirimkan pekerjaan Spark

Anda dapat membuat file YAML SparkApplication untuk mengirimkan pekerjaan Spark guna memproses data.

  1. Buat file YAML SparkApplication bernama spark-pi.yaml.

    apiVersion: sparkoperator.k8s.io/v1beta2
    kind: SparkApplication
    metadata:
      name: spark-pi
      namespace: default     # Pastikan namespace 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.2
      imagePullPolicy: IfNotPresent
      mainClass: org.apache.spark.examples.SparkPi
      mainApplicationFile: local:///opt/spark/examples/jars/spark-examples_2.12-3.5.2.jar
      arguments:
      - "1000"
      sparkVersion: 3.5.2
      driver:
        cores: 1
        coreLimit: 1200m
        memory: 512m
        serviceAccount: spark-operator-spark   # Ganti spark-operator-spark dengan nama kustom yang Anda tentukan.
      executor:
        instances: 1
        cores: 1
        coreLimit: 1200m
        memory: 512m
      restartPolicy:
        type: Never
  2. Jalankan perintah berikut untuk mengirimkan pekerjaan Spark:

    kubectl apply -f spark-pi.yaml

    Output yang Diharapkan:

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

Langkah 3: Lihat pekerjaan Spark

Anda dapat menjalankan perintah berikut untuk memeriksa status, informasi pod, dan log pekerjaan Spark:

  1. Jalankan perintah berikut untuk melihat 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 dan atur label sparkoperator.Kubernetes.io/app-name menjadi spark-pi untuk memeriksa status pod yang menjalankan pekerjaan Spark:

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

    Output yang Diharapkan:

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

    Setelah pekerjaan Spark selesai, semua pod executor secara otomatis dihapus oleh driver.

  3. Jalankan perintah berikut untuk melihat detail pekerjaan Spark:

    kubectl describe sparkapplication spark-pi

    Lihat Output yang Diharapkan

    Output bervariasi berdasarkan 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.2
      Image Pull Policy:      IfNotPresent
      Main Application File:  local:///opt/spark/examples/jars/spark-examples_2.12-3.5.2.jar
      Main Class:             org.apache.spark.examples.SparkPi
      Mode:                   cluster
      Restart Policy:
        Type:         Never
      Spark Version:  3.5.2
      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 entri log terakhir 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 antarmuka web Spark

Pekerjaan Spark menyediakan antarmuka web untuk memantau eksekusi pekerjaan Spark. Jalankan perintah kubectl port-forward untuk memetakan port di kluster ke port lokal guna mengakses antarmuka web Spark. Layanan antarmuka web Spark hanya tersedia ketika pekerjaan Spark sedang berjalan atau pod driver dalam status Running. Setelah pekerjaan Spark selesai, antarmuka web menjadi tidak dapat diakses.

Saat Anda menerapkan komponen ack-spark-operator, controller.uiService.enable secara otomatis diatur ke true, dan sebuah Service secara otomatis dibuat. Anda dapat memetakan port Service ke port lokal untuk mengakses antarmuka web. Jika Anda mengatur controller.uiService.enable ke false saat Anda menerapkan komponen, tidak ada Service yang dibuat. Dalam kasus ini, Anda dapat mengakses antarmuka web dengan memetakan port pod.

Penting

Port lokal yang ditentukan oleh perintah kubectl port-forward hanya cocok untuk lingkungan pengujian dan tidak cocok untuk lingkungan produksi. Berhati-hatilah saat menggunakan metode ini.

  1. Anda dapat memetakan port Service atau port pod ke port lokal berdasarkan kebutuhan bisnis Anda. Bagian berikut menjelaskan perintah yang relevan:

    • Jalankan perintah berikut untuk mengakses antarmuka web dengan memetakan port Service:

      kubectl port-forward services/spark-pi-ui-svc 4040
    • Jalankan perintah berikut untuk mengakses antarmuka web dengan memetakan port 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. Akses antarmuka web melalui http://127.0.0.1:4040.

(Opsional) Langkah 5: Perbarui pekerjaan Spark

Untuk memodifikasi parameter pekerjaan Spark, Anda dapat memperbarui file YAML pekerjaan Spark.

  1. Modifikasi file YAML bernama spark-pi.yaml. Sebagai contoh, atur parameter arguments menjadi 10000 dan parameter 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.2
      imagePullPolicy: IfNotPresent
      mainClass: org.apache.spark.examples.SparkPi
      mainApplicationFile: local:///opt/spark/examples/jars/spark-examples_2.12-3.5.2.jar
      arguments:
      - "10000"
      sparkVersion: 3.5.2
      driver:
        cores: 1
        coreLimit: 1200m
        memory: 512m
        serviceAccount: spark
      executor:
        instances: 2
        cores: 1
        coreLimit: 1200m
        memory: 512m
      restartPolicy:
        type: Never
  2. Jalankan perintah berikut untuk memperbarui pekerjaan Spark:

    kubectl apply -f spark-pi.yaml
  3. Jalankan perintah berikut untuk melihat status pekerjaan Spark:

    kubectl get sparkapplication spark-pi

    Pekerjaan Spark berjalan lagi. 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

Setelah Anda menyelesaikan semua langkah dalam topik ini, jika Anda tidak lagi memerlukan pekerjaan Spark, Anda dapat melepaskan sumber daya terkait menggunakan perintah berikut.

Jalankan perintah berikut untuk menghapus pekerjaan Spark yang dibuat pada langkah sebelumnya:

kubectl delete -f spark-pi.yaml

Anda juga dapat menjalankan perintah berikut:

kubectl delete sparkapplication spark-pi