全部产品
Search
文档中心

Container Service for Kubernetes:Gunakan sumber daya idle untuk menjadwalkan dan mendistribusikan pekerjaan Spark di beberapa cluster

更新时间:Jul 02, 2025

Jika Anda memiliki beberapa cluster Container Service for Kubernetes (ACK) yang menjalankan layanan online dan ingin memanfaatkan sumber daya idle dalam cluster untuk menjalankan pekerjaan Spark tanpa mengganggu layanan online, Anda dapat menggunakan fitur penjadwalan dan distribusi pekerjaan Spark multi-cluster yang disediakan oleh Distributed Cloud Container Platform for Kubernetes (ACK One). Topik ini menjelaskan cara menggunakan instance ACK One Fleet dan komponen ACK Koordinator untuk memanfaatkan sumber daya idle dalam cluster terkait dengan instance Fleet guna menjadwalkan dan mendistribusikan pekerjaan Spark di beberapa cluster. Ini membantu Anda memaksimalkan penggunaan sumber daya idle di berbagai cluster. Anda juga dapat mengonfigurasi prioritas pekerjaan dan fitur colocation untuk mencegah gangguan pada layanan online akibat pekerjaan Spark.

Informasi latar belakang

Fitur berikut diperlukan saat menggunakan sumber daya idle untuk menjadwalkan dan mendistribusikan pekerjaan Spark di beberapa cluster:

  • Penjadwalan dan distribusi pekerjaan Spark multi-cluster yang disediakan oleh instance ACK One Fleet, termasuk penjadwalan berbasis kesadaran sumber daya idle.

  • Colocation Koordinator yang didukung oleh ACK Spark Operator.

  • Colocation satu cluster dari ACK Koordinator.

Prosedur:

  1. Hubungkan beberapa cluster ACK ke instance ACK Fleet dan deploy ACK Koordinator serta ACK Spark Operator di setiap cluster terkait.

  2. Buat SparkApplication dan PropagationPolicy untuk instance Fleet.

  3. Komponen penjadwalan multi-cluster (Global Scheduler) dari instance Fleet mencocokkan permintaan sumber daya pekerjaan Spark berdasarkan sisa sumber daya dari setiap sub-cluster terkait.

    Untuk sub-cluster dengan versi Kubernetes 1.28 atau lebih baru, instance Fleet mendukung pemesanan sumber daya untuk meningkatkan tingkat keberhasilan penjadwalan pekerjaan Spark.

  4. Setelah instance Fleet menjadwalkan pekerjaan, SparkApplication dijadwalkan dan didistribusikan ke cluster terkait.

  5. Di cluster terkait, ACK Spark Operator menjalankan driver dan executor dari pekerjaan Spark. Pada saat yang sama, instance Fleet memantau status pekerjaan Spark di sub-cluster. Jika driver tidak dapat dijalankan karena sumber daya tidak mencukupi, instance Fleet akan menarik kembali SparkApplication setelah periode waktu tertentu dan menjadwalkan ulang SparkApplication ke cluster terkait lainnya yang memiliki sumber daya cukup.

Prasyarat

Langkah 1: deploy ack-koordinator di setiap cluster terkait

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

  2. Di halaman Clusters, klik nama cluster yang ingin Anda ubah. Di panel navigasi kiri, pilih Configurations > ConfigMaps.

  3. Di halaman ConfigMap, klik Create from YAML. Salin template YAML berikut ke editor kode Template. Untuk informasi lebih lanjut, lihat Memulai dengan Colocation.

    # Contoh ConfigMap ack-slo-config.
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: ack-slo-config
      namespace: kube-system
    data:
      colocation-config: |-
        {
          "enable": true
        }
      resource-qos-config: |-
        {
          "clusterStrategy": {
            "lsClass": {
              "cpuQOS": {
                "enable": true
              },
              "memoryQOS": {
                "enable": true
              },
              "resctrlQOS": {
                "enable": true
              }
            },
            "beClass": {
              "cpuQOS": {
                "enable": true
              },
              "memoryQOS": {
                "enable": true
              },
              "resctrlQOS": {
                "enable": true
              }
            }
          }
        }
      resource-threshold-config: |-
        {
          "clusterStrategy": {
            "enable": true
          }
        }

Langkah 2: (Opsional) Buat namespace pada instance Fleet dan distribusikan namespace ke cluster terkait

