Apache Spark は大規模データ処理向けの強力なコンピュートエンジンであり、データ分析および機械学習のシナリオで広く利用されています。Spark Operator は、Kubernetes クラスター内における Spark ジョブのデプロイとライフサイクル管理を自動化します。本ガイドでは、ACK クラスター上で Spark Operator を活用して、大規模データ処理ワークロードを効率的に実行・管理する方法について説明します。
前提条件
ACK マネージドクラスター または ACK サーバーレスクラスター(バージョン 1.24 以降)が作成済みである必要があります。詳細については、「ACK マネージドクラスターの作成」「ACK サーバーレスクラスターの作成」「クラスターの手動スペックアップ」をご参照ください。
kubectl クライアントが ACK クラスターに接続済みである必要があります。詳細については、「クラスターの kubeconfig の取得と kubectl を使用したクラスターへの接続」をご参照ください。
Spark Operator とは?
Spark Operator は、コンテナ化された環境内で Apache Spark ワークロードをオーケストレーションするための Kubernetes ネイティブなソリューションです。CustomResourceDefinitions (CRD) である SparkApplication や ScheduledSparkApplication を活用することで、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 アプリケーションのデプロイおよび管理に必要な一連のワークフローを順に説明します。
Spark Operator のデプロイ:ACK クラスターに ack-spark-operator コンポーネントをインストールし、Spark ジョブのオーケストレーション機能を有効化します。
Spark アプリケーションの作成:データ処理ワークロードを実行するための Spark ジョブ構成を定義・送信します。
実行状況のモニタリング:ジョブの進行状況を追跡し、Pod のステータスを確認し、実行ログおよびメトリックを詳細にレビューします。
Web インターフェイスへのアクセス:Spark Web UI を使用して、対話型のモニタリングおよびパフォーマンス可視化を行います。
構成の変更:運用を中断することなく、ジョブパラメーターを動的に調整し、構成を更新します。
リソースのクリーンアップ:完了済みまたは不要となった Spark ジョブを削除し、クラスターリソースの利用率を最適化してコストを抑制します。
手順 1:Spark Operator のデプロイ
ACK コンソール にログインします。左側のナビゲーションウィンドウで、 を選択します。
アプリマーケット ページに移動し、アプリカタログ タブを選択します。ack-spark-operator を検索して選択します。
ack-spark-operator ページで、ワンクリックデプロイ をクリックします。
作成 パネルで、対象クラスターおよび名前空間を選択し、次へ をクリックします。
パラメーター設定 ページで、デプロイパラメーターを構成し、OK をクリックします。
以下の表に、主要な構成パラメーターを示します。完全なパラメーター仕様については、構成項目 セクション(ack-spark-operator ページ内)をご参照ください。
パラメーター
説明
例
controller.replicas高可用性を確保するためのコントローラーのレプリカ数。
1(デフォルト)
webhook.replicasアドミッションコントロールのための Webhook のレプリカ数。
1(デフォルト)
spark.jobNamespacesSpark ジョブの実行を許可する名前空間の一覧。空文字列("")を指定すると、すべての名前空間が許可されます。複数の名前空間を指定する場合は、カンマ(
,)で区切ります。["default"](デフォルト)[""](すべての名前空間)["ns1","ns2","ns3"](複数の名前空間)
spark.serviceAccount.namespark.jobNamespacesに含まれる各名前空間に対して、spark-operator-sparkという名前の ServiceAccount および関連する RBAC リソースが自動的にプロビジョニングされます。カスタムの ServiceAccount 名を指定することも可能ですが、Spark ジョブの送信時にその名前を参照する必要があります。spark-operator-spark(デフォルト)
手順 2:Spark アプリケーションの作成
データ処理ワークロードをデプロイするための SparkApplication マニフェストを定義します。
以下の構成を含む
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: Neverkubectl を使用して Spark アプリケーションをデプロイします:
kubectl apply -f spark-pi.yaml期待される出力:
sparkapplication.sparkoperator.k8s.io/spark-pi created
手順 3:実行状況のモニタリング
以下のコマンドを使用して、Spark アプリケーションのステータス、Pod の詳細、および実行ログをモニタリングします。
アプリケーションのステータスを確認します:
kubectl get sparkapplication spark-pi期待される出力:
NAME STATUS ATTEMPTS START FINISH AGE spark-pi SUBMITTED 1 2024-06-04T03:17:11Z <no value> 15sアプリケーションのラベルを使用して 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 は自動的にクリーンアップされます。
アプリケーションの詳細情報を取得します:
kubectl describe sparkapplication spark-pi最近のドライバーログを確認します:
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 メカニズムを使用してください。
サービスまたはポッドのいずれかを使用してポートフォワーディングを確立します:
サービスのポートを転送:
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
ブラウザを開き、
http://127.0.0.1:4040にアクセスして Spark Web UI を表示します。
(任意)手順 5:構成の変更
マニフェストファイルのパラメーターを編集して、Spark アプリケーションを更新します。
spark-pi.yamlマニフェストを編集します。たとえば、argumentsを10000に変更して精度を向上させ、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更新された構成を適用します:
kubectl apply -f spark-pi.yamlアプリケーションのステータスを確認します:
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関連リソース
Spark History Server を使用したジョブのモニタリングおよび分析方法については、「Spark History Server を使用した Spark ジョブ情報の表示」をご参照ください。
Simple Log Service を使用した集中ログ収集の構成方法については、「Simple Log Service を使用した Spark ジョブログの収集」をご参照ください。
Object Storage Service (OSS) との連携によるデータ処理の有効化については、「Spark ジョブからの OSS へのデータ読み書きの構成」をご参照ください。
エラスティックコンピューティングリソースを活用したコスト最適化については、「ECI エラスティックリソースを使用した Spark ジョブの実行」をご参照ください。
Celeborn Remote Shuffle Service を使用したシャッフル性能の向上については、「Spark ジョブにおける Celeborn の RSS としての使用」をご参照ください。