GPU-accelerated Spark with NVIDIA RAPIDS#

NVIDIA RAPIDSをSparkに接続したPostgres Analytics AcceleratorPGAA環境と統合して、データレイクハウスのハードウェアレベルのアクセラレーションを実現します。 Sparkはクラスター全体の分散ワークロードをオーケストレーションしますが、RAPIDSは集中的な計算タスクをGPUにオフロードし、大規模なデータセットの複雑なクエリの大幅なスループットの向上を提供します。

_images/rapids_arch.png

このGPU高速化アプローチにより、PGAAは、次のコア機能を介して標準の分散処理を超越できます。

  • 大並列実行 何千ものNVIDIA GPUコアが列状データを同時に処理し、標準のPostgresテーブルより最大100倍の速度で複雑なクエリを完了します。

  • ハードウェアアクセラレーションによるスケーリング Sparkは100 GBでディストリビューションを管理しますが、RAPIDSは3 TB以上でプライマリパフォーマンスドライバーとなり、データの増加に応じてハードウェア効率のギャップが拡大します。

  • ゼロオーバーヘッドパフォーマンス メモリ内の列型データを直接操作し、手動のインデックス作成、バキューム処理、または従来のデータベースチューニングなしでピークパフォーマンスを提供します。

  • インテリジェントフォールバック ユーザーの介入なしで、サポートされていない操作をSpark CPUまたはPostgresカーネルに自動的にシフトして戻すことにより、クエリの完了を保証します。

注釈

現在、Apache SparkによるGPUアクセラレーションは、S3互換オブジェクトストレージまたは共有POSIXファイルシステムのParquetファイルの読み取り専用クエリー用に最適化されています。 Iceberg読み取り/書き込みのサポートが間もなく登場します。 !!!

NVIDIA RAPIDSを使用したGPUアクセラレーションの構成#

コアアーキテクチャは、PGAA拡張機能を備えたPostgresサーバー、NVIDIA RAPIDSで構成されたApache Sparkクラスター、およびParquet形式のデータを含む互換性のあるオブジェクトストレージで構成されています。

この環境を実装するには、既存のインフラストラクチャを活用するか、手動インストールを実行するか、

ready-to-run Docker Compose stack を使用して必要なすべてのコンポーネントをすばやく展開できます。このスタックには、NVIDIA Brevプラットフォーム用に最適化された事前構成された例が含まれており、クラウドにセルフサービスのGPUインスタンスを簡単に展開できます。互換性のあるGPUが検出された場合、NVIDIA RAPIDSは自動的にハードウェアアクセラレーションを提供します。それ以外の場合、システムは透過的にCPUベースの処理にフォールバックします。

NVIDIA RAPIDSを使用したPGAAの構成は、次の手順で構成されます。

  1. 前提条件 を確認します。

  2. NVIDIA RAPIDSの有効化 がSparkクラスター内で適切にインストールされ、アクティブであることを確認します。

  3. PostgresをSparkに接続する 。

  4. ソースデータの構成 。

  5. 分析クエリの実行 し、ワークロードがGPUアクセラレーションを利用していることを確認します。

前提条件#

  • Postgres PGAAおよびPGFS拡張機能がインストールされたバージョン16以降。

  • ストレージ場所 現在、S3互換ストレージとローカルファイルシステムのみがデータ保存場所としてサポートされています。

  • Apache Spark バージョン3.4以降。

  • Spark Connect 次の依存関係で構成された実行中の Spark Connect サーバー。

org.apache.spark:spark-connect_2.12:3.5.6,\
io.delta:delta-spark_2.12:3.3.1,\
org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.9.2,\
org.apache.iceberg:iceberg-aws-bundle:1.9.2,\
org.apache.hadoop:hadoop-aws:3.3.4
  • NVIDIA RAPIDS バージョン2025.10以降がSparkクラスターにインストールされています。詳細は、 NVIDIA RAPIDSの有効化 を参照してください。

  • ハードウェア NVIDIA GPUを搭載したマシンへのアクセス。

NVIDIA RAPIDSの有効化#

GPUアクセラレーションを利用するには、Apache Sparkクラスター内にNVIDIA RAPIDSを正しくインストールしてアクティブ化する必要があります。次の統合ガイドラインに従って、ハードウェアアクセラレーションをサポートするようにSpark環境を構成します。

  1. RAPIDS JARのダウンロード Spark環境が必要な

RAPIDS JAR files をダウンロードすることを確認します。ジョブを投入するときにプラグインバージョンcom.rapids-4-spark_2.12:25.10.0

を指定します。

  1. GPU Discovery: Sparkが使用可能なGPUを識別できるようにする

Install the GPU discovery script 。

  1. Spark構成を適用します。 少なくとも次のパラメーターを有効にします。最適化設定の完全なリストについては、

RAPIDS configuration および Tuning guide を参照してください。