Sebelum menginstal ack-spark-operator di cluster terkait, pastikan bahwa cluster tersebut memiliki namespace yang didedikasikan untuk pekerjaan Spark. Jika tidak ada namespace yang tersedia, ack-spark-operator tidak dapat diinstal secara normal. Anda dapat membuat namespace pada instance Fleet dan kemudian membuat ClusterPropagationPolicy untuk mendistribusikan namespace ke setiap cluster terkait. Dalam contoh ini, namespace bernama spark dibuat dan didistribusikan ke setiap cluster terkait.

  1. Gunakan file kubeconfig dari instance Fleet untuk terhubung ke instance Fleet dan jalankan perintah berikut untuk membuat namespace bernama spark:

    kubectl create ns spark
  2. Buat ClusterPropagationPolicy untuk mendistribusikan namespace ke cluster terkait sesuai aturan tertentu. Jika Anda ingin mendistribusikan namespace ke semua cluster terkait, biarkan parameter clusterAffinity kosong.

    apiVersion: policy.one.alibabacloud.com/v1alpha1
    kind: ClusterPropagationPolicy
    metadata:
      name: ns-policy
    spec:
      resourceSelectors:
      - apiVersion: v1
        kind: Namespace
        name: spark
      placement:
        clusterAffinity:
          clusterNames:
          - ${cluster1-id} # ID dari cluster terkait.
          - ${cluster2-id} # ID dari cluster terkait.
        replicaScheduling:
          replicaSchedulingType: Duplicated

Langkah 3: Instal ack-spark-operator di cluster terkait

Instal ack-spark-operator versi 2.1.2 atau lebih baru di cluster terkait tempat Anda ingin menjalankan pekerjaan Spark.

  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 cluster dan namespace, lalu klik Next.

  5. Di langkah Parameters, pilih 2.1.2 dari daftar drop-down Chart Version, tambahkan namespace spark ke parameter jobNamespaces di editor kode Parameters, lalu klik OK.

    Penting

    Anda harus menentukan namespace dari SparkApplication yang ingin Anda buat di parameter spark.jobNamespaces.

    Tabel berikut menjelaskan beberapa parameter. Anda dapat menemukan konfigurasi parameter di bagian Parameters di 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 4: Buat PriorityClass pada instance Fleet dan distribusikan PriorityClass ke cluster terkait

Untuk memastikan bahwa pekerjaan Spark yang dikirim tidak menggunakan sumber daya yang digunakan oleh layanan online atau memengaruhi layanan online, kami sarankan memberikan prioritas lebih rendah pada pekerjaan Spark daripada layanan online.

    1. Gunakan file kubeconfig dari instance Fleet untuk membuat PriorityClass dengan prioritas rendah dan atur value menjadi negatif.

      apiVersion: scheduling.k8s.io/v1
      kind: PriorityClass
      metadata:
        name: low-priority
      value: -1000
      globalDefault: false
      description: "Prioritas rendah untuk aplikasi Spark"
    2. Buat ClusterPropagationPolicy pada instance Fleet untuk mendistribusikan PriorityClass ke cluster yang ditentukan. Jika Anda ingin mendistribusikan PriorityClass ke semua cluster terkait, Anda dapat menghapus parameter clusterAffinity.

      apiVersion: policy.one.alibabacloud.com/v1alpha1
      kind: ClusterPropagationPolicy
      metadata:
        name: priority-policy
      spec:
        preserveResourcesOnDeletion: false
        resourceSelectors:
        - apiVersion: scheduling.k8s.io/v1
          kind: PriorityClass
        placement:
          clusterAffinity:
            clusterNames:
            - ${cluster1-id} # ID cluster Anda.
            - ${cluster2-id} # ID cluster Anda.
      #      labelSelector:
      #        matchLabels:
      #          key: value
          replicaScheduling:
            replicaSchedulingType: Duplicated

