全部产品
Search
文档中心

Container Service for Kubernetes:Gunakan instance kontainer elastis untuk menjalankan pekerjaan Spark

更新时间:Jul 06, 2025

Topik ini menjelaskan cara menggunakan instance kontainer elastis untuk menjalankan pekerjaan Spark dalam klaster Container Service for Kubernetes (ACK). Anda dapat mengonfigurasi kebijakan penjadwalan untuk menjadwalkan pod ke instance kontainer elastis. Dengan demikian, Anda dapat membuat pod berbasis Elastic Container Instance dan hanya membayar untuk sumber daya yang digunakan oleh pod tersebut. Ini mengurangi sumber daya yang tidak terpakai serta mencegah biaya tak terduga, sekaligus meningkatkan efisiensi biaya dan kinerja pekerjaan Spark.

Prasyarat

Keuntungan

Anda dapat secara dinamis menjadwalkan driver pod dan executor pod dari pekerjaan Spark ke instance kontainer elastis dalam klaster ACK. Dengan cara ini, pekerjaan dapat berjalan dalam mode serverless. Sumber daya komputasi dasar setiap instance kontainer elastis diisolasi menggunakan sandbox virtual ringan. Instance kontainer elastis tidak saling memengaruhi.

Instance kontainer elastis memberikan keuntungan berikut untuk pekerjaan Spark:

  • Skala ultra-besar: Anda dapat membuat lebih dari 50.000 pod dalam klaster ACK Serverless tanpa perlu menambah konfigurasi tambahan atau merencanakan ukuran klaster.

  • Penskalaan tingkat detik: Anda dapat membuat ribuan pod dalam waktu singkat untuk menangani lonjakan lalu lintas.

  • Efisiensi biaya: Anda dikenakan biaya untuk instance kontainer elastis berdasarkan model bayar sesuai pemakaian, yang mencegah biaya tak terduga. Selain itu, Anda dapat mengonfigurasi beberapa jenis instance untuk menggunakan instance kontainer elastis preemptible, sehingga lebih jauh mengurangi biaya sumber daya komputasi.

Konfigurasikan penjadwalan sumber daya berdasarkan instance ECS dan instance kontainer elastis

Anda dapat menggunakan taints, tolerations, dan aturan afinitas node untuk mengonfigurasi penjadwalan sumber daya berdasarkan instance Elastic Compute Service (ECS) dan instance kontainer elastis. Sebagai contoh, Anda dapat menggunakan pengaturan ini untuk memungkinkan penjadwal hanya menggunakan instance ECS atau instance kontainer elastis, atau mengizinkan penjadwal secara otomatis mengajukan instance kontainer elastis ketika instance ECS tidak mencukupi. Untuk informasi lebih lanjut, lihat Konfigurasikan alokasi sumber daya berdasarkan instance ECS dan instance kontainer elastis. Contoh:

Hanya gunakan instance ECS

Secara default, taint virtual-kubelet.io/provider=alibabacloud:NoSchedule ditambahkan ke setiap instance kontainer elastis dalam klaster ACK. Oleh karena itu, penjadwal tidak menggunakan instance kontainer elastis secara default. Blok kode berikut digunakan untuk membuat SparkApplication yang hanya dijadwalkan ke instance ECS.

apiVersion: sparkoperator.k8s.io/v1beta2
kind: SparkApplication
metadata:
  name: spark-pi-ecs-only
  namespace: default
spec:
  type: Scala
  mode: cluster
  image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/spark:3.5.2
  mainClass: org.apache.spark.examples.SparkPi
  mainApplicationFile: local:///opt/spark/examples/jars/spark-examples_2.12-3.5.2.jar
  arguments: 
  - "5000"
  sparkVersion: 3.5.2
  driver:
    cores: 1
    coreLimit: 1200m
    memory: 512m
    serviceAccount: spark-operator-spark
  executor:
    instances: 2
    cores: 2
    memory: 4g

Hanya gunakan instance kontainer elastis

Anda dapat menambahkan tolerations tertentu ke pekerjaan Spark untuk mengizinkan penjadwal menjadwalkan pekerjaan ke instance kontainer elastis dengan taint yang cocok. Untuk mengaktifkan penjadwal agar hanya menjadwalkan pekerjaan ke instance kontainer elastis, Anda perlu menambahkan aturan afinitas node ke pekerjaan. Tambahkan toleration untuk mentolerir taint virtual-kubelet.io/provider=alibabacloud:NoSchedule pada instance kontainer elastis. Dengan cara ini, penjadwal hanya menjadwalkan pekerjaan Spark ke instance kontainer elastis. Blok kode berikut digunakan untuk membuat SparkApplication yang hanya dijadwalkan ke instance kontainer elastis.

