在ACK Serverless叢集中,您可以按需按量建立Pod。當Pod結束後停止收費,無需為Spark計算任務預留計算資源,從而擺脫叢集計算力不足和擴容的煩擾,同時結合搶佔式執行個體可以降低任務的計算成本。本文主要為您介紹如何通過ACK Serverless按需建立Spark計算任務。
前提條件
已建立ACK Serverless叢集。具體操作,請參見建立叢集。
已通過Kubectl工具串連ACK Serverless叢集。具體操作,請參見通過kubectl串連Kubernetes叢集。
操作步驟
部署ack-spark-operator Chart,可以通過以下兩種方式:
在Container Service管理主控台的導覽列中選擇,通過選擇ack-spark-operator來進行部署。
通過helm命令列手動安裝。
說明要求Helm的版本不低於V3。
#建立Service account。 kubectl create serviceaccount spark #綁定許可權。 kubectl create clusterrolebinding spark-role --clusterrole=edit --serviceaccount=default:spark --namespace=default #安裝Operator。 helm repo add incubator http://storage.googleapis.com/kubernetes-charts-incubator helm install incubator/sparkoperator --namespace default --set operatorImageName=registry.cn-hangzhou.aliyuncs.com/acs/spark-operator --set operatorVersion=ack-2.4.5-latest --generate-name
部署後可以執行以下命令確認spark-operator已經啟動成功。
kubectl -n spark-operator get pod預期輸出:
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建立spark-pi.yaml檔案並拷貝以下內容到該檔案。
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 args: 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部署Spark計算任務。
執行以下命令,部署Spark計算任務。
kubectl apply -f spark-pi.yaml預期輸出:
sparkapplication.sparkoperator.k8s.io/spark-pi created執行以下命令,查看Spark計算任務的部署狀態。
kubectl get pod預期輸出:
NAME READY STATUS RESTARTS AGE spark-pi-driver 1/1 Running 0 2m12s從預期輸出可得,Pod的運行狀態為Running,表示正在部署Spark計算任務。
執行以下命令,再次查看Spark計算任務的部署狀態。
kubectl get pod預期輸出:
NAME READY STATUS RESTARTS AGE spark-pi-driver 0/1 Completed 0 2m54s從預期輸出可得,Pod的運行狀態為Completed,表示Spark計算任務已部署完成。
執行以下命令,查看Spark任務的計算結果。
kubectl logs spark-pi-driver|grep Pi預期輸出:
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可選:通過給Pod加上搶佔式執行個體的Annotation,使用搶佔式執行個體。
關於搶佔式執行個體Annotation的用法,請參見使用搶佔式執行個體。