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

Container Service for Kubernetes:Spark Operator を使用した Spark ジョブの実行

最終更新日:Feb 26, 2026

Apache Spark は大規模データ処理向けの強力なコンピュートエンジンであり、データ分析および機械学習のシナリオで広く利用されています。Spark Operator は、Kubernetes クラスター内における Spark ジョブのデプロイとライフサイクル管理を自動化します。本ガイドでは、ACK クラスター上で Spark Operator を活用して、大規模データ処理ワークロードを効率的に実行・管理する方法について説明します。

前提条件

Spark Operator とは?

Spark Operator は、コンテナ化された環境内で Apache Spark ワークロードをオーケストレーションするための Kubernetes ネイティブなソリューションです。CustomResourceDefinitions (CRD) である SparkApplicationScheduledSparkApplication を活用することで、Spark アプリケーションのデプロイおよび管理を簡素化します。コミュニティプロジェクト kubeflow/spark-operator を基盤として、ACK ではエンタープライズ向けの大規模 Spark ワークロード管理を実現する拡張版コンポーネント ack-spark-operator を提供しています。詳細については、「Spark Operator | Kubeflow」をご参照ください。

主なメリット

  • 運用の簡素化:宣言型のジョブ構成により、Kubernetes 内における Spark デプロイおよびライフサイクル管理を自動化します。

  • マルチテナントアーキテクチャ:Kubernetes 名前空間およびリソースクォータを活用し、安全なリソース隔離を実現します。ノードセレクターを使用して、Spark ワークロード専用の計算リソースを割り当てることも可能です。

  • 動的スケーリング:Elastic Container Instance (ECI) やエラスティックノードプールなどのエラスティックインフラストラクチャーと連携し、ピーク時の需要に応じてリソースを自動的にスケールアウト/スケールインすることで、コストとパフォーマンスを最適化します。

主な利用シーン

  • データ分析:データサイエンティストが Spark の分散コンピューティング機能を活用して、対話型の分析およびデータ前処理を実行できます。

  • バッチ処理:スケジュールされた ETL パイプラインおよび大規模データ変換を、自動化されたバッチジョブで実行できます。

  • ストリーム処理:Spark Streaming を使用して継続的なデータストリームをリアルタイムで処理し、ほぼ即時的なインサイトおよびイベント駆動型のワークフローを実現できます。

ワークフローの概要

本ガイドでは、ACK クラスター上で Spark Operator を使用した Spark アプリケーションのデプロイおよび管理に必要な一連のワークフローを順に説明します。

  1. Spark Operator のデプロイ:ACK クラスターに ack-spark-operator コンポーネントをインストールし、Spark ジョブのオーケストレーション機能を有効化します。

  2. Spark アプリケーションの作成:データ処理ワークロードを実行するための Spark ジョブ構成を定義・送信します。

  3. 実行状況のモニタリング:ジョブの進行状況を追跡し、Pod のステータスを確認し、実行ログおよびメトリックを詳細にレビューします。

  4. Web インターフェイスへのアクセス:Spark Web UI を使用して、対話型のモニタリングおよびパフォーマンス可視化を行います。

  5. 構成の変更:運用を中断することなく、ジョブパラメーターを動的に調整し、構成を更新します。

  6. リソースのクリーンアップ:完了済みまたは不要となった Spark ジョブを削除し、クラスターリソースの利用率を最適化してコストを抑制します。

