Instal Spark Operator pada ACK untuk mengelola seluruh siklus hidup pekerjaan Spark menggunakan manifes Kubernetes deklaratif.
Prasyarat
-
ACK Pro cluster atau ACK Serverless Pro cluster yang menjalankan Kubernetes 1.24 atau versi lebih baru. Lihat Create an ACK managed cluster, Create an ACK Serverless cluster, dan Manually upgrade ACK clusters.
Klien kubectl telah terhubung ke kluster ACK. Untuk informasi lebih lanjut, lihat Connect to an ACK cluster using kubectl.
Cara kerja
Spark Operator mengotomatiskan siklus hidup pekerjaan Spark di Kubernetes menggunakan sumber daya CustomResourceDefinition (CRD) seperti SparkApplication dan ScheduledSparkApplication. Operator ini memanfaatkan fitur native Kubernetes seperti auto-scaling, pemeriksaan kesehatan, dan manajemen sumber daya. ACK menyediakan ack-spark-operator berdasarkan kubeflow/spark-operator. Lihat Spark Operator | Kubeflow.
Manfaat:
-
Manajemen yang disederhanakan: Otomatiskan penerapan dan siklus hidup pekerjaan Spark dengan konfigurasi Kubernetes deklaratif.
-
Dukungan multi-tenancy: Gunakan namespace Kubernetes dan kuota sumber daya untuk isolasi sumber daya. Gunakan node selection untuk menjalankan beban kerja Spark pada sumber daya khusus.
-
Provisioning sumber daya elastis: Lakukan penskalaan dengan sumber daya elastis seperti Elastic Container Instance (ECI) atau elastic node pools selama beban puncak untuk menyeimbangkan performa dan biaya.
Kasus penggunaan:
-
Analytika data: Gunakan Spark untuk analitik interaktif dan pembersihan data.
-
Komputasi batch: Jalankan pekerjaan batch terjadwal untuk memproses set data berskala besar.
-
Pemrosesan real-time: Spark Streaming memungkinkan pemrosesan aliran data secara real-time.
Ikhtisar prosedur
Alur kerja mencakup penerapan Spark Operator, pengiriman pekerjaan, pemantauan eksekusi, dan pengelolaan siklus hidup pekerjaan.
-
Terapkan komponen ack-spark-operator: Instal Spark Operator di kluster ACK Anda.
-
Kirim pekerjaan Spark: Buat dan kirim manifes pekerjaan Spark.
-
Pantau pekerjaan Spark: Periksa status pekerjaan, status pod, dan log.
-
Akses UI web Spark: Lihat detail eksekusi pekerjaan di browser.
-
Perbarui pekerjaan Spark: Ubah dan terapkan ulang manifes pekerjaan.
-
Hapus pekerjaan Spark: Hapus pekerjaan dan lepaskan sumber daya.
Langkah 1: Terapkan komponen ack-spark-operator
Masuk ke ACK console. Di panel navigasi kiri, klik .
-
Di halaman Marketplace, klik tab App Catalog, lalu cari dan pilih ack-spark-operator.
-
Di halaman ack-spark-operator, klik Deploy.
-
Di panel Create, pilih kluster dan namespace, lalu klik Next.
-
Di halaman Parameters, konfigurasikan parameter, lalu klik OK.
Parameter utama tercantum di bawah ini. Untuk daftar lengkap, lihat tab ConfigMaps di halaman ack-spark-operator.
Parameter
Deskripsi
Bawaan
controller.replicasJumlah replika controller.
1
webhook.replicasJumlah replika webhook.
1
spark.jobNamespacesNamespace tempat pekerjaan Spark dapat dijalankan. String kosong memungkinkan semua namespace. Pisahkan beberapa nilai dengan koma (
,).-
["default"](bawaan) -
[""](semua namespace) -
["ns1","ns2","ns3"](beberapa namespace)
spark.serviceAccount.nameSpark Operator membuat ServiceAccount bernama
spark-operator-sparkdan sumber daya RBAC yang diperlukan di setiap namespace yang ditentukan olehspark.jobNamespaces. Jika dikustomisasi, tentukan nama baru saat mengirim pekerjaan Spark.spark-operator-spark -
Langkah 2: Kirim pekerjaan Spark
Buat manifes SparkApplication untuk mengirim pekerjaan Spark.
-
Buat manifes berikut dan simpan sebagai
spark-pi.yaml.apiVersion: sparkoperator.k8s.io/v1beta2 kind: SparkApplication metadata: name: spark-pi namespace: default # Namespace harus 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.4 imagePullPolicy: IfNotPresent mainClass: org.apache.spark.examples.SparkPi mainApplicationFile: local:///opt/spark/examples/jars/spark-examples_2.12-3.5.4.jar arguments: - "1000" sparkVersion: 3.5.4 driver: cores: 1 coreLimit: 1200m memory: 512m serviceAccount: spark-operator-spark # Jika Anda mengkustomisasi nama ServiceAccount, ubah nilainya sesuai. executor: instances: 1 cores: 1 coreLimit: 1200m memory: 512m restartPolicy: type: Never -
Kirim pekerjaan Spark:
kubectl apply -f spark-pi.yamlOutput yang diharapkan:
sparkapplication.sparkoperator.k8s.io/spark-pi created
Langkah 3: Pantau pekerjaan Spark
Periksa status, pod, dan log pekerjaan Spark.
-
Periksa status pekerjaan Spark:
kubectl get sparkapplication spark-piOutput yang diharapkan:
NAME STATUS ATTEMPTS START FINISH AGE spark-pi SUBMITTED 1 2024-06-04T03:17:11Z <no value> 15s -
Periksa status pod. Ini memfilter pod berdasarkan label
sparkoperator.k8s.io/app-name=spark-pi:kubectl get pod -l sparkoperator.k8s.io/app-name=spark-piOutput yang diharapkan:
NAME READY STATUS RESTARTS AGE spark-pi-driver 1/1 Running 0 49s spark-pi-7272428fc8f5f392-exec-1 1/1 Running 0 13sSetelah pekerjaan selesai, driver menghapus semua pod executor.
-
Lihat detail pekerjaan Spark:
kubectl describe sparkapplication spark-pi -
Lihat 20 baris terakhir log pod driver:
kubectl logs --tail=20 spark-pi-driverOutput 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 UI web Spark
UI web hanya tersedia selama pod driver berstatus Running.
Secara bawaan, controller.uiService.enable bernilai true, yang membuat Service untuk mengekspos UI web guna penerusan port. Jika diatur ke false, tidak ada Service yang dibuat dan Anda harus melakukan port-forward langsung dari pod driver.
kubectl port-forward cocok untuk pengujian tetapi tidak disarankan untuk produksi karena risiko keamanan.
-
Teruskan port UI web ke mesin lokal Anda:
-
Port-forward melalui Service
kubectl port-forward services/spark-pi-ui-svc 4040 -
Port-forward melalui pod
kubectl port-forward pods/spark-pi-driver 4040Output yang diharapkan:
Forwarding from 127.0.0.1:4040 -> 4040 Forwarding from [::1]:4040 -> 4040
-
-
Buka http://127.0.0.1:4040 di browser Anda.
(Opsional) Langkah 5: Perbarui pekerjaan Spark
Perbarui manifes pekerjaan untuk mengubah parameter pekerjaan Spark.
-
Edit
spark-pi.yaml. Misalnya, aturargumentsmenjadi10000dan jumlah instansexecutormenjadi2.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.4 imagePullPolicy: IfNotPresent mainClass: org.apache.spark.examples.SparkPi mainApplicationFile: local:///opt/spark/examples/jars/spark-examples_2.12-3.5.4.jar arguments: - "10000" sparkVersion: 3.5.4 driver: cores: 1 coreLimit: 1200m memory: 512m serviceAccount: spark-operator-spark # Jika Anda mengkustomisasi nama ServiceAccount, ubah nilainya sesuai. executor: instances: 2 cores: 1 coreLimit: 1200m memory: 512m restartPolicy: type: Never -
Terapkan perubahan:
kubectl apply -f spark-pi.yaml -
Periksa status pekerjaan:
kubectl get sparkapplication spark-piPekerjaan Spark akan dijalankan kembali. 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
Hapus pekerjaan Spark untuk melepaskan sumber daya yang terkait.
kubectl delete -f spark-pi.yaml
Atau:
kubectl delete sparkapplication spark-pi