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
Komponen ack-spark-operator telah diinstal. Untuk informasi lebih lanjut, lihat Langkah 1: Instal komponen ack-spark-operator.
Komponen ack-virtual-node telah diterapkan. Komponen ini diperlukan saat menggunakan instance kontainer elastis. Untuk informasi lebih lanjut, lihat Terapkan ack-virtual-node di klaster.
Klien kubectl telah terhubung ke klaster ACK. Untuk informasi lebih lanjut, lihat Dapatkan file kubeconfig dari klaster dan gunakan kubectl untuk terhubung ke klaster.
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
Hanya gunakan instance kontainer elastis
Ajukan instance kontainer elastis ketika instance ECS tidak mencukupi
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.
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: eciJalankan perintah berikut untuk membuat ResourcePolicy yang hanya berlaku pada pekerjaan Spark:
kubectl apply -f resourcepolicy.yamlBuat 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: NoScheduleJalankan perintah berikut untuk mengirimkan pekerjaan Spark:
kubectl apply -f spark-pi.yamlJalankan perintah berikut untuk memeriksa hasil penjadwalan pod yang dibuat untuk pekerjaan tersebut:
kubectl get pods -o wide -l sparkoperator.k8s.io/app-name=spark-piNAME 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: 4gKirim pekerjaan Spark tanpa menggunakan cache gambar
Kirim pekerjaan Spark tanpa menggunakan cache gambar dan kemudian periksa acara driver pod.
kubectl describe pod spark-pi-driverEvents: ... 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: NoScheduleKirim pekerjaan Spark dan kemudian periksa acara driver pod.
kubectl describe pod spark-pi-driverEvents: ... 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