手順 1:Spark Operator のデプロイ

  1. ACK コンソール にログインします。左側のナビゲーションウィンドウで、マーケットプレイス > マーケットプレイス を選択します。

  2. アプリマーケット ページに移動し、アプリカタログ タブを選択します。ack-spark-operator を検索して選択します。

  3. ack-spark-operator ページで、ワンクリックデプロイ をクリックします。

  4. 作成 パネルで、対象クラスターおよび名前空間を選択し、次へ をクリックします。

  5. パラメーター設定 ページで、デプロイパラメーターを構成し、OK をクリックします。

    以下の表に、主要な構成パラメーターを示します。完全なパラメーター仕様については、構成項目 セクション(ack-spark-operator ページ内)をご参照ください。

    パラメーター

    説明

    controller.replicas

    高可用性を確保するためのコントローラーのレプリカ数。

    1(デフォルト)

    webhook.replicas

    アドミッションコントロールのための Webhook のレプリカ数。

    1(デフォルト)

    spark.jobNamespaces

    Spark ジョブの実行を許可する名前空間の一覧。空文字列("")を指定すると、すべての名前空間が許可されます。複数の名前空間を指定する場合は、カンマ(,)で区切ります。

    • ["default"](デフォルト)

    • [""](すべての名前空間)

    • ["ns1","ns2","ns3"](複数の名前空間)

    spark.serviceAccount.name

    spark.jobNamespaces に含まれる各名前空間に対して、spark-operator-spark という名前の ServiceAccount および関連する RBAC リソースが自動的にプロビジョニングされます。カスタムの ServiceAccount 名を指定することも可能ですが、Spark ジョブの送信時にその名前を参照する必要があります。

    spark-operator-spark(デフォルト)

手順 2:Spark アプリケーションの作成

データ処理ワークロードをデプロイするための SparkApplication マニフェストを定義します。

  1. 以下の構成を含む spark-pi.yaml という名前の SparkApplication マニフェストファイルを作成します:

    apiVersion: sparkoperator.k8s.io/v1beta2
    kind: SparkApplication
    metadata:
      name: spark-pi
      namespace: default     # spark.jobNamespaces に名前空間が含まれていることを確認してください
    spec:
      type: Scala
      mode: cluster
      image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/spark:3.5.4
      imagePullPolicy: IfNotPresent
      mainClass: org.apache.spark.examples.SparkPi
      mainApplicationFile: local:///opt/spark/examples/jars/spark-examples_2.12-3.5.4.jar
      arguments:
      - "1000"
      sparkVersion: 3.5.4
      driver:
        cores: 1
        coreLimit: 1200m
        memory: 512m
        serviceAccount: spark-operator-spark   # 構成済みの場合はカスタム名を使用
      executor:
        instances: 1
        cores: 1
        coreLimit: 1200m
        memory: 512m
      restartPolicy:
        type: Never
  2. kubectl を使用して Spark アプリケーションをデプロイします:

    kubectl apply -f spark-pi.yaml

    期待される出力:

    sparkapplication.sparkoperator.k8s.io/spark-pi created

手順 3:実行状況のモニタリング

以下のコマンドを使用して、Spark アプリケーションのステータス、Pod の詳細、および実行ログをモニタリングします。

  1. アプリケーションのステータスを確認します:

    kubectl get sparkapplication spark-pi

    期待される出力:

    NAME       STATUS      ATTEMPTS   START                  FINISH       AGE
    spark-pi   SUBMITTED   1          2024-06-04T03:17:11Z   <no value>   15s
  2. アプリケーションのラベルを使用して Pod のステータスを表示します:

    kubectl get pod -l sparkoperator.k8s.io/app-name=spark-pi

    サンプル出力:

    NAME                               READY   STATUS    RESTARTS   AGE
    spark-pi-7272428fc8f5f392-exec-1   1/1     Running   0          13s
    spark-pi-7272428fc8f5f392-exec-2   1/1     Running   0          13s
    spark-pi-driver                    1/1     Running   0          49s
    説明

    ジョブの完了時にエグゼキュータ Pod は自動的にクリーンアップされます。

  3. アプリケーションの詳細情報を取得します:

    kubectl describe sparkapplication spark-pi

    サンプル出力の詳細

    出力内容はジョブの実行状態によって異なります。主なセクションは以下のとおりです:

    • メタデータ:作成タイムスタンプ、リソースバージョン、一意の識別子

    • Spec:イメージ、リソース、実行パラメーターなど、ジョブの構成

    • Status:現在の状態、ドライバー情報、エグゼキュータステータス、タイミング情報

    • Events:送信から完了までのライフサイクルイベント

    完全なサンプル出力については、元のドキュメント内の展開可能なセクションをご参照ください。

  4. 最近のドライバーログを確認します:

    kubectl logs --tail=20 spark-pi-driver

    ログには通常、以下のような情報が含まれます:

    • タスクのスケジューリングおよび実行の進捗状況

    • ジョブ完了の統計および結果

    • リソースのクリーンアップおよびシャットダウン手順

    • 一時ディレクトリのクリーンアップ操作

    完全なログの例については、元のドキュメントをご参照ください。