Langkah 5: Kirim SparkApplication dalam arsitektur colocation pada instance Fleet

  1. Buat PropagationPolicy menggunakan template YAML berikut. PropagationPolicy digunakan untuk mendistribusikan semua SparkApplications yang menggunakan versi API sparkoperator.k8s.io/v1beta2 ke cluster terkait sesuai aturan tertentu. Jika Anda ingin mendistribusikan SparkApplications ke semua cluster terkait, biarkan parameter clusterAffinity kosong.

    apiVersion: policy.one.alibabacloud.com/v1alpha1
    kind: PropagationPolicy
    metadata:
      name: sparkapp-policy 
      namespace: spark
    spec:
      preserveResourcesOnDeletion: false
      propagateDeps: true
      placement:
        clusterAffinity:
          clusterNames:
          - ${cluster1-id} # ID dari cluster terkait.
          - ${cluster2-id} # ID dari cluster terkait.
    #      labelSelector:
    #        matchLabels:
    #          key: value
        replicaScheduling:
          replicaSchedulingType: Divided
          customSchedulingType: Gang
      resourceSelectors:
        - apiVersion: sparkoperator.k8s.io/v1beta2
          kind: SparkApplication
  2. Buat pekerjaan Spark pada instance Fleet. Tambahkan anotasi sparkoperator.k8s.io/koordinator-colocation: "true" ke SparkApplication untuk menggunakan sumber daya idle dalam menjadwalkan pod driver dan pod executor dari SparkApplication. Template SparkApplication berikut menggunakan sumber daya idle untuk menjadwalkan pod driver dan pod executor.

    apiVersion: sparkoperator.k8s.io/v1beta2
    kind: SparkApplication
    metadata:
      name: spark-pi
      namespace: spark
    spec:
      arguments:
      - "50000"
      driver:
        coreLimit: 1000m
        cores: 1
        memory: 512m
        priorityClassName: low-priority
        template:
          metadata:
            annotations:
              sparkoperator.k8s.io/koordinator-colocation: "true"
          spec:
            containers:
            - name: spark-kubernetes-driver
            serviceAccount: spark-operator-spark
      executor:
        coreLimit: 1000m
        cores: 1
        instances: 1
        memory: 1g
        priorityClassName: low-priority
        template:
          metadata:
            annotations:
              sparkoperator.k8s.io/koordinator-colocation: "true"
          spec:
            containers:
            - name: spark-kubernetes-executor
      image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/spark:3.5.4
      mainApplicationFile: local:///opt/spark/examples/jars/spark-examples_2.12-3.5.4.jar
      mainClass: org.apache.spark.examples.SparkPi
      mode: cluster
      restartPolicy:
        type: Never
      sparkVersion: 3.5.4
      type: Scala

Langkah 6: Periksa status pekerjaan Spark

  1. Jalankan perintah berikut pada instance Fleet untuk melihat status pekerjaan Spark:

    kubectl get sparkapp -nspark

    Keluaran yang Diharapkan:

    NAME       STATUS    ATTEMPTS   START                  FINISH       AGE
    spark-pi   RUNNING   1          2025-03-05T11:19:43Z   <no value>   48s
  2. Jalankan perintah berikut pada instance Fleet untuk menanyakan cluster terkait tempat pekerjaan Spark dijadwalkan:

    kubectl describe sparkapp spark-pi  -nspark

    Keluaran yang Diharapkan:

    Normal   ScheduleBindingSucceed  2m29s                  default-scheduler                   Binding has been scheduled successfully. Result: {c6xxxxx:0,[{driver 1} {executor 1}]}
  3. Jalankan perintah berikut pada instance Fleet untuk menanyakan status distribusi sumber daya:

    kubectl get rb  spark-pi-sparkapplication -nspark 

    Keluaran yang Diharapkan:

    NAME                        SCHEDULED   FULLYAPPLIED   OVERRIDDEN   ALLAVAILABLE   AGE
    spark-pi-sparkapplication   True        True           True         True     
  4. Jalankan perintah berikut pada instance Fleet untuk memeriksa status pekerjaan Spark di cluster terkait:

    kubectl amc get sparkapp -M -nspark

    Keluaran yang Diharapkan:

    NAME       CLUSTER     STATUS      ATTEMPTS   START                  FINISH                 AGE   ADOPTION
    spark-pi   c6xxxxxxx   COMPLETED   1          2025-02-24T12:10:34Z   2025-02-24T12:11:20Z   61s   Y
  5. Jalankan perintah berikut pada instance Fleet untuk menanyakan status pod:

    kubectl amc get pod -M -nspark    

    Keluaran yang Diharapkan:

    NAME                               CLUSTER     READY   STATUS      RESTARTS   AGE
    spark-pi-3c0565956608ad6d-exec-1   c6xxxxxxx   1/1     Running            0          2m35s
    spark-pi-driver                    c6xxxxxxx   1/1     Running            0          2m50s
  6. Jalankan perintah berikut pada instance Fleet untuk melihat detail pekerjaan Spark di cluster terkait:

    kubectl amc get sparkapp spark-pi -m ${member clusterid} -oyaml -nspark