すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:ACK Serverlessを使用してSparkタスクを作成する

最終更新日:Dec 16, 2024

ACK Serverlessクラスターでは、ビジネス要件を満たすポッドを作成できます。 ポッドのライフサイクルが終了すると、システムはポッドへの課金を停止します。 Sparkタスクのコンピューティングリソースを予約する必要はありません。 これにより、不十分なコンピューティングリソースの問題が解決され、クラスターを拡張する必要がなくなります。 さらに、プリエンプティブルインスタンスを使用することで、コンピューティングコストを削減できます。 このトピックでは、ACK Serverlessを使用して、ビジネス要件を満たすSparkタスクを作成する方法について説明します。

前提条件

手順

  1. 次のいずれかの方法を使用して、ack-spark-operatorチャートを展開します。

    • Container Service for Kubernetes (ACK) コンソールにログインします。 左側のナビゲーションウィンドウで、[Marketplace] > [アプリカタログ] を選択し、[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
  2. 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
  3. Sparkタスクをデプロイします。

    1. 次のコマンドを実行して、Sparkタスクをデプロイします。

      kubectl apply -f spark-pi.yaml

      期待される出力:

      sparkapplication.sparkoperator.k8s.io/spark-pi created
    2. 次のコマンドを実行して、Sparkタスクのデプロイメントステータスを表示します。

      kubectl get pod

      期待される出力:

      NAME              READY   STATUS    RESTARTS   AGE
      spark-pi-driver   1/1     Running   0          2m12s

      出力には、ポッドのステータスが実行中であることが示されます。これは、Sparkタスクがデプロイ中であることを示します。

    3. 次のコマンドを実行して、Sparkタスクのデプロイメントステータスを再度表示します。

      kubectl get pod

      期待される出力:

      NAME              READY   STATUS      RESTARTS   AGE
      spark-pi-driver   0/1     Completed   0          2m54s

      出力には、ポッドが完了状態であることが示されます。これは、Sparkタスクがデプロイされていることを示します。

  4. 次のコマンドを実行して、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

    です

  5. オプション: プリエンプティブルインスタンスを使用するには、プリエンプティブルインスタンスのアノテーションをポッドに追加します。

    プリエンプティブルインスタンスにアノテーションを追加する方法の詳細については、「プリエンプティブルインスタンスの使用」をご参照ください。