Apache Spark adalah mesin komputasi berkecepatan tinggi untuk pemrosesan data skala besar yang banyak digunakan dalam analitik data dan pembelajaran mesin. Spark Operator mengotomatiskan penerapan dan manajemen siklus hidup pekerjaan Spark di Kubernetes. Topik ini memandu Anda dalam menggunakan Spark Operator untuk menjalankan dan mengelola pekerjaan Spark pada kluster ACK guna menangani beban kerja data besar secara efisien.
Prasyarat
-
Kluster ACK Pro atau kluster ACK Serverless Pro yang menjalankan Kubernetes 1.24 atau versi lebih baru. Untuk informasi selengkapnya, lihat Buat kluster ACK yang dikelola, Buat kluster ACK Serverless, dan Tingkatkan kluster ACK secara manual.
Klien kubectl terhubung ke kluster ACK. Untuk informasi selengkapnya, lihat Hubungkan ke kluster ACK menggunakan kubectl.
Cara kerja
Spark Operator mengotomatiskan siklus hidup pekerjaan Spark di Kubernetes. Operator ini menggunakan sumber daya CustomResourceDefinition (CRD) seperti SparkApplication dan ScheduledSparkApplication untuk mengelola pekerjaan Spark secara deklaratif. Spark Operator memanfaatkan fitur asli Kubernetes seperti auto-scaling, pemeriksaan kesehatan, dan manajemen sumber daya guna menjalankan serta memantau beban kerja Anda secara efisien. ACK menyediakan komponen ack-spark-operator yang didasarkan pada kubeflow/spark-operator dari komunitas. Untuk informasi selengkapnya, lihat Spark Operator | Kubeflow.
Manfaat:
-
Manajemen yang disederhanakan: Otomatiskan penerapan dan manajemen siklus hidup pekerjaan Spark dengan konfigurasi deklaratif di Kubernetes.
-
Dukungan multi-tenancy: Gunakan namespace Kubernetes dan kuota sumber daya untuk isolasi serta alokasi sumber daya tingkat pengguna. Gunakan node selection untuk memastikan beban kerja Spark berjalan pada sumber daya khusus.
-
Penyediaan sumber daya elastis: Manfaatkan sumber daya elastis seperti Elastic Container Instance (ECI) atau elastic node pools untuk segera mendapatkan jumlah besar sumber daya elastis saat puncak bisnis, sehingga menyeimbangkan performa dan biaya.
Kasus penggunaan:
-
Analistik data: Ilmuwan data dapat menggunakan Spark untuk analitik data interaktif dan pembersihan data.
-
Komputasi batch: Jalankan pekerjaan batch terjadwal untuk memproses set data berskala besar.
-
Pemrosesan real-time: Pustaka Spark Streaming menyediakan kemampuan untuk pemrosesan aliran data real-time.
Ikhtisar prosedur
Topik ini menjelaskan cara menggunakan Spark Operator untuk menjalankan dan mengelola pekerjaan Spark pada kluster ACK.
-
Terapkan komponen ack-spark-operator: Pasang Spark Operator di kluster ACK Anda untuk mengaktifkan manajemen dan eksekusi pekerjaan Spark.
-
Kirim pekerjaan Spark: Buat dan kirim manifes pekerjaan Spark untuk menjalankan tugas pemrosesan data tertentu.
-
Pantau pekerjaan Spark: Pantau status berjalan pekerjaan tersebut dan peroleh informasi eksekusi beserta log secara detail.
-
Akses UI web Spark: Akses UI web untuk tampilan eksekusi pekerjaan Spark yang lebih intuitif.
-
Perbarui pekerjaan Spark: Sesuaikan konfigurasi pekerjaan sesuai kebutuhan Anda dan terapkan pembaruan tersebut.
-
Hapus pekerjaan Spark: Bersihkan pekerjaan Spark yang telah selesai atau tidak diperlukan lagi untuk menghindari biaya tak terduga.
Langkah 1: Terapkan komponen ack-spark-operator
Masuk ke Konsol ACK. Di panel navigasi kiri, klik .
-
Pada halaman Marketplace, klik tab App Catalog, lalu cari dan pilih ack-spark-operator.
-
Pada halaman ack-spark-operator, klik Deploy.
-
Pada panel Create, pilih kluster dan namespace, lalu klik Next.
-
Pada halaman Parameters, konfigurasikan parameter, lalu klik OK.
Tabel berikut menjelaskan parameter konfigurasi utama. Untuk daftar lengkap, lihat tab ConfigMaps pada halaman ack-spark-operator.
Parameter
Deskripsi
Bawaan
controller.replicasJumlah replika controller.
1
webhook.replicasJumlah replika webhook.
1
spark.jobNamespacesDaftar namespace tempat pekerjaan Spark dapat dijalankan. String kosong "" memungkinkan semua namespace. Beberapa namespace dipisahkan dengan koma (
,).-
["default"](bawaan) -
[""](semua namespace) -
["ns1","ns2","ns3"](beberapa namespace)
spark.serviceAccount.nameSpark Operator secara otomatis membuat ServiceAccount bernama
spark-operator-sparkdan sumber daya RBAC yang diperlukan di setiap namespace yang ditentukan olehspark.jobNamespaces. Jika Anda menyesuaikan nama ini, Anda harus menentukan nama baru tersebut saat mengirim pekerjaan Spark.spark-operator-spark -
Langkah 2: Kirim pekerjaan Spark
Buat manifes SparkApplication untuk mengirim pekerjaan Spark guna pemrosesan data.
-
Buat manifes SparkApplication 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 menyesuaikan nama ServiceAccount, ubah nilai ini sesuai. executor: instances: 1 cores: 1 coreLimit: 1200m memory: 512m restartPolicy: type: Never -
Jalankan perintah berikut untuk mengirim pekerjaan Spark.
kubectl apply -f spark-pi.yamlOutput yang diharapkan:
sparkapplication.sparkoperator.k8s.io/spark-pi created
Langkah 3: Pantau pekerjaan Spark
Jalankan perintah berikut untuk memeriksa status, Pod terkait, dan log pekerjaan Spark.
-
Jalankan perintah berikut untuk memeriksa 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 -
Jalankan perintah berikut untuk memeriksa status Pod pekerjaan Spark. Perintah ini memfilter Pod berdasarkan label
sparkoperator.k8s.io/app-namedengan nilaispark-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 Spark selesai, driver secara otomatis menghapus semua Pod executor.
-
Jalankan perintah berikut untuk melihat detail pekerjaan Spark.
kubectl describe sparkapplication spark-pi -
Jalankan perintah berikut untuk melihat 20 baris terakhir log 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 UI web Spark
UI web hanya dapat diakses selama Pod driver pekerjaan Spark berada dalam status Running. UI menjadi tidak tersedia setelah pekerjaan selesai.
Secara bawaan, saat Anda menerapkan komponen ack-spark-operator, parameter controller.uiService.enable diatur ke true. Hal ini secara otomatis membuat Service untuk mengekspos UI web, yang kemudian dapat Anda akses menggunakan penerusan port. Jika Anda mengatur parameter ini ke false saat penerapan, Service tidak akan dibuat. Dalam kasus ini, Anda harus meneruskan port langsung dari Pod driver.
Menggunakan kubectl port-forward cocok untuk verifikasi cepat di lingkungan pengujian, tetapi tidak disarankan untuk produksi karena risiko keamanan.
-
Teruskan port UI web ke mesin lokal Anda dengan menggunakan salah satu perintah berikut sesuai skenario Anda:
-
Penerusan port melalui Service
kubectl port-forward services/spark-pi-ui-svc 4040 -
Penerusan port 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 web Anda untuk mengakses UI web.
(Opsional) Langkah 5: Perbarui pekerjaan Spark
Jika Anda perlu mengubah parameter pekerjaan Spark, Anda dapat memperbarui manifesnya.
-
Edit manifes
spark-pi.yaml. Misalnya, ubah nilaiargumentsmenjadi10000dan 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 menyesuaikan nama ServiceAccount, ubah nilai ini sesuai. executor: instances: 2 cores: 1 coreLimit: 1200m memory: 512m restartPolicy: type: Never -
Jalankan perintah berikut untuk menerapkan perubahan.
kubectl apply -f spark-pi.yaml -
Jalankan perintah berikut untuk memeriksa status pekerjaan.
kubectl get sparkapplication spark-piPekerjaan Spark dijalankan kembali. Output yang diharapkan menunjukkan status RUNNING:
NAME STATUS ATTEMPTS START FINISH AGE spark-pi RUNNING 1 2024-06-04T03:37:34Z <no value> 20m
(Opsional) Langkah 6: Hapus pekerjaan Spark
Saat Anda tidak lagi memerlukan pekerjaan Spark, hapus pekerjaan tersebut untuk melepaskan sumber daya terkaitnya.
Hapus pekerjaan Spark yang telah Anda buat.
kubectl delete -f spark-pi.yaml
Atau, Anda dapat menjalankan perintah berikut:
kubectl delete sparkapplication spark-pi
Referensi
-
Untuk informasi tentang cara menggunakan Spark History Server untuk melihat informasi pekerjaan Spark, lihat Lihat informasi pekerjaan Spark dengan Spark History Server.
-
Untuk informasi tentang cara menggunakan Log Service untuk mengumpulkan log pekerjaan Spark, lihat Kumpulkan log pekerjaan Spark dengan Log Service.
-
Untuk informasi tentang cara mengonfigurasi pekerjaan Spark agar membaca dan menulis data Object Storage Service (OSS), lihat Baca dan tulis data OSS dalam pekerjaan Spark.
-
Untuk informasi tentang cara menggunakan sumber daya elastis untuk menjalankan pekerjaan Spark, lihat Jalankan pekerjaan Spark dengan sumber daya elastis ECI.
-
Untuk informasi tentang cara menggunakan Celeborn sebagai remote shuffle service (RSS) dalam pekerjaan Spark, lihat Gunakan Celeborn sebagai RSS dalam pekerjaan Spark.