Container Service for Kubernetes (ACK) 上の Spark は、ACK が提供するソリューションです。Kubernetes 上の Spark を活用し、ACK が提供するエンタープライズレベルのコンテナアプリケーション管理機能を利用して、効率的で柔軟性があり、スケーラブルな Spark ビッグデータ処理プラットフォームを迅速に構築できます。
ACK 上の Spark の紹介
Apache Spark は、大規模データ処理向けに設計された計算エンジンであり、データ分析や機械学習などのシナリオで広く利用されています。バージョン 2.3 以降、Spark は Kubernetes クラスタへのジョブ送信を可能にしました (Kubernetes 上での Spark の実行)。
Spark Operator は、Kubernetes クラスタ上で Spark ワークロードを実行するために設計された Operator です。構成、送信、再試行プロセスなど、Kubernetes ネイティブの方法で Spark ジョブライフサイクルの管理を自動化します。
ACK 上の Spark ソリューションは、Spark Operator のようなコンポーネントをカスタマイズおよび強化し、オープンソースバージョンとの互換性を確保し、機能を拡張します。Alibaba Cloud エコシステムとシームレスに統合し、ログ保持、Object Storage Service、可観測性などの機能を提供することで、柔軟で効率的、かつスケーラブルなビッグデータ処理プラットフォームを迅速に構築できます。
機能と利点
開発と運用の簡素化
移植性: Spark アプリケーションとその依存関係をコンテナイメージにパッケージ化し、Kubernetes クラスタ間で簡単に移行できます。
可観測性: Spark History Server を介したジョブステータスの監視を可能にし、Simple Log Service および Managed Service for Prometheus と統合してジョブの可観測性を向上させます。
ワークフローオーケストレーション: Apache Airflow や Argo Workflows などのワークフローオーケストレーションエンジンを使用して Spark ジョブを管理し、データパイプラインのスケジューリングを自動化し、さまざまな環境で一貫したデプロイを保証します。これにより、運用効率が向上し、移行コストが削減されます。
マルチバージョンサポート: 単一の ACK クラスタで複数のバージョンの Spark ジョブを同時に実行できます。
ジョブスケジューリングとリソース管理
ジョブキュー管理: ack-kube-queue とシームレスに統合されたこの機能は、ジョブキューとリソースクォータの柔軟な管理を提供し、ワークロードのリソース割り当てを自動的に最適化し、クラスタリソースの利用率を向上させます。
複数のスケジューリング戦略: ACK スケジューラの既存の スケジューリング機能 を活用して、Gang Scheduling や Capacity Scheduling など、さまざまなバッチスケジューリング戦略をサポートします。
マルチアーキテクチャスケジューリング: x86 および Arm アーキテクチャの Elastic Compute Service (ECS) リソースのハイブリッド使用をサポートし、効率を向上させ、コストを削減します。
マルチクラスタスケジューリング: ACK One マルチクラスタフリートを利用して、Spark ジョブをさまざまなクラスタに分散 し、複数のクラスタにわたるリソース利用率を向上させます。
弾力的な計算能力の供給: カスタマイズ可能なリソース優先度スケジューリングと、ノードの自動スケーリング や インスタントエラステイシティ などのさまざまな弾力性ソリューションの統合を提供します。また、Elastic Compute Service インスタンスを維持することなく、Elastic Container Instance および Alibaba Cloud Container Compute Service (ACS) の計算リソースを使用できるため、オンデマンドで柔軟なスケーリングオプションが可能になります。
複数タイプのワークロードのコロケーション: ack-koordinator とシームレスに統合されたこの機能は、さまざまなタイプのワークロードのコロケーションをサポートし、それによってクラスタリソースの利用率を向上させます。
パフォーマンスと安定性の最適化
シャッフルパフォーマンスの最適化: Spark ジョブが Celeborn を Remote Shuffle Service として使用するように構成し、ストレージと計算の分離を実現し、シャッフルのパフォーマンスと安定性を向上させます。
データアクセス高速化: Fluid が提供するデータオーケストレーションとアクセス高速化機能を利用して、Spark ジョブのデータアクセスを高速化し、パフォーマンスを向上させます。
全体アーキテクチャ
ACK 上の Spark のアーキテクチャにより、Spark Operator を介してジョブを迅速に送信でき、ACK と Alibaba Cloud プロダクトの可観測性、スケジューリング、リソースの弾力性機能を活用できます。
クライアント: kubectl や Arena などのコマンドラインツールを使用して、Spark ジョブを ACK クラスタに送信します。
ワークフロー: Apache Airflow や Argo Workflows などのフレームワークを使用して、Spark ジョブをオーケストレーションし、ACK クラスタに送信します。
可観測性: Spark History Server、Simple Log Service、Managed Service for Prometheus を使用して、システムの可観測性を向上させます。これには、ジョブステータスの監視、ジョブログとメトリックの収集と分析が含まれます。
Spark Operator: 構成、送信、再試行など、Spark ジョブライフサイクル管理を自動化します。
Remote Shuffle Service (RSS): Apache Celeborn を RSS として使用して、Spark ジョブのパフォーマンスと安定性を向上させます。
キャッシュ: Fluid をデータアクセスと高速化のための分散キャッシュシステムとして採用します。
クラウドインフラストラクチャ: ジョブの実行中に、ECS インスタンス、Elastic Container Instance、ACS クラスタ などの計算リソース、ディスク、NAS ファイルシステム (NAS)、Object Storage Service (OSS) バケット などのストレージリソース、Elastic Network Interface (ENI)、Virtual Private Cloud (VPC)、Server Load Balancer (SLB) インスタンス などのネットワークリソースを含む、Alibaba Cloud インフラストラクチャを利用します。
課金概要
ACK クラスタで Spark ジョブを実行するためのコンポーネントのインストールは無料です。ただし、クラスタ管理料金や関連クラウドプロダクト料金など、ACK クラスタ自体の費用は通常どおり課金されます。詳細については、「課金概要」をご参照ください。
Simple Log Service でログを収集したり、Spark ジョブで OSS/NAS のデータを読み書きしたりするための追加のクラウドプロダクト料金は、各クラウドプロダクトによって課金されます。詳細については、以下の操作ドキュメントを参照してください。
はじめに
ACK クラスタで Spark ジョブを実行するには、通常、基本的な使用方法、可観測性、詳細設定など、一連のステップが含まれます。ニーズに応じて選択および構成できます。
基本的な使用方法
プロセス | 説明 |
Spark コンテナイメージの構築 | オープンソースコミュニティが提供する Spark コンテナイメージを直接使用するか、オープンソースコンテナイメージに基づいてカスタマイズし、独自のイメージリポジトリにプッシュすることができます。以下は Dockerfile の例です。Spark ベースイメージの置き換えや依存 JAR パッケージの追加など、必要に応じてこの Dockerfile を変更し、イメージをビルドしてイメージリポジトリにプッシュできます。 |
専用の namespace の作成 | Spark ジョブ用に 1 つ以上の専用の namespace (このチュートリアルでは |
Spark Operator を使用した Spark ジョブの実行 | ack-spark-operator コンポーネントをデプロイし、 詳細については、「Spark Operator を使用して Spark ジョブを実行する」をご参照ください。 |
OSS データの読み取りと書き込み | Spark ジョブが Alibaba Cloud OSS データにアクセスするには、Hadoop Aliyun SDK、Hadoop AWS SDK、JindoSDK など、複数の方法があります。選択した SDK に応じて、Spark コンテナイメージに該当する依存関係を含め、Spark ジョブで Hadoop 関連のパラメータを構成する必要があります。 詳細については、「Spark ジョブで OSS データを読み書きする」をご参照ください。 |
可観測性
プロセス | 説明 |
Spark History Server のデプロイ |
次に、Spark ジョブを送信するときに同じ NAS ファイルシステムをマウントし、同じパスにイベントログを書き込むように Spark を構成します。その後、Spark History Server からジョブを表示できるようになります。以下はジョブの例です。 詳細については、「Spark History Server を使用して Spark ジョブに関する情報を表示する」をご参照ください。 |
Spark ログを収集するための Simple Log Service の構成 | クラスタで多数の Spark ジョブを実行する場合、Simple Log Service を使用してすべての Spark ジョブログを一元的に収集し、Spark コンテナの stdout および stderr ログをクエリおよび分析することをお勧めします。 詳細については、「Simple Log Service を使用して Spark ジョブのログを収集する」をご参照ください。 |
パフォーマンスの最適化
プロセス | 説明 |
RSS によるシャッフルパフォーマンスの向上 | シャッフルは分散コンピューティングにおける重要な操作であり、多くの場合、大量のディスク IO、データシリアル化、ネットワーク IO を伴い、OOM やデータ取得の失敗 (Fetch failures) を引き起こしやすいです。シャッフルのパフォーマンスと安定性を最適化し、コンピューティングサービスの品質を向上させるために、Spark ジョブ構成で Apache Celeborn を Remote Shuffle Service (RSS) として使用できます。 詳細については、「Spark ジョブで Celeborn を RSS として使用する」をご参照ください。 |
弾力的なリソーススケジューリング優先度の定義 | Elastic Container Instance ベースの Pod を使用し、適切なスケジューリング戦略を構成することで、オンデマンドで作成し、実際の使用量に基づいて課金できるため、アイドル状態のクラスタリソースによるコストの無駄を効果的に削減できます。ECS インスタンスと Elastic Container Instance が混在するシナリオでは、スケジューリングの優先順位を指定することもできます。 SparkApplication でスケジューリング関連の構成を変更する必要はありません。ACK スケジューラは、構成された弾力性戦略に基づいて Pod スケジューリングを自動的に完了します。必要に応じて、さまざまな弾力性リソース (ECS インスタンスや Elastic Container Instance など) の混在使用を柔軟にカスタマイズできます。 詳細については、「Elastic Container Instance を使用して Spark ジョブを実行する」をご参照ください。 |
動的リソース割り当ての構成 | 動的リソース割り当て (DRA) は、ワークロードのサイズに基づいてジョブが使用する計算リソースを動的に調整できます。Spark ジョブの動的リソース割り当てを有効にすることで、リソース不足によるジョブの実行時間の長期化や、リソース過剰によるリソースの無駄を回避できます。 詳細については、「Spark ジョブの動的リソース割り当てを構成する」をご参照ください。 |
Fluid を使用したデータアクセスの高速化 | データがデータセンターにある場合、またはデータアクセス中にパフォーマンスボトルネックが発生した場合、Fluid が提供するデータアクセスと分散キャッシュオーケストレーション機能を使用してデータアクセスを高速化できます。 詳細については、「Fluid を使用して Spark アプリケーションのデータアクセスを高速化する」をご参照ください。 |
参照
[アプリケーションの監視] > [クラスタ Pod の監視] タブで Managed Service for Prometheus を使用 できます。
Spark ジョブキュー管理とリソース割り当ての最適化については、「ack-kube-queue を使用して AI および機械学習ワークロードを管理する」をご参照ください。
ElasticQuotaTree を使用したきめ細かいリソースクォータ管理を実装して、リソース使用率を向上させます。詳細については、「ElasticQuotaTree と ack-kube-queue を使用してリソース使用率を向上させる」をご参照ください。
複数の ACK クラスタにわたるアイドルリソースを最大限に活用するためのマルチクラスタ Spark ジョブスケジューリングと分散については、「アイドルリソースを使用して複数のクラスタで Spark ジョブをスケジュールおよび分散する」をご参照ください。