apiVersion: sparkoperator.k8s.io/v1beta2
kind: SparkApplication
metadata:
  name: spark-pi-eci-only
  namespace: default
spec:
  type: Scala
  mode: cluster
  image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/spark:3.5.2
  mainClass: org.apache.spark.examples.SparkPi
  mainApplicationFile: local:///opt/spark/examples/jars/spark-examples_2.12-3.5.2.jar
  arguments: 
  - "5000"
  sparkVersion: 3.5.2
  driver:
    cores: 1
    coreLimit: 1200m
    memory: 512m
    serviceAccount: spark-operator-spark
    affinity:
      nodeAffinity:
        # Tambahkan aturan afinitas untuk mengizinkan pekerjaan dijadwalkan ke instance kontainer elastis.
        requiredDuringSchedulingIgnoredDuringExecution:
          nodeSelectorTerms:
          - matchExpressions:
            - key: type
              operator: In
              values:
              - virtual-kubelet
    tolerations:
    # Tambahkan toleration untuk mentolerir taint tertentu pada instance kontainer elastis.
    - key: virtual-kubelet.io/provider
      operator: Equal
      value: alibabacloud
      effect: NoSchedule
  executor:
    instances: 2
    cores: 2
    memory: 4g
    affinity:
      nodeAffinity:
        # Tambahkan aturan afinitas untuk mengizinkan pekerjaan dijadwalkan ke instance kontainer elastis.
        requiredDuringSchedulingIgnoredDuringExecution:
          nodeSelectorTerms:
          - matchExpressions:
            - key: type
              operator: In
              values:
              - virtual-kubelet
    tolerations:
    # Tambahkan toleration untuk mentolerir taint tertentu pada instance kontainer elastis.
    - key: virtual-kubelet.io/provider
      operator: Equal
      value: alibabacloud
      effect: NoSchedule

Ajukan instance kontainer elastis ketika instance ECS tidak mencukupi

Solusi penjadwalan umum adalah mengaktifkan penjadwal untuk mengajukan instance kontainer elastis ketika instance ECS tidak mencukupi. Ini mencegah pemborosan sumber daya. Selain itu, solusi ini dapat menskalakan aplikasi Anda untuk menangani lonjakan lalu lintas selama jam sibuk. Blok kode berikut digunakan untuk membuat SparkApplication yang dapat dijadwalkan ke instance kontainer elastis ketika instance ECS tidak mencukupi.

apiVersion: sparkoperator.k8s.io/v1beta2
kind: SparkApplication
metadata:
  name: spark-pi-ecs-first
  namespace: default
spec:
  type: Scala
  mode: cluster
  image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/spark:3.5.2
  mainClass: org.apache.spark.examples.SparkPi
  mainApplicationFile: local:///opt/spark/examples/jars/spark-examples_2.12-3.5.2.jar
  arguments: 
  - "5000"
  sparkVersion: 3.5.2
  driver:
    cores: 1
    coreLimit: 1200m
    memory: 512m
    serviceAccount: spark-operator-spark
    affinity:
      nodeAffinity:
        # Tambahkan aturan afinitas untuk mengizinkan penjadwal mengajukan instance kontainer elastis ketika instance ECS tidak mencukupi.
        preferredDuringSchedulingIgnoredDuringExecution:
        - weight: 1
          preference:
            matchExpressions:
            - key: type
              operator: NotIn
              values:
              - virtual-kubelet
    tolerations:
    # Tambahkan toleration untuk mentolerir taint tertentu pada instance kontainer elastis.
    - key: virtual-kubelet.io/provider
      operator: Equal
      value: alibabacloud
      effect: NoSchedule
  executor:
    instances: 2
    cores: 2
    memory: 4g
    affinity:
      nodeAffinity:
        # Tambahkan aturan afinitas untuk mengizinkan penjadwal mengajukan instance kontainer elastis ketika instance ECS tidak mencukupi.
        preferredDuringSchedulingIgnoredDuringExecution:
        - weight: 1
          preference:
            matchExpressions:
            - key: type
              operator: NotIn
              values:
              - virtual-kubelet
    tolerations:
    # Tambahkan toleration untuk mentolerir taint tertentu pada instance kontainer elastis.
    - key: virtual-kubelet.io/provider
      operator: Equal
      value: alibabacloud
      effect: NoSchedule

