ACK Serverless menjalankan tugas Spark sebagai Pod on-demand—penagihan berhenti ketika siklus hidup Pod berakhir, sehingga Anda tidak perlu memesan sumber daya komputasi atau memperluas kluster. Untuk mengurangi biaya lebih lanjut, gunakan instans preemptible.
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
Kluster ACK Serverless. Lihat Buat kluster ACK Serverless.
Klien kubectl yang terhubung ke kluster. Lihat Hubungkan ke kluster ACK menggunakan kubectl.
Terapkan spark-operator
Terapkan chart Helm ack-spark-operator menggunakan salah satu metode berikut.
Opsi 1: Konsol ACK
Masuk ke Container Service Management ConsoleKonsol Container Service for Kubernetes (ACK).
Pada panel navigasi sebelah kiri, pilih Marketplace > Marketplace.
Cari dan pilih ack-spark-operator, lalu terapkan chart tersebut.
Opsi 2: CLI Helm (Helm V3 atau versi lebih baru diperlukan)
Jalankan perintah berikut:
# Buat akun layanan
kubectl create serviceaccount spark
# Berikan izin
kubectl create clusterrolebinding spark-role --clusterrole=edit --serviceaccount=default:spark --namespace=default
# Tambahkan repositori Helm dan instal operator
helm repo add aliyunhub https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts-incubator/
helm install ack-spark-operator aliyunhub/ack-spark-operatorSetelah penerapan, verifikasi bahwa spark-operator sedang berjalan:
kubectl -n spark-operator get podOutput yang diharapkan:
NAME READY STATUS RESTARTS AGE
ack-spark-operator-7698586d7b-pvwln 1/1 Running 0 5m9s
ack-spark-operator-init-26tvh 0/1 Completed 0 5m9sJalankan tugas Spark
Bagian ini memandu Anda melalui penerapan contoh bawaan SparkPi, yang memperkirakan nilai pi menggunakan pengambilan sampel Monte Carlo.
Langkah 1: Buat manifes SparkApplication
Buat file bernama spark-pi.yaml dengan konten berikut:
apiVersion: "sparkoperator.k8s.io/v1beta2"
kind: SparkApplication
metadata:
name: spark-pi
namespace: default
spec:
arguments:
- "1000"
sparkConf:
"spark.scheduler.maxRegisteredResourcesWaitingTime": "3000s"
"spark.kubernetes.allocation.batch.size": "1"
"spark.rpc.askTimeout": "36000s"
"spark.network.timeout": "36000s"
"spark.rpc.lookupTimeout": "36000s"
"spark.core.connection.ack.wait.timeout": "36000s"
"spark.executor.heartbeatInterval": "10000s"
type: Scala
mode: cluster
image: "registry.aliyuncs.com/acs/spark:ack-2.4.5-latest"
imagePullPolicy: Always
mainClass: org.apache.spark.examples.SparkPi
mainApplicationFile: "local:///opt/spark/examples/jars/spark-examples_2.11-2.4.5.jar"
sparkVersion: "2.4.5"
restartPolicy:
type: Never
driver:
cores: 4
coreLimit: "4"
annotations:
k8s.aliyun.com/eci-image-cache: "true"
memory: "6g"
memoryOverhead: "2g"
labels:
version: 2.4.5
serviceAccount: spark
executor:
annotations:
k8s.aliyun.com/eci-image-cache: "true"
cores: 2
instances: 1
memory: "3g"
memoryOverhead: "1g"
labels:
version: 2.4.5Langkah 2: Kirim tugas
kubectl apply -f spark-pi.yamlOutput yang diharapkan:
sparkapplication.sparkoperator.k8s.io/spark-pi createdLangkah 3: Periksa status tugas
Jalankan perintah berikut untuk melihat status penerapan tugas Spark:
kubectl get podOutput yang diharapkan saat tugas sedang berjalan:
NAME READY STATUS RESTARTS AGE
spark-pi-driver 1/1 Running 0 2m12sPod berada dalam status Running, yang menunjukkan bahwa tugas Spark sedang diterapkan.
Jalankan kembali perintah tersebut untuk memeriksa status akhir:
kubectl get podOutput yang diharapkan saat tugas selesai:
NAME READY STATUS RESTARTS AGE
spark-pi-driver 0/1 Completed 0 2m54sPod berada dalam status Completed, yang menunjukkan bahwa tugas Spark telah selesai diterapkan.
Langkah 4: Lihat hasilnya
kubectl logs spark-pi-driver | grep PiOutput yang diharapkan:
20/04/30 07:27:51 INFO DAGScheduler: ResultStage 0 (reduce at SparkPi.scala:38) finished in 11.031 s
20/04/30 07:27:51 INFO DAGScheduler: Job 0 finished: reduce at SparkPi.scala:38, took 11.137920 s
Pi is roughly 3.1414371514143715(Opsional) Gunakan instans preemptible
Tambahkan anotasi untuk instans preemptible pada Pod guna mengurangi biaya komputasi. Untuk detailnya, lihat Gunakan instans preemptible.