手順 4:Web インターフェイスへのアクセス

Spark アプリケーションは、リアルタイムモニタリングのための Web UI を提供します。kubectl port-forward を使用して、ローカル環境から UI にアクセスできます。Web UI はドライバーポッドが実行中の間のみ利用可能であり、ジョブ完了後に利用できなくなります。

デフォルトでは、ack-spark-operator のデプロイ時に controller.uiService.enable=true が有効化され、UI アクセス用のサービスが自動的に作成されます。デプロイ時に無効化されていた場合、ドライバーポッドのポートを直接転送することで UI にアクセスできます。

重要

ポートフォワーディングは、開発およびテスト環境でのみ使用することを推奨します。セキュリティ上の理由から、本番環境では安全な Ingress メカニズムを使用してください。

  1. サービスまたはポッドのいずれかを使用してポートフォワーディングを確立します:

    • サービスのポートを転送:

      kubectl port-forward services/spark-pi-ui-svc 4040
    • ポッドのポートを転送:

      kubectl port-forward pods/spark-pi-driver 4040

      正常な転送時の出力:

      Forwarding from 127.0.0.1:4040 -> 4040
      Forwarding from [::1]:4040 -> 4040
  2. ブラウザを開き、http://127.0.0.1:4040 にアクセスして Spark Web UI を表示します。

(任意)手順 5:構成の変更

マニフェストファイルのパラメーターを編集して、Spark アプリケーションを更新します。

  1. spark-pi.yaml マニフェストを編集します。たとえば、arguments10000 に変更して精度を向上させ、executor のインスタンス数を 2 に設定して計算リソースをスケールアップします:

    apiVersion: sparkoperator.k8s.io/v1beta2
    kind: SparkApplication
    metadata:
      name: spark-pi
    spec:
      type: Scala
      mode: cluster
      image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/spark:3.5.4
      imagePullPolicy: IfNotPresent
      mainClass: org.apache.spark.examples.SparkPi
      mainApplicationFile: local:///opt/spark/examples/jars/spark-examples_2.12-3.5.4.jar
      arguments:
      - "10000"
      sparkVersion: 3.5.4
      driver:
        cores: 1
        coreLimit: 1200m
        memory: 512m
        serviceAccount: spark
      executor:
        instances: 2
        cores: 1
        coreLimit: 1200m
        memory: 512m
      restartPolicy:
        type: Never
  2. 更新された構成を適用します:

    kubectl apply -f spark-pi.yaml
  3. アプリケーションのステータスを確認します:

    kubectl get sparkapplication spark-pi

    アプリケーションは新しいパラメーターで再起動されます:

    NAME       STATUS    ATTEMPTS   START                  FINISH       AGE
    spark-pi   RUNNING   1          2024-06-04T03:37:34Z   <no value>   20m

(任意)手順 6:リソースのクリーンアップ

Spark アプリケーションおよび関連リソースが不要になった場合、それらを削除します。

マニフェストファイルを使用して削除します:

kubectl delete -f spark-pi.yaml

または、名前を指定して直接削除します:

kubectl delete sparkapplication spark-pi

関連リソース