ACK Serverless は、Spark タスクをオンデマンド Pod として実行します。Pod ライフサイクルが終了すると課金が停止するため、コンピューティングリソースを予約したり、クラスターを拡張したりする必要はありません。コストをさらに削減するには、プリエンプティブインスタンスを使用します。
前提条件
開始する前に、以下を確認してください。
ACK サーバーレスクラスター。詳細については、「ACK サーバーレスクラスターの作成」をご参照ください。
クラスターに接続された kubectl クライアント。詳細については、「kubectl を使用した ACK クラスターへの接続」をご参照ください。
spark-operator のデプロイ
次のいずれかの方法を使用して、ack-spark-operator Helm チャートをデプロイします。
オプション 1: ACK コンソール
Container Service 管理コンソールまたはContainer Service for Kubernetes (ACK) コンソールにログインします。
左側のナビゲーションウィンドウで、[マーケットプレイス] > [マーケットプレイス] を選択します。
「ack-spark-operator」を検索して選択し、チャートをデプロイします。
オプション 2: Helm CLI (Helm V3 以降が必要)
次のコマンドを実行します。
# 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デプロイ後、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 5m9sSpark タスクの実行
このセクションでは、モンテカルロサンプリングを使用して円周率の値を推定する、組み込みの SparkPi の例をデプロイする手順を説明します。
ステップ 1: SparkApplication マニフェストの作成
次の内容で 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
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ステップ 2: タスクの送信
kubectl apply -f spark-pi.yaml期待される出力:
sparkapplication.sparkoperator.k8s.io/spark-pi createdステップ 3: タスクステータスの確認
次のコマンドを実行して、Spark タスクのデプロイメントステータスを表示します。
kubectl get podタスクが進行中の場合の期待される出力:
NAME READY STATUS RESTARTS AGE
spark-pi-driver 1/1 Running 0 2m12sPod は Running 状態であり、Spark タスクがデプロイされていることを示します。
コマンドを再度実行して、最終ステータスを確認します。
kubectl get podタスクが完了した場合の期待される出力:
NAME READY STATUS RESTARTS AGE
spark-pi-driver 0/1 Completed 0 2m54sPod は Completed 状態であり、Spark タスクがデプロイされていることを示します。
ステップ 4: 結果の表示
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 にプリエンプティブインスタンスのアノテーションを追加します。詳細については、「プリエンプティブインスタンスの使用」をご参照ください。