Apache Spark adalah mesin komputasi untuk pemrosesan data skala besar. Alat ini banyak digunakan untuk menganalisis beban kerja dalam skenario komputasi data besar dan pembelajaran mesin. Spark Operator menyediakan kemampuan untuk mengotomatiskan penyebaran pekerjaan Spark serta mengelola siklus hidup pekerjaan Spark di kluster Kubernetes. Topik ini menjelaskan cara menggunakan Spark Operator untuk menjalankan pekerjaan Spark di kluster ACK, membantu insinyur data dengan cepat dan efisien menjalankan serta mengelola tugas pemrosesan data besar.
Prasyarat
Sebuah kluster ACK Pro atau kluster ACK Serverless Pro yang menjalankan Kubernetes 1.24 atau lebih baru telah dibuat. Untuk informasi lebih lanjut, lihat Buat Kluster ACK yang Dikelola, Buat Kluster ACK Serverless, dan Tingkatkan Kluster ACK secara Manual.
kubectl digunakan untuk terhubung ke kluster ACK. Untuk informasi lebih lanjut, lihat Dapatkan File kubeconfig Kluster dan Gunakan kubectl untuk Terhubung ke Kluster.
Pengenalan Spark Operator
Spark Operator dirancang untuk menjalankan pekerjaan Spark di kluster Kubernetes dan mengotomatiskan manajemen siklus hidup pekerjaan Spark. Anda dapat mengirimkan dan mengelola pekerjaan Spark menggunakan CustomResourceDefinitions (CRDs) seperti SparkApplication dan ScheduledSparkApplication. Spark Operator dapat secara efisien memantau dan mengoptimalkan eksekusi pekerjaan Spark dengan memanfaatkan fitur Kubernetes seperti penskalaan otomatis, pemeriksaan kesehatan, dan manajemen sumber daya. ACK menyediakan komponen ack-spark-operator berdasarkan komponen open source kubeflow/spark-operator. Untuk informasi lebih lanjut, lihat Spark Operator | Kubeflow.
Keuntungan:
Manajemen yang Disederhanakan: Mengotomatiskan penyebaran pekerjaan Spark dan mengelola siklus hidupnya menggunakan konfigurasi pekerjaan deklaratif di Kubernetes.
Dukungan untuk Multi-Tenancy: Anda dapat menggunakan mekanisme namespace dan kuota sumber daya Kubernetes untuk mengalokasikan dan mengisolasi sumber daya pengguna. Mekanisme pemilihan node Kubernetes juga memastikan bahwa pekerjaan Spark dapat menggunakan sumber daya khusus.
Provisioning Sumber Daya Elastis: Instance kontainer elastis atau kolam node elastis digunakan untuk menyediakan sejumlah besar sumber daya elastis selama jam sibuk guna menyeimbangkan performa dan biaya.
Skenario yang Sesuai:
Analisis Data: Ilmuwan data dapat menggunakan Spark untuk analisis data interaktif dan pembersihan data.
Komputasi Data Batch: Anda dapat menjalankan pekerjaan batch terjadwal untuk memproses sejumlah besar dataset.
Pemrosesan Data Real-Time: Pustaka Spark Streaming memberikan kemampuan untuk streaming data real-time.
Ikhtisar prosedur
Topik ini menjelaskan cara menggunakan Spark Operator untuk menjalankan dan mengelola pekerjaan Spark di kluster ACK untuk memproses data besar secara efisien.
Instal komponen ack-spark-operator: Instal Spark Operator di kluster ACK untuk mengelola dan menjalankan pekerjaan Spark.
Kirimkan Pekerjaan Spark: Buat dan kirimkan file konfigurasi pekerjaan Spark untuk menjalankan tugas pemrosesan data.
Lihat Pekerjaan Spark: Pantau status pekerjaan dan peroleh informasi detail serta log.
Akses Antarmuka Web Spark: Lihat eksekusi pekerjaan Spark pada antarmuka web.
Perbarui Pekerjaan Spark: Modifikasi konfigurasi pekerjaan berdasarkan kebutuhan bisnis dan secara dinamis ubah parameter.
Hapus Pekerjaan Spark: Hapus pekerjaan Spark yang sudah selesai atau tidak lagi diperlukan untuk mengurangi biaya.
Langkah 1: Instal komponen ack-spark-operator
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 kluster dan namespace, lalu klik Next.
Di langkah Parameters, konfigurasikan parameter dan klik OK.
Tabel berikut menjelaskan beberapa parameter. Anda dapat menemukan konfigurasi parameter di bagian Parameters pada 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 2: Kirimkan pekerjaan Spark
Anda dapat membuat file YAML SparkApplication untuk mengirimkan pekerjaan Spark guna memproses data.
Buat file YAML SparkApplication bernama
spark-pi.yaml.apiVersion: sparkoperator.k8s.io/v1beta2 kind: SparkApplication metadata: name: spark-pi namespace: default # Pastikan namespace 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.2 imagePullPolicy: IfNotPresent mainClass: org.apache.spark.examples.SparkPi mainApplicationFile: local:///opt/spark/examples/jars/spark-examples_2.12-3.5.2.jar arguments: - "1000" sparkVersion: 3.5.2 driver: cores: 1 coreLimit: 1200m memory: 512m serviceAccount: spark-operator-spark # Ganti spark-operator-spark dengan nama kustom yang Anda tentukan. executor: instances: 1 cores: 1 coreLimit: 1200m memory: 512m restartPolicy: type: NeverJalankan perintah berikut untuk mengirimkan pekerjaan Spark:
kubectl apply -f spark-pi.yamlOutput yang Diharapkan:
sparkapplication.sparkoperator.k8s.io/spark-pi created
Langkah 3: Lihat pekerjaan Spark
Anda dapat menjalankan perintah berikut untuk memeriksa status, informasi pod, dan log pekerjaan Spark:
Jalankan perintah berikut untuk melihat 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> 15sJalankan perintah berikut dan atur label
sparkoperator.Kubernetes.io/app-namemenjadispark-piuntuk memeriksa status pod yang menjalankan pekerjaan Spark:kubectl get pod -l sparkoperator.k8s.io/app-name=spark-piOutput yang Diharapkan:
NAME READY STATUS RESTARTS AGE spark-pi-7272428fc8f5f392-exec-1 1/1 Running 0 13s spark-pi-7272428fc8f5f392-exec-2 1/1 Running 0 13s spark-pi-driver 1/1 Running 0 49sSetelah pekerjaan Spark selesai, semua pod executor secara otomatis dihapus oleh driver.
Jalankan perintah berikut untuk melihat detail pekerjaan Spark:
kubectl describe sparkapplication spark-piJalankan perintah berikut untuk melihat 20 entri log terakhir dari 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 antarmuka web Spark
Pekerjaan Spark menyediakan antarmuka web untuk memantau eksekusi pekerjaan Spark. Jalankan perintah kubectl port-forward untuk memetakan port di kluster ke port lokal guna mengakses antarmuka web Spark. Layanan antarmuka web Spark hanya tersedia ketika pekerjaan Spark sedang berjalan atau pod driver dalam status Running. Setelah pekerjaan Spark selesai, antarmuka web menjadi tidak dapat diakses.
Saat Anda menerapkan komponen ack-spark-operator, controller.uiService.enable secara otomatis diatur ke true, dan sebuah Service secara otomatis dibuat. Anda dapat memetakan port Service ke port lokal untuk mengakses antarmuka web. Jika Anda mengatur controller.uiService.enable ke false saat Anda menerapkan komponen, tidak ada Service yang dibuat. Dalam kasus ini, Anda dapat mengakses antarmuka web dengan memetakan port pod.
Port lokal yang ditentukan oleh perintah kubectl port-forward hanya cocok untuk lingkungan pengujian dan tidak cocok untuk lingkungan produksi. Berhati-hatilah saat menggunakan metode ini.
Anda dapat memetakan port Service atau port pod ke port lokal berdasarkan kebutuhan bisnis Anda. Bagian berikut menjelaskan perintah yang relevan:
Jalankan perintah berikut untuk mengakses antarmuka web dengan memetakan port Service:
kubectl port-forward services/spark-pi-ui-svc 4040Jalankan perintah berikut untuk mengakses antarmuka web dengan memetakan port pod:
kubectl port-forward pods/spark-pi-driver 4040Output yang Diharapkan:
Forwarding from 127.0.0.1:4040 -> 4040 Forwarding from [::1]:4040 -> 4040
Akses antarmuka web melalui http://127.0.0.1:4040.
(Opsional) Langkah 5: Perbarui pekerjaan Spark
Untuk memodifikasi parameter pekerjaan Spark, Anda dapat memperbarui file YAML pekerjaan Spark.
Modifikasi file YAML bernama
spark-pi.yaml. Sebagai contoh, atur parameterargumentsmenjadi10000dan parameterexecutormenjadi2.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.2 imagePullPolicy: IfNotPresent mainClass: org.apache.spark.examples.SparkPi mainApplicationFile: local:///opt/spark/examples/jars/spark-examples_2.12-3.5.2.jar arguments: - "10000" sparkVersion: 3.5.2 driver: cores: 1 coreLimit: 1200m memory: 512m serviceAccount: spark executor: instances: 2 cores: 1 coreLimit: 1200m memory: 512m restartPolicy: type: NeverJalankan perintah berikut untuk memperbarui pekerjaan Spark:
kubectl apply -f spark-pi.yamlJalankan perintah berikut untuk melihat status pekerjaan Spark:
kubectl get sparkapplication spark-piPekerjaan Spark berjalan lagi. 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
Setelah Anda menyelesaikan semua langkah dalam topik ini, jika Anda tidak lagi memerlukan pekerjaan Spark, Anda dapat melepaskan sumber daya terkait menggunakan perintah berikut.
Jalankan perintah berikut untuk menghapus pekerjaan Spark yang dibuat pada langkah sebelumnya:
kubectl delete -f spark-pi.yamlAnda juga dapat menjalankan perintah berikut:
kubectl delete sparkapplication spark-pi