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:
Hubungkan beberapa cluster ACK ke instance ACK Fleet dan deploy ACK Koordinator serta ACK Spark Operator di setiap cluster terkait.
Buat
SparkApplicationdanPropagationPolicyuntuk instance Fleet.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.
Setelah instance Fleet menjadwalkan pekerjaan,
SparkApplicationdijadwalkan dan didistribusikan ke cluster terkait.Di cluster terkait, ACK Spark Operator menjalankan
driverdanexecutordari pekerjaan Spark. Pada saat yang sama, instance Fleet memantau status pekerjaan Spark di sub-cluster. Jikadrivertidak dapat dijalankan karena sumber daya tidak mencukupi, instance Fleet akan menarik kembaliSparkApplicationsetelah periode waktu tertentu dan menjadwalkan ulang SparkApplication ke cluster terkait lainnya yang memiliki sumber daya cukup.
Prasyarat
Instance Fleet harus terhubung dengan beberapa cluster yang menggunakan versi Kubernetes 1.18 atau lebih baru. Untuk informasi lebih lanjut, lihat Kelola Cluster Terkait.
Kebijakan RAM AliyunAdcpFullAccess harus dilampirkan ke pengguna RAM. Untuk informasi lebih lanjut, lihat Berikan Izin kepada Pengguna RAM.
Alat baris perintah AMC harus sudah diinstal.
ack-koordinator (sebelumnya dikenal sebagai ack-slo-manager) harus sudah diinstal di setiap cluster terkait.
Langkah 1: deploy ack-koordinator di setiap cluster terkait
Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
Di halaman Clusters, klik nama cluster yang ingin Anda ubah. Di panel navigasi kiri, pilih .
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.
Gunakan file kubeconfig dari instance Fleet untuk terhubung ke instance Fleet dan jalankan perintah berikut untuk membuat namespace bernama spark:
kubectl create ns sparkBuat
ClusterPropagationPolicyuntuk mendistribusikan namespace ke cluster terkait sesuai aturan tertentu. Jika Anda ingin mendistribusikan namespace ke semua cluster terkait, biarkan parameterclusterAffinitykosong.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.
Masuk ke Konsol ACK. Di panel navigasi kiri, pilih .
Di halaman Marketplace, klik tab App Catalog. Temukan dan klik ack-spark-operator.
Di halaman ack-spark-operator, klik Deploy.
Di panel Deploy, pilih cluster dan namespace, lalu klik Next.
Di langkah Parameters, pilih 2.1.2 dari daftar drop-down Chart Version, tambahkan namespace
sparkke parameterjobNamespacesdi editor kode Parameters, lalu klik OK.PentingAnda harus menentukan
namespacedariSparkApplicationyang ingin Anda buat di parameterspark.jobNamespaces.Tabel berikut menjelaskan beberapa parameter. Anda dapat menemukan konfigurasi parameter di bagian Parameters di halaman ack-spark-operator.
Parameter
Deskripsi
Contoh
controller.replicasJumlah replika controller.
Nilai default: 1.
webhook.replicasJumlah replika webhook.
Nilai default: 1.
spark.jobNamespacesNamespace 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.namePekerjaan Spark secara otomatis membuat ServiceAccount bernama
spark-operator-sparkdan sumber daya kontrol akses berbasis peran (RBAC) yang sesuai di setiap namespace yang ditentukan olehspark.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.
Gunakan file kubeconfig dari instance Fleet untuk membuat
PriorityClassdengan prioritas rendah dan aturvaluemenjadi negatif.apiVersion: scheduling.k8s.io/v1 kind: PriorityClass metadata: name: low-priority value: -1000 globalDefault: false description: "Prioritas rendah untuk aplikasi Spark"Buat
ClusterPropagationPolicypada instance Fleet untuk mendistribusikanPriorityClasske cluster yang ditentukan. Jika Anda ingin mendistribusikanPriorityClasske semua cluster terkait, Anda dapat menghapus parameterclusterAffinity.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
Buat
PropagationPolicymenggunakan template YAML berikut. PropagationPolicy digunakan untuk mendistribusikan semuaSparkApplicationsyang menggunakan versi APIsparkoperator.k8s.io/v1beta2ke cluster terkait sesuai aturan tertentu. Jika Anda ingin mendistribusikan SparkApplications ke semua cluster terkait, biarkan parameterclusterAffinitykosong.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: SparkApplicationBuat pekerjaan Spark pada instance Fleet. Tambahkan anotasi
sparkoperator.k8s.io/koordinator-colocation: "true"keSparkApplicationuntuk menggunakan sumber daya idle dalam menjadwalkan poddriverdan podexecutordari SparkApplication. Template SparkApplication berikut menggunakan sumber daya idle untuk menjadwalkan poddriverdan podexecutor.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
Jalankan perintah berikut pada instance Fleet untuk melihat status pekerjaan Spark:
kubectl get sparkapp -nsparkKeluaran yang Diharapkan:
NAME STATUS ATTEMPTS START FINISH AGE spark-pi RUNNING 1 2025-03-05T11:19:43Z <no value> 48sJalankan perintah berikut pada instance Fleet untuk menanyakan cluster terkait tempat pekerjaan Spark dijadwalkan:
kubectl describe sparkapp spark-pi -nsparkKeluaran yang Diharapkan:
Normal ScheduleBindingSucceed 2m29s default-scheduler Binding has been scheduled successfully. Result: {c6xxxxx:0,[{driver 1} {executor 1}]}Jalankan perintah berikut pada instance Fleet untuk menanyakan status distribusi sumber daya:
kubectl get rb spark-pi-sparkapplication -nsparkKeluaran yang Diharapkan:
NAME SCHEDULED FULLYAPPLIED OVERRIDDEN ALLAVAILABLE AGE spark-pi-sparkapplication True True True TrueJalankan perintah berikut pada instance Fleet untuk memeriksa status pekerjaan Spark di cluster terkait:
kubectl amc get sparkapp -M -nsparkKeluaran 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 YJalankan perintah berikut pada instance Fleet untuk menanyakan status pod:
kubectl amc get pod -M -nsparkKeluaran 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 2m50sJalankan perintah berikut pada instance Fleet untuk melihat detail pekerjaan Spark di cluster terkait:
kubectl amc get sparkapp spark-pi -m ${member clusterid} -oyaml -nspark