ACK Serverless exécute les tâches Spark sous forme de Pods à la demande. La facturation s'arrête à la fin du cycle de vie du Pod, ce qui vous évite de réserver des ressources de calcul ou d'étendre le cluster. Pour réduire encore davantage les coûts, utilisez des instances préemptibles.
Prérequis
Avant de commencer, assurez-vous d'avoir :
Un cluster ACK Serverless. Consultez la rubrique Créer un cluster ACK Serverless.
Un client kubectl connecté au cluster. Consultez la rubrique Se connecter à un cluster ACK avec kubectl.
Déployer spark-operator
Déployez le chart Helm ack-spark-operator selon l'une des méthodes suivantes.
Option 1 : Console ACK
Connectez-vous à la console Container Service Managementconsole Container Service for Kubernetes (ACK).
Dans le volet de navigation de gauche, choisissez Marketplace > Marketplace.
Recherchez et sélectionnez ack-spark-operator, puis déployez le chart.
Option 2 : CLI Helm (Helm V3 ou version ultérieure requise)
Exécutez les commandes suivantes :
# Create a service account
kubectl create serviceaccount spark
# Grant permissions
kubectl create clusterrolebinding spark-role --clusterrole=edit --serviceaccount=default:spark --namespace=default
# Add the Helm repository and install the operator
helm repo add aliyunhub https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts-incubator/
helm install ack-spark-operator aliyunhub/ack-spark-operator
Après le déploiement, vérifiez que spark-operator est en cours d'exécution :
kubectl -n spark-operator get pod
Résultat attendu :
NAME READY STATUS RESTARTS AGE
ack-spark-operator-7698586d7b-pvwln 1/1 Running 0 5m9s
ack-spark-operator-init-26tvh 0/1 Completed 0 5m9s
Exécuter une tâche Spark
Cette section explique comment déployer l'exemple intégré SparkPi, qui estime la valeur de pi à l'aide d'un échantillonnage de Monte Carlo.
Étape 1 : Créer le manifeste SparkApplication
Créez un fichier nommé spark-pi.yaml avec le contenu suivant :
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.5
Étape 2 : Soumettre la tâche
kubectl apply -f spark-pi.yaml
Résultat attendu :
sparkapplication.sparkoperator.k8s.io/spark-pi created
Étape 3 : Vérifier l'état de la tâche
Exécutez la commande suivante pour afficher l'état du déploiement de la tâche Spark :
kubectl get pod
Résultat attendu lorsque la tâche est en cours d'exécution :
NAME READY STATUS RESTARTS AGE
spark-pi-driver 1/1 Running 0 2m12s
Le Pod est à l'état Running, ce qui indique que la tâche Spark est en cours de déploiement.
Exécutez à nouveau la commande pour vérifier l'état final :
kubectl get pod
Résultat attendu lorsque la tâche est terminée :
NAME READY STATUS RESTARTS AGE
spark-pi-driver 0/1 Completed 0 2m54s
Le Pod est à l'état Completed, ce qui indique que la tâche Spark est terminée.
Étape 4 : Afficher le résultat
kubectl logs spark-pi-driver | grep Pi
Résultat attendu :
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
(Facultatif) Utiliser des instances préemptibles
Ajoutez des annotations pour les instances préemptibles au Pod afin de réduire les coûts de calcul. Pour plus de détails, consultez la rubrique Utiliser des instances préemptibles.