spark.rapids.sql.enabled=true
spark.rapids.filecache.enabled=true
spark.executor.resource.gpu.amount=1
spark.plugins=com.nvidia.spark.SQLPlugin
spark.shuffle.manager=com.nvidia.spark.rapids.spark356.RapidsShuffleManager
  1. コンテナプロビジョニング Dockerを介してSparkを展開する場合、コンテナマニフェストを変更してホストGPUへのSparkアクセスを許可します。

上記の手順-検出スクリプトのボリュームマウント、環境レベルのSpark構成の設定、およびNVIDIAコンテナランタイムの構成を含む-を実装する完全な例については、サンプル

docker-compose.yaml を参照してください。

PostgresをSparkに接続する#

  1. Postgresのターミナルから、実行エンジンとしてSparkを使用するようにPGAAを設定し、Spark Connectエンドポイントを定義します。

SET pgaa.executor_engine = spark_connect;
SET pgaa.spark_connect_url = sc://spark-connect:15002;

spark-connect は、Spark Connectサービスアドレスを指します。

  1. PGAAインターフェイスを介して簡単なバージョンチェックを実行することにより、PostgresがSparkクラスターと通信できることを確認します。

SELECT pgaa.spark_sql(SELECT version());

成功した場合、コマンドはSparkクラスターのバージョン文字列を結果ます。

ソースデータの構成#

1. Postgresデータベースに、分析データが含まれるバケットを指す PGFS storage location を作成します。例、パブリックバケットの場合

SELECT pgfs.create_storage_location(
my-sample-data,
s3://beacon-analytics-demo-data-us-east-1-prod,
{"skip_signature": "true", "region": "us-east-1"}
);
  1. PGAA アクセス方法を使用してテーブルを作成します。前の手順で作成した保存場所、単一のParquetファイルまたは複数のParquetファイルを含むディレクトリへのパス、およびフォーマット現在Parquetを指定します。例

CREATE TABLE store () USING PGAA
    WITH (pgaa.storage_location = my-sample-data, pgaa.path = tpcds_sf_10/store, pgaa.format = parquet);
CREATE TABLE customer () USING PGAA
    WITH (pgaa.storage_location = my-sample-data, pgaa.path = tpcds_sf_10/customer, pgaa.format = parquet);
CREATE TABLE date_dim () USING PGAA
    WITH (pgaa.storage_location = my-sample-data, pgaa.path = tpcds_sf_10/date_dim, pgaa.format = parquet);
  CREATE TABLE store_returns () USING PGAA
    WITH (pgaa.storage_location = my-sample-data, pgaa.path = tpcds_sf_10/store_returns, pgaa.format = parquet);

複数のParquetファイルを含むディレクトリを指定すると、PGAAはすべてのファイルを処理のために単一のテーブルに自動的に結合します。

分析クエリの実行#

定義したテーブルに対して大規模な分析クエリを実行して、GPUアクセラレーションを正常に活用していることを確認します。

クエリはSparkクラスターにオフロードされ、NVIDIA RAPIDSがアクティブな場合、結合および集計操作は数千のGPUコアにわたって並列実行されます。

次の例では、TPC-DSからインスピレーションを得た分析クエリを実行し、店舗の合計収益を地域平均と比較することにより、高収益の顧客を特定します。これには、複雑な共通テーブル式CTE、相関サブクエリー、およびマルチステージ集計が含まれます。正確には、ベクトル化された実行を通じてPGAAが加速するCPU集中型のワークロードのタイプです。

WITH customer_total_return AS (
    SELECT
        sr_customer_sk AS ctr_customer_sk,
        sr_store_sk AS ctr_store_sk,
        SUM(sr_return_amt) AS ctr_total_return
    FROM store_returns, date_dim
    WHERE sr_returned_date_sk = d_date_sk
      AND d_year = 2000
    GROUP BY sr_customer_sk, sr_store_sk
)
SELECT c_customer_id
FROM customer_total_return ctr1, store, customer
WHERE ctr1.ctr_total_return > (
    SELECT AVG(ctr_total_return) * 1.2
    FROM customer_total_return ctr2
    WHERE ctr1.ctr_store_sk = ctr2.ctr_store_sk
)
AND s_store_sk = ctr1.ctr_store_sk
AND s_state = TN
AND ctr1.ctr_customer_sk = c_customer_sk
ORDER BY c_customer_id
LIMIT 100;

NVIDIA RAPIDSがクエリをアクティブに高速化していることを確認するには、Spark Connect UIを介して実行プランをモニタします。

  1. http://<spark_driver_host>:4040 でSpark UIにアクセスします。

  2. [SQL]タブに移動し、最近実行したクエリーを選択します。

  3. 計画を確認します。 RAPIDSがアクティブな場合、クエリノードには Gpu の接頭辞が付けられます。例、GpuFilter 、GpuBatchScan 、GpuUnion など。

クエリプランを超えて、Spark UI内でGPU固有のパフォーマンスメトリックを直接分析し、潜在的なボトルネックを特定できます。これらのメトリックの詳細な内訳とそれらを最適化する方法については、

NVIDIA tuning guide を参照してください。