Konfigurasikan penjadwalan sumber daya berbasis prioritas

Penjadwal ACK mendukung penjadwalan sumber daya berbasis prioritas. Anda dapat menggunakan ResourcePolicy untuk menentukan prioritas berbagai jenis node untuk penjadwalan pod. Untuk informasi lebih lanjut, lihat Konfigurasikan penjadwalan sumber daya berbasis prioritas.

  1. Buat file bernama resourcepolicy.yaml dan salin konten berikut ke file tersebut. File ini digunakan untuk membuat ResourcePolicy yang menentukan prioritas instance ECS dan instance kontainer elastis untuk penjadwalan pod pekerjaan Spark. Blok kode berikut adalah contoh file resourcepolicy.yaml.

    apiVersion: scheduling.alibabacloud.com/v1alpha1
    kind: ResourcePolicy
    metadata:
      name: sparkapplication-resource-policy
      namespace: default                      # ResourcePolicy hanya berlaku pada pod di namespace default.
    spec:
      ignorePreviousPod: true     
      ignoreTerminatingPod: false     
      matchLabelKeys:
      - sparkoperator.k8s.io/submission-id    # Hitung pod berdasarkan ID pengiriman pekerjaan Spark.
      preemptPolicy: AfterAllUnits            # Kebijakan preemption. Menentukan bahwa penjadwal mencoba merebut node hanya setelah gagal menjadwalkan pod ke semua unit yang dapat dijadwalkan yang terkandung dalam ResourcePolicy.
      selector:                               # Label yang digunakan untuk memilih pod tempat ResourcePolicy berlaku.
        sparkoperator.k8s.io/launched-by-spark-operator: "true"  # ResourcePolicy hanya berlaku pada pod yang diluncurkan oleh Spark Operator.
      strategy: prefer              
      units:                                 # ResourcePolicy berisi dua unit yang dapat dijadwalkan. Selama aktivitas skala keluar, pod dijadwalkan ke node berdasarkan prioritas unit yang terdaftar dalam urutan menurun. Selama aktivitas skala masuk, pod dihapus dari node berdasarkan prioritas unit yang terdaftar dalam urutan menaik.
      - max: 2                               # Maksimum dua pod dapat dijadwalkan ke unit saat ini. Unit saat ini mencakup node ECS yang memiliki label kubernetes.io/arch=amd64.
        resource: ecs               
        nodeSelector:
          kubernetes.io/arch: amd64  
      - max: 3                               # Maksimum tiga pod dapat dijadwalkan ke unit saat ini. Unit saat ini mencakup instance kontainer elastis.
        resource: eci      
  2. Jalankan perintah berikut untuk membuat ResourcePolicy yang hanya berlaku pada pekerjaan Spark:

    kubectl apply -f resourcepolicy.yaml
  3. Buat file YAML SparkApplication bernama spark-pi.yaml.

    SparkApplication menyediakan satu driver pod dan lima executor pod. Ketika sumber daya mencukupi, driver pod dan satu executor pod dijadwalkan ke node AMD64 dan tiga executor pod dijadwalkan ke instance kontainer elastis. Satu executor pod tetap dalam status Pending karena jumlah pod yang dijadwalkan ke unit yang dapat dijadwalkan telah mencapai batas atas.

    apiVersion: sparkoperator.k8s.io/v1beta2
    kind: SparkApplication
    metadata:
      name: spark-pi
      namespace: default
    spec:
      type: Scala
      mode: cluster
      image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/spark:3.5.2
      mainClass: org.apache.spark.examples.SparkPi
      mainApplicationFile: local:///opt/spark/examples/jars/spark-examples_2.12-3.5.2.jar
      arguments: 
      - "5000"
      sparkVersion: 3.5.2
      driver:
        cores: 1
        coreLimit: 1200m
        memory: 512m
        serviceAccount: spark-operator-spark
        tolerations:
        - key: virtual-kubelet.io/provider       # Tambahkan toleration untuk mentolerir taint tertentu pada instance kontainer elastis.
          operator: Equal
          value: alibabacloud
          effect: NoSchedule
      executor:
        instances: 5
        cores: 1
        coreLimit: 1200m
        memory: 512m
        tolerations: 
        - key: virtual-kubelet.io/provider         # Tambahkan toleration untuk mentolerir taint tertentu pada instance kontainer elastis.
          operator: Equal
          value: alibabacloud
          effect: NoSchedule
  4. Jalankan perintah berikut untuk mengirimkan pekerjaan Spark:

    kubectl apply -f spark-pi.yaml
  5. Jalankan perintah berikut untuk memeriksa hasil penjadwalan pod yang dibuat untuk pekerjaan tersebut:

    kubectl get pods  -o wide -l sparkoperator.k8s.io/app-name=spark-pi
    NAME                                        READY   STATUS      RESTARTS   AGE       IP                  NODE                          
    spark-pi-34c0998f9f832e61-exec-1            1/1     Running     0          28s       192.XXX.XX.34       cn-beijing.192.XXX.XX.250       
    spark-pi-34c0998f9f832e61-exec-2            1/1     Running     0          28s       192.XXX.XX.87       virtual-kubelet-cn-beijing-i   
    spark-pi-34c0998f9f832e61-exec-3            1/1     Running     0          28s       192.XXX.XX.88       virtual-kubelet-cn-beijing-i   
    spark-pi-34c0998f9f832e61-exec-4            1/1     Running     0          28s       192.XXX.XX.86       virtual-kubelet-cn-beijing-i   
    spark-pi-34c0998f9f832e61-exec-5            0/1     Pending     0          28s       <none>              <none>                         
    spark-pi-driver                             1/1     Running     0          34s       192.XXX.XX.37       cn-beijing.192.XXX.XXX.250       

