ACK Serverlessクラスターでは、ビジネス要件を満たすポッドを作成できます。 ポッドのライフサイクルが終了すると、システムはポッドへの課金を停止します。 Sparkタスクのコンピューティングリソースを予約する必要はありません。 これにより、不十分なコンピューティングリソースの問題が解決され、クラスターを拡張する必要がなくなります。 さらに、プリエンプティブルインスタンスを使用することで、コンピューティングコストを削減できます。 このトピックでは、ACK Serverlessを使用して、ビジネス要件を満たすSparkタスクを作成する方法について説明します。
前提条件
ACKサーバーレスクラスターが作成されます。 詳細については、「ACKサーバーレスクラスターの作成」をご参照ください。
kubectlクライアントがクラスターに接続されています。 詳細については、「kubectlを使用したACKクラスターへの接続」をご参照ください。
手順
次のいずれかの方法を使用して、ack-spark-operatorチャートを展開します。
Container Service for Kubernetes (ACK) コンソールにログインします。 左側のナビゲーションウィンドウで、 を選択し、[ack-spark-operator] を選択してグラフを展開します。
helmコマンドを実行して、グラフを手動で展開します。
説明HelmのバージョンはV3以降でなければなりません。
# Create a service account. kubectl create serviceaccount spark # Grant permissions. kubectl create clusterrolebinding spark-role --clusterrole=edit --serviceaccount=default:spark --namespace=default # Install the 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
出力には、ポッドのステータスが実行中であることが示されます。これは、Sparkタスクがデプロイ中であることを示します。
次のコマンドを実行して、Sparkタスクのデプロイメントステータスを再度表示します。
kubectl get pod
期待される出力:
NAME READY STATUS RESTARTS AGE spark-pi-driver 0/1 Completed 0 2m54s
出力には、ポッドが完了状態であることが示されます。これは、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
です
オプション: プリエンプティブルインスタンスを使用するには、プリエンプティブルインスタンスのアノテーションをポッドに追加します。
プリエンプティブルインスタンスにアノテーションを追加する方法の詳細については、「プリエンプティブルインスタンスの使用」をご参照ください。