Gunakan fitur ImageCache untuk mempercepat penarikan gambar

Anda dapat menggunakan cache gambar untuk mempercepat penarikan gambar saat menerapkan pod pada instance kontainer elastis. Untuk informasi lebih lanjut, lihat Gunakan ImageCache untuk mempercepat pembuatan instance kontainer elastis.

Bagian ini membandingkan kecepatan penarikan gambar saat SparkApplication diterapkan dengan dan tanpa cache gambar. Bagian ini juga menjelaskan cara mengaktifkan pembuatan dan pencocokan cache gambar otomatis.

apiVersion: sparkoperator.k8s.io/v1beta2
kind: SparkApplication
metadata:
  name: spark-pi
  namespace: default
spec:
  type: Scala
  mode: cluster
  image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/spark:3.5.2
  mainClass: org.apache.spark.examples.SparkPi
  mainApplicationFile: local:///opt/spark/examples/jars/spark-examples_2.12-3.5.2.jar
  arguments: 
  - "5000"
  sparkVersion: 3.5.2
  driver:
    cores: 1
    coreLimit: 1200m
    memory: 512m
    serviceAccount: spark-operator-spark
  executor:
    instances: 2
    cores: 2
    memory: 4g
  • Kirim pekerjaan Spark tanpa menggunakan cache gambar

    Kirim pekerjaan Spark tanpa menggunakan cache gambar dan kemudian periksa acara driver pod.

    kubectl describe pod spark-pi-driver
    Events:
      ...
      Warning  ImageCacheMissed       24m   EciService         [eci.imagecache]Missed image cache.
      Normal   ImageCacheAutoCreated  24m   EciService         [eci.imagecache]Image cache imc-2zeXXXXXXXXXXXXXXXXX is auto created
      Normal   Pulling                24m   kubelet            Pulling image "registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/spark:3.5.2"
      Normal   Pulled                 23m   kubelet            Successfully pulled image "registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/spark:3.5.2" in 1m41.289s (1m41.289s including waiting)
      ...

    Acara menunjukkan bahwa terjadi cache gambar miss dan cache gambar dibuat. Dibutuhkan sekitar 100 detik untuk menarik gambar.

  • Kirim pekerjaan Spark yang menggunakan cache gambar

    Tambahkan anotasi berikut ke konfigurasi driver dan konfigurasi executor untuk menentukan cache gambar.

    apiVersion: sparkoperator.k8s.io/v1beta2
    kind: SparkApplication
    metadata:
      name: spark-pi-eci-only
      namespace: default
    spec:
      type: Scala
      mode: cluster
      image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/spark:3.5.2
      mainClass: org.apache.spark.examples.SparkPi
      mainApplicationFile: local:///opt/spark/examples/jars/spark-examples_2.12-3.5.2.jar
      arguments: 
      - "5000"
      sparkVersion: 3.5.2
      driver:
        annotations:
          # Tentukan ID cache gambar yang ingin Anda gunakan.
          k8s.aliyun.com/eci-image-snapshot-id: imc-2zeXXXXXXXXXXXXXXXXX
        cores: 1
        coreLimit: 1200m
        memory: 512m
        serviceAccount: spark-operator-spark
        affinity:
          nodeAffinity:
            # Tambahkan aturan afinitas untuk mengizinkan pekerjaan dijadwalkan ke instance kontainer elastis.
            requiredDuringSchedulingIgnoredDuringExecution:
              nodeSelectorTerms:
              - matchExpressions:
                - key: type
                  operator: In
                  values:
                  - virtual-kubelet
        tolerations:
        # Tambahkan toleration untuk mentolerir taint tertentu pada instance kontainer elastis.
        - key: virtual-kubelet.io/provider
          operator: Equal
          value: alibabacloud
          effect: NoSchedule
      executor:
        annotations:
          # Tentukan ID cache gambar yang ingin Anda gunakan.
          k8s.aliyun.com/eci-image-snapshot-id: imc-2zeXXXXXXXXXXXXXXXXX
        instances: 2
        cores: 2
        memory: 4g
        affinity:
          nodeAffinity:
            # Tambahkan aturan afinitas untuk mengizinkan pekerjaan dijadwalkan ke instance kontainer elastis.
            requiredDuringSchedulingIgnoredDuringExecution:
              nodeSelectorTerms:
              - matchExpressions:
                - key: type
                  operator: In
                  values:
                  - virtual-kubelet
        tolerations:
        # Tambahkan toleration untuk mentolerir taint tertentu pada instance kontainer elastis.
        - key: virtual-kubelet.io/provider
          operator: Equal
          value: alibabacloud
          effect: NoSchedule

    Kirim pekerjaan Spark dan kemudian periksa acara driver pod.

     kubectl describe pod spark-pi-driver
    Events:
      ...
      Normal  SuccessfulHitImageCache  23s   EciService         [eci.imagecache]Successfully hit image cache imc-2zeXXXXXXXXXXXXXXXXX, eci will be scheduled with this image cache.
      Normal  Pulled                   4s    kubelet            Container image "registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/spark:3.5.2" already present on machine
      ...

    Acara menunjukkan bahwa terjadi cache gambar hit dan tidak ada gambar yang ditarik.

  • Aktifkan pembuatan dan pencocokan cache gambar otomatis

    Untuk mengaktifkan pembuatan dan pencocokan cache gambar otomatis, tambahkan anotasi k8s.aliyun.com/eci-image-cache: "true" ke parameter .spec.[driver|executor].annotations. Dalam hal ini, Anda tidak perlu menentukan ID cache gambar.

    apiVersion: sparkoperator.k8s.io/v1beta2
    kind: SparkApplication
    metadata:
      name: spark-pi-eci-only
      namespace: default
    spec:
      type: Scala
      mode: cluster
      image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/spark:3.5.2
      mainClass: org.apache.spark.examples.SparkPi
      mainApplicationFile: local:///opt/spark/examples/jars/spark-examples_2.12-3.5.2.jar
      arguments: 
      - "5000"
      sparkVersion: 3.5.2
      driver:
        annotations:
          # Aktifkan pembuatan dan pencocokan cache gambar otomatis.
          k8s.aliyun.com/eci-image-cache: "true"
        cores: 1
        coreLimit: 1200m
        memory: 512m
        serviceAccount: spark-operator-spark
        affinity:
          nodeAffinity:
            # Tambahkan aturan afinitas untuk mengizinkan pekerjaan dijadwalkan ke instance kontainer elastis.
            requiredDuringSchedulingIgnoredDuringExecution:
              nodeSelectorTerms:
              - matchExpressions:
                - key: type
                  operator: In
                  values:
                  - virtual-kubelet
        tolerations:
        # Tambahkan toleration untuk mentolerir taint tertentu pada instance kontainer elastis.
        - key: virtual-kubelet.io/provider
          operator: Equal
          value: alibabacloud
          effect: NoSchedule
      executor:
        annotations:
          # Aktifkan pembuatan dan pencocokan cache gambar otomatis.
          k8s.aliyun.com/eci-image-cache: "true"
        instances: 2
        cores: 2
        memory: 4g
        affinity:
          nodeAffinity:
            # Tambahkan aturan afinitas untuk mengizinkan pekerjaan dijadwalkan ke instance kontainer elastis.
            requiredDuringSchedulingIgnoredDuringExecution:
              nodeSelectorTerms:
              - matchExpressions:
                - key: type
                  operator: In
                  values:
                  - virtual-kubelet
        tolerations:
        # Tambahkan toleration untuk mentolerir taint tertentu pada instance kontainer elastis.
        - key: virtual-kubelet.io/provider
          operator: Equal
          value: alibabacloud
          effect: NoSchedule