Lakehouse Iceberg REST カタログを設定する

新しいワークフローでは、 Lakehouse ランタイム カタログ内の Apache Iceberg REST カタログエンドポイントを使用することをおすすめします。

このエンドポイントは信頼できる唯一の情報源として機能し、クエリエンジン間のシームレスな相互運用を可能にします。これにより、Apache Spark などのエンジンは、Google Cloud Lakehouse テーブルを検出、読み取り、管理できます。

オープンソース エンジンを使用して Cloud Storage のデータにアクセスし、BigQuery などの他のエンジンとの相互運用が必要な場合は、このアプローチが適しています。きめ細かいアクセス制御のための認証情報ベンディングリージョン間レプリケーションとディザスタリカバリなどの機能をサポートしています。

一方、BigQuery 用のカスタム Apache Iceberg カタログ エンドポイントは 以前のインテグレーションです。既存のワークフローでは引き続き使用できますが、REST カタログの方がより標準化され、機能が豊富です。

始める前に

続行する前に、Lakehouse ランタイム カタログIceberg REST カタログ エンドポイントの概要をよく理解してください。

  1. プロジェクト Google Cloud に対して課金が有効になっていることを確認します

  2. BigLake API を有効にします。

    API を有効にするために必要なロール

    API を有効にするには、serviceusage.services.enable 権限を含む Service Usage 管理者 IAM ロール(roles/serviceusage.serviceUsageAdmin)が必要です。詳しくは、ロールを付与する方法をご覧ください。

    API の有効化

必要なロール

Lakehouse ランタイム カタログで Apache Iceberg REST カタログ エンドポイントを使用するために必要な権限を取得するには、管理者に次の IAM ロールを付与するよう依頼してください。

  • カタログ ユーザー アクセス、ストレージ アクセス、カタログの認証情報ベンディング モードの管理などの管理タスクを実行する:
  • 認証情報ベンディング モードでテーブルデータを読み取る: BigLake 閲覧者 (roles/biglake.viewer) プロジェクトに対する。Managed Service for Apache Spark、Managed Service for Apache Spark、Dataflow などのクエリエンジンを使用してテーブルデータを読み取る場合は、そのエンジンでジョブを実行するために使用するサービス アカウントにこのロールを付与します。
  • 認証情報ベンディング モードでテーブルデータを書き込む: BigLake 編集者 roles/biglake.editor) : プロジェクトに対する。Managed Service for Apache Spark、Managed Service for Apache Spark、Dataflow などのクエリエンジンを使用してテーブルデータを書き込む場合は、そのエンジンでジョブを実行するために使用するサービス アカウントにこのロールを付与します。
  • 認証情報ベンディング モードで自動プロビジョニングされた Lakehouse ランタイム カタログ サービス アカウントを使用する: Storage オブジェクト ユーザー roles/storage.objectUser) ターゲット Cloud Storage バケットに対する。カタログを作成したら、ストレージ バケットに対する Storage オブジェクト ユーザーロール(roles/storage.objectUser)を、カタログの自動プロビジョニングされた Lakehouse ランタイム カタログ サービス アカウントに明示的に付与します。
  • 認証情報ベンディング モード以外でカタログ リソースとテーブルデータを読み取る:
  • 認証情報ベンディング モード以外でカタログ リソースを管理し、テーブルデータを書き込む:
  • BigQuery カタログ フェデレーションでデータ操作言語(DML)オペレーションを実行する:
    • プロジェクトに対する BigQuery データ編集者 roles/bigquery.dataEditor
    • Cloud Storage バケットに対する ストレージ管理者(roles/storage.admin)。Managed Service for Apache Spark などのクエリエンジンを使用して DML オペレーションを実行する場合は、そのエンジンでジョブを実行するために使用するサービス アカウントにこれらのロールを付与します。

ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。

制限事項

Apache Iceberg REST カタログ エンドポイントには次の制限があります。

一般的な制限事項

  • Iceberg V2 テーブルのみがサポートされています。Iceberg V1 テーブルはサポートされていません。既存の Iceberg V1 テーブルがある場合は、Apache Iceberg REST カタログ エンドポイントで使用する前に、V2 にアップグレードする必要があります(ALTER TABLE catalog.schema.table SET TBLPROPERTIES ('format-version'='2'); を実行するか、同様のエンジン オペレーションを使用します)。
  • Trino は、Compute Engine 2.3 イメージ バージョン 2.3.16 以降で Managed Service for Apache Spark を使用する場合にのみ、BigQuery カタログ フェデレーションでサポートされます。
  • 認証情報ベンディング モードを使用する場合は、io-impl プロパティを org.apache.iceberg.gcp.gcs.GCSFileIO に設定する必要があります。デフォルトの org.apache.iceberg.hadoop.HadoopFileIO はサポートされていません。

テーブルの制限事項

  • Apache Iceberg REST カタログ エンドポイントで管理されるテーブルは、行レベルや列レベルのセキュリティなどのきめ細かいアクセス制御(FGAC)をサポートしていません。

データの制限事項

  • Parquet ファイルのみがサポートされています。BigQuery で Parquet ファイルを処理する方法の詳細については、Cloud Storage からの Parquet データの読み込みをご覧ください。
  • Iceberg metadata.json ファイルのサイズは 1 MB に制限されています。この上限の引き上げをリクエストするには、Google アカウント チームにお問い合わせください。

クエリの制限事項

  • Apache Iceberg REST カタログ エンドポイントで管理される Apache Iceberg テーブルのビューは、BigQuery で作成できません。
  • Apache Iceberg メタデータ テーブル(.snapshots.files など)は、5 部構成の名前識別子を使用して BigQuery でクエリできません。これらのテーブルは Spark を使用してクエリできます。

Iceberg REST カタログ エンドポイントを設定する

カタログを設定する前に、Apache Iceberg REST カタログ エンドポイントの概要を読んで、リソース階層、カタログ タイプ、命名構造を理解することをおすすめします。

Lakehouse ランタイム カタログで Apache Iceberg REST カタログ エンドポイントを使用する一般的な手順は次のとおりです。

  1. Iceberg REST カタログ エンドポイントの概要に基づいて、カタログ ウェアハウスのロケーション(Cloud Storage または BigQuery)を選択します。
  2. Cloud Storage gs:// ウェアハウスを使用している場合は、ウェアハウスのロケーションを指すカタログを作成します。
  3. Apache Iceberg REST カタログ エンドポイントを使用するようにクライアント アプリケーションを構成します。
  4. テーブルを整理するための Namespace またはスキーマを作成します。
  5. 構成したクライアントを使用してテーブルを作成してクエリを実行します。

カタログを作成

エンドユーザー認証情報または認証情報ベンディング モードを使用するカタログを作成できます。

  • エンドユーザー認証情報を使用すると、カタログはアクセスしているエンドユーザーの ID を Cloud Storage に渡して承認チェックを行います。

  • 認証情報ベンディングは、ストレージ アクセスの委任メカニズムです。これにより、Lakehouse ランタイム カタログ管理者は Lakehouse ランタイム カタログ リソースに対する権限を直接制御できるため、カタログ ユーザーが Cloud Storage バケットに直接アクセスする必要がなくなります。これにより、Google Cloud の LakehouseLakehouse 管理者は、特定のデータファイルに対する権限をユーザーに付与できます。

考慮事項

カタログを作成する前に、ロケーションの要件をよく理解してください。

  • Namespace を作成すると、カタログと同じリージョンが自動的に使用されます。

  • カタログでマルチリージョン バケットを使用し、BigQuery マルチリージョン(US または EU)で使用する場合は、カタログを削除して再作成し、プライマリ ロケーションを指定する必要があります。

エンドユーザー認証情報

コンソール

  1. コンソールで [Lakehouse] ページを開きます。 Google Cloud

    [Lakehouse] に移動

  2. [カタログを作成] をクリックします。

  3. [Cloud Storage バケットを選択] フィールドに、カタログで使用する Cloud Storage バケットの名前を入力します。または、[参照] をクリックして、既存のバケットを選択するか、新しいバケットを作成します。Cloud Storage バケットごとに 1 つのカタログのみを使用できます。

  4. [**認証方法**] で [**エンドユーザー認証情報**] を選択します。

  5. [作成] をクリックします。

gcloud

gcloud biglake iceberg catalogs create コマンドを使用します。

gcloud biglake iceberg catalogs create \
    CATALOG_NAME \
    --project PROJECT_ID \
    --catalog-type gcs-bucket \
    --credential-mode end-user \
    [--primary-location LOCATION]

次のように置き換えます。

  • CATALOG_NAME: カタログの名前。Lakehouse ランタイム カタログでサポートされている Apache Iceberg テーブルの場合、 この名前は REST カタログで使用される Cloud Storage バケット ID と一致することがよくあります。たとえば、バケットが gs://bucket-id の場合、 カタログ名は bucket-id になります。この名前は、カタログ識別子としても使用されます。BigQuery からこれらのテーブルにクエリを実行するときに、 これらのテーブルにクエリを実行するときに、
  • PROJECT_ID: 実際の Google Cloud プロジェクト ID。
  • LOCATION: (省略可)BigQuery との相互運用性を確保するためのカタログのプライマリ リージョン。米国リージョン (USus-central1 など)または EU リージョン(EUeurope-west4 など)の Cloud Storage バケットの場合は、 US または EU を指定して、カタログにアクセス して対応する BigQuery マルチリージョンからクエリを実行できるようにします。詳細については、バケットとカタログのリージョンをご覧ください。

認証情報ベンディング モード

カタログ管理者は、カタログの作成時または更新時に認証情報ベンディングを有効にします。カタログ ユーザーは、Apache Iceberg REST カタログ エンドポイントを構成するときにアクセス委任を指定することで、スコープが絞り込まれたストレージ 認証情報を返すように Apache Iceberg REST カタログ エンドポイントに指示できます。

自動プロビジョニングされた Lakehouse ランタイム カタログ サービス アカウントには、ターゲット Cloud Storage バケットに対する明示的な Storage オブジェクト ユーザーロール(roles/storage.objectUser)が必要です。デフォルトでは、閲覧者のみのアクセス権で作成されます。 このロールがないと、ベンディングされた認証情報のスコープが不足し、ストレージへの書き込みを実行できません。gcloud や Terraform などのツールを使用する場合は、このロールを手動で付与する必要があります。

コンソール

  1. コンソールで、[Lakehouse] ページを開きます。 Google Cloud

    [Lakehouse] に移動

  2. [Create catalog] をクリックします。[カタログを作成] ページが開きます。

  3. [Cloud Storage バケットを選択] に、カタログで使用する Cloud Storage バケットの名前を入力します。または、[参照] をクリックして、既存のバケットのリストから選択するか、新しいバケットを作成します。Cloud Storage バケットごとに 1 つのカタログのみを使用できます。

  4. [**認証方法**] で [**認証情報ベンディング モード**] を選択します。

  5. [作成] をクリックします。

    カタログが作成され、[カタログの詳細] ページが開きます。

  6. [認証方法] で [バケットの権限を設定] をクリックします。

  7. ダイアログで [確認] をクリックします。

    これにより、カタログのサービス アカウントにストレージ バケットに対するストレージ オブジェクト管理者のロールが付与されていることが確認されます。

gcloud

gcloud biglake iceberg catalogs create コマンドを使用します。

gcloud biglake iceberg catalogs create \
    CATALOG_NAME \
    --project PROJECT_ID \
    --catalog-type gcs-bucket \
    --credential-mode vended-credentials \
    [--primary-location LOCATION]

次のように置き換えます。

  • CATALOG_NAME: カタログの名前。この 名前は、REST カタログで使用される Cloud Storage バケット ID と一致することがよくあります。たとえば、バケットが gs://bucket-idの場合、カタログ名 は bucket-idになります。この名前は、BigQuery からこれらのテーブルにクエリを実行するときに、カタログ 識別子としても使用されます。
  • PROJECT_ID: 実際の Google Cloud プロジェクト ID。
  • LOCATION: (省略可)BigQuery との相互運用性を確保するためのカタログのプライマリ リージョン。米国リージョン(USus-central1 など)または EU リージョン(EUeurope-west4 など)の Cloud Storage バケットの場合は、US または EU を指定して、対応する BigQuery マルチリージョンからカタログにアクセスしてクエリを実行できるようにします。詳細については、バケットとカタログのリージョンをご覧ください。

    カタログを作成したら、ストレージ バケットに対する Storage オブジェクト ユーザー ロール(roles/storage.objectUser)を、カタログの自動プロビジョニングされた Lakehouse ランタイム カタログ サービス アカウントに明示的に付与します。

クライアント アプリケーションを構成する

カタログを作成したら、それを使用するようにクライアント アプリケーションを構成します。次の例では、認証情報ベンディングを使用する場合と使用しない場合の構成方法を示します。

クラスタ

Managed Service for Apache Spark の Apache Iceberg REST カタログ エンドポイントで Spark を使用するには、プロパティを使用して構成を簡素化するか、セッションを手動で構成します。

カタログ プロパティを使用してクラスタを作成します。

gcloud dataproc clusters create CLUSTER_NAME \
    --enable-component-gateway \
    --project=PROJECT_ID \
    --region=REGION \
    --optional-components=ICEBERG \
    --image-version=DATAPROC_VERSION \
    --properties="dataproc:dataproc.lakehouse.catalog.CATALOG_NAME=projects/PROJECT_ID/catalogs/CATALOG_ID"

次のように置き換えます。

  • CLUSTER_NAME: クラスタの名前。
  • PROJECT_ID: 実際の Google Cloud プロジェクト ID。
  • REGION: Managed Service for Apache Spark クラスタ リージョン。
  • DATAPROC_VERSION: Managed Service for Apache Spark イメージ バージョン(2.2 など)。
  • CATALOG_NAME: Spark で使用する Lakehouse カタログの名前。CATALOG_ID と同じにできます。
  • CATALOG_ID: 作成した Lakehouse カタログの ID。

次に、カタログ パラメータを手動で指定せずに Spark セッションを作成します。

from pyspark.sql import SparkSession

spark = SparkSession.builder.appName("APP_NAME").getOrCreate()

手動設定

クラスタ プロパティを使用しない場合は、上記の説明に沿ってクラスタを作成し(--properties フラグなし)、Spark セッションを手動で構成します。

import pyspark
from pyspark.context import SparkContext
from pyspark.sql import SparkSession

catalog_name = "CATALOG_NAME"
spark = SparkSession.builder.appName("APP_NAME") \
  .config(f'spark.sql.catalog.{catalog_name}', 'org.apache.iceberg.spark.SparkCatalog') \
  .config(f'spark.sql.catalog.{catalog_name}.type', 'rest') \
  .config(f'spark.sql.catalog.{catalog_name}.uri', 'https://biglake.googleapis.com/iceberg/REST_API_VERSION/restcatalog') \
  .config(f'spark.sql.catalog.{catalog_name}.warehouse', 'WAREHOUSE_PATH') \
  .config(f'spark.sql.catalog.{catalog_name}.header.x-goog-user-project', 'PROJECT_ID') \
  .config(f'spark.sql.catalog.{catalog_name}.rest.auth.type', 'org.apache.iceberg.gcp.auth.GoogleAuthManager') \
  .config(f'spark.sql.catalog.{catalog_name}.io-impl', 'org.apache.iceberg.gcp.gcs.GCSFileIO') \
  .config('spark.sql.extensions', 'org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions') \
  .config('spark.sql.defaultCatalog', 'CATALOG_NAME') \
  .getOrCreate()

次のように置き換えます。

  • CATALOG_NAME: Apache Iceberg REST カタログ エンドポイントの名前。
  • APP_NAME: Spark セッションの名前。
  • REST_API_VERSION: API の安定版の場合は v1 に設定します。
  • WAREHOUSE_PATH: ウェアハウスへのパス。 gs://CLOUD_STORAGE_BUCKET_NAME を使用します。BigQuery カタログ フェデレーションを使用するには、 BigQuery でカタログ フェデレーションを使用するをご覧ください。
  • PROJECT_ID: Apache Iceberg REST カタログ エンドポイントの使用に対して課金されるプロジェクト。Cloud Storage バケットを所有するプロジェクトとは異なる場合があります。REST API を使用する場合の プロジェクト構成の詳細については、 システム パラメータをご覧ください。

認証情報ベンディングを使用して構成する

認証情報ベンディングを使用するには、認証情報ベンディング モードでカタログを使用し、X-Iceberg-Access-Delegation ヘッダーを Iceberg REST カタログ リクエストに追加して、値が vended-credentialsSparkSession ビルダーに次の行を追加する必要があります。

.config(f'spark.sql.catalog.{catalog_name}.header.X-Iceberg-Access-Delegation','vended-credentials')

認証情報ベンディングの例

次の例では、認証情報ベンディングを使用してクエリエンジンを構成します。

import pyspark
from pyspark.context import SparkContext
from pyspark.sql import SparkSession

catalog_name = "CATALOG_NAME"
spark = SparkSession.builder.appName("APP_NAME") \
  .config(f'spark.sql.catalog.{catalog_name}', 'org.apache.iceberg.spark.SparkCatalog') \
  .config(f'spark.sql.catalog.{catalog_name}.type', 'rest') \
  .config(f'spark.sql.catalog.{catalog_name}.uri', 'https://biglake.googleapis.com/iceberg/REST_API_VERSION/restcatalog') \
  .config(f'spark.sql.catalog.{catalog_name}.warehouse', 'gs://CLOUD_STORAGE_BUCKET_NAME') \
  .config(f'spark.sql.catalog.{catalog_name}.header.x-goog-user-project', 'PROJECT_ID') \
  .config(f'spark.sql.catalog.{catalog_name}.rest.auth.type', 'org.apache.iceberg.gcp.auth.GoogleAuthManager') \
  .config(f'spark.sql.catalog.{catalog_name}.io-impl', 'org.apache.iceberg.gcp.gcs.GCSFileIO') \
  .config(f'spark.sql.catalog.{catalog_name}.header.X-Iceberg-Access-Delegation','vended-credentials') \
  .config('spark.sql.extensions', 'org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions') \
  .config('spark.sql.defaultCatalog', 'CATALOG_NAME') \
  .getOrCreate()

詳細については、Apache Iceberg ドキュメントの ヘッダーRESTCatalogセクションをご覧ください。

Managed Service for Apache Spark クラスタは、次のリリースで Apache Iceberg の Google 認証フローをサポートしています。

  • Compute Engine 2.2 イメージ バージョン 2.2.65 以降の Managed Service for Apache Spark。
  • Compute Engine 2.3 イメージ バージョン 2.3.11 以降の Managed Service for Apache Spark。

サーバーレス

プロパティを使用して構成を簡素化する(推奨)か、すべてのパラメータを指定して、PySpark バッチ ワークロードを Managed Service for Apache Spark に送信します。

カタログ プロパティを使用してバッチジョブを送信します。

gcloud dataproc batches submit pyspark PYSPARK_FILE \
    --project=PROJECT_ID \
    --region=REGION \
    --version=RUNTIME_VERSION \
    --properties="dataproc.lakehouse.catalog.CATALOG_NAME=projects/PROJECT_ID/catalogs/CATALOG_ID"

手動設定

すべてのプロパティを手動で指定する場合は、次の構成を使用します。

gcloud dataproc batches submit pyspark PYSPARK_FILE \
    --project=PROJECT_ID \
    --region=REGION \
    --version=RUNTIME_VERSION \
    --properties="\
    spark.sql.defaultCatalog=CATALOG_NAME,\
    spark.sql.catalog.CATALOG_NAME=org.apache.iceberg.spark.SparkCatalog,\
    spark.sql.catalog.CATALOG_NAME.type=rest,\
    spark.sql.catalog.CATALOG_NAME.uri=https://biglake.googleapis.com/iceberg/REST_API_VERSION/restcatalog,\
    spark.sql.catalog.CATALOG_NAME.warehouse=WAREHOUSE_PATH,\
    spark.sql.catalog.CATALOG_NAME.io-impl=org.apache.iceberg.gcp.gcs.GCSFileIO,\
    spark.sql.catalog.CATALOG_NAME.header.x-goog-user-project=PROJECT_ID,\
    spark.sql.catalog.CATALOG_NAME.rest.auth.type=org.apache.iceberg.gcp.auth.GoogleAuthManager,\
    spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions"

次のように置き換えます。

  • PYSPARK_FILE: PySpark アプリケーション ファイルへの gs:// Cloud Storage パス。
  • PROJECT_ID: 実際の Google Cloud プロジェクト ID。
  • REGION: Managed Service for Apache Spark バッチ ワークロードのリージョン。
  • RUNTIME_VERSION: Managed Service for Apache Spark ランタイム バージョン(2.2 など)。
  • CATALOG_NAME: Apache Iceberg REST カタログ エンドポイントの名前。
  • REST_API_VERSION: API の安定版の場合は v1 に設定します。
  • WAREHOUSE_PATH: ウェアハウスへのパス。 gs://CLOUD_STORAGE_BUCKET_NAME を使用します。BigQuery カタログ連携を使用するには、 BigQuery でカタログ連携を使用するをご覧ください。

認証情報ベンディングを使用して構成する

認証情報ベンディングを使用するには、認証情報ベンディング モードで カタログを使用し、Managed Service for Apache Spark 構成に次の 行を追加して、値がvended-credentialsX-Iceberg-Access-Delegationヘッダーを Apache Iceberg REST カタログ エンドポイント リクエストに追加する必要があります。

.config(f'spark.sql.catalog.{catalog_name}.header.X-Iceberg-Access-Delegation','vended-credentials')

認証情報ベンディングの例

次の例では、認証情報ベンディングを使用してクエリエンジンを構成します。

gcloud dataproc batches submit pyspark PYSPARK_FILE \
    --project=PROJECT_ID \
    --region=REGION \
    --version=RUNTIME_VERSION \
    --properties="\
    spark.sql.defaultCatalog=CATALOG_NAME,\
    spark.sql.catalog.CATALOG_NAME=org.apache.iceberg.spark.SparkCatalog,\
    spark.sql.catalog.CATALOG_NAME.type=rest,\
    spark.sql.catalog.CATALOG_NAME.uri=https://biglake.googleapis.com/iceberg/REST_API_VERSION/restcatalog,\
    spark.sql.catalog.CATALOG_NAME.warehouse=gs://CLOUD_STORAGE_BUCKET_NAME,\
    spark.sql.catalog.CATALOG_NAME.header.x-goog-user-project=PROJECT_ID,\
    spark.sql.catalog.CATALOG_NAME.rest.auth.type=org.apache.iceberg.gcp.auth.GoogleAuthManager,\
    spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions,\
    spark.sql.catalog.CATALOG_NAME.gcs.oauth2.refresh-credentials-endpoint=https://oauth2.googleapis.com/token, \
    spark.sql.catalog.CATALOG_NAME.header.X-Iceberg-Access-Delegation=vended-credentials"

詳細については、Apache Iceberg ドキュメントの セクションのヘッダーをご覧ください。RESTCatalog

Managed Service for Apache Spark は、次のランタイム バージョンで Apache Iceberg の Google 認証フローをサポートしています。

  • Managed Service for Apache Spark 2.2 ランタイム 2.2.60 以降
  • Managed Service for Apache Spark 2.3 ランタイム 2.3.10 以降

Trino

Apache Iceberg REST カタログ エンドポイントで Trino を使用するには、Trino コンポーネントを使用して Managed Service for Apache Spark クラスタを作成し、gcloud dataproc clusters create --properties フラグを使用してカタログ プロパティを構成します。 次の例では、CATALOG_NAME という名前の Trino カタログを作成します。

gcloud dataproc clusters create CLUSTER_NAME \
    --enable-component-gateway \
    --region=REGION \
    --image-version=DATAPROC_VERSION \
    --network=NETWORK_ID \
    --optional-components=TRINO \
    --properties="\
    trino-catalog:CATALOG_NAME.connector.name=iceberg,\
    trino-catalog:CATALOG_NAME.iceberg.catalog.type=rest,\
    trino-catalog:CATALOG_NAME.iceberg.rest-catalog.uri=https://biglake.googleapis.com/iceberg/REST_API_VERSION/restcatalog,\
    trino-catalog:CATALOG_NAME.iceberg.rest-catalog.warehouse=WAREHOUSE_PATH,\
    trino-catalog:CATALOG_NAME.iceberg.rest-catalog.biglake.project-id=PROJECT_ID,\
    trino-catalog:CATALOG_NAME.iceberg.rest-catalog.rest.auth.type=org.apache.iceberg.gcp.auth.GoogleAuthManager"

次のように置き換えます。

  • CLUSTER_NAME: クラスタの名前。
  • REGION: Managed Service for Apache Spark クラスタ リージョン。
  • DATAPROC_VERSION: Managed Service for Apache Spark イメージ バージョン(2.2 など)。
  • NETWORK_ID: クラスタ ネットワーク ID。詳細については、Managed Service for Apache Spark クラスタ ネットワーク構成をご覧ください。
  • CATALOG_NAME: Apache Iceberg REST カタログ エンドポイントを使用する Trino カタログの名前。
  • REST_API_VERSION: API の安定版の場合は v1 に設定します。
  • WAREHOUSE_PATH: ウェアハウスへのパス。 gs://CLOUD_STORAGE_BUCKET_NAME を使用します。
  • PROJECT_ID: Lakehouse ランタイム カタログで使用する実際の Google Cloud プロジェクト ID 。

クラスタを作成したら、メイン VM インスタンスに接続し、Trino CLI を使用します。

trino --catalog=CATALOG_NAME

Managed Service for Apache Spark Trino は、次のリリースで Apache Iceberg の Google 認証フローをサポートしています。

  • Compute Engine 2.2 ランタイム バージョン 2.2.65 以降の Managed Service for Apache Spark。
  • Compute Engine 2.3 ランタイム バージョン 2.3.11 以降の Managed Service for Apache Spark。
  • Compute Engine 3.0 の Managed Service for Apache Spark はサポートされていません。

認証情報ベンディングを使用して構成する

認証情報ベンディングは、Trino バージョン 481 以降でのみサポートされています。

Apache Iceberg 1.10 以降

オープンソースの Apache Iceberg 1.10 以降のリリースには、GoogleAuthManager で Google 認証フローのサポートが組み込まれています。 次の例は、Apache Iceberg REST カタログ エンドポイントを使用するように Spark を構成する方法を示しています。

import pyspark
from pyspark.context import SparkContext
from pyspark.sql import SparkSession

catalog_name = "CATALOG_NAME"
spark = SparkSession.builder.appName("APP_NAME") \
  .config(f'spark.sql.catalog.{catalog_name}', 'org.apache.iceberg.spark.SparkCatalog') \
  .config(f'spark.sql.catalog.{catalog_name}.type', 'rest') \
  .config(f'spark.sql.catalog.{catalog_name}.uri', 'https://biglake.googleapis.com/iceberg/REST_API_VERSION/restcatalog') \
  .config(f'spark.sql.catalog.{catalog_name}.warehouse', 'WAREHOUSE_PATH') \
  .config(f'spark.sql.catalog.{catalog_name}.header.x-goog-user-project', 'PROJECT_ID') \
  .config(f'spark.sql.catalog.{catalog_name}.rest.auth.type', 'org.apache.iceberg.gcp.auth.GoogleAuthManager') \
  .config(f'spark.sql.catalog.{catalog_name}.io-impl', 'org.apache.iceberg.gcp.gcs.GCSFileIO') \
  .config('spark.sql.extensions', 'org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions') \
  .config('spark.sql.defaultCatalog', 'CATALOG_NAME') \
  .getOrCreate()

次のように置き換えます。

  • CATALOG_NAME: Apache Iceberg REST カタログ エンドポイントの名前。
  • APP_NAME: Spark セッションの名前。
  • REST_API_VERSION: API の安定版の場合は v1 に設定します。
  • WAREHOUSE_PATH: ウェアハウスへのパス。 gs://CLOUD_STORAGE_BUCKET_NAME を使用します。BigQuery カタログ連携を使用するには、 BigQuery でカタログ連携を使用するをご覧ください。
  • PROJECT_ID: Apache Iceberg REST カタログ エンドポイントの使用に対して課金されるプロジェクト。Cloud Storage バケットを所有するプロジェクトとは異なる場合があります。REST API を使用する場合の プロジェクト構成の詳細については、 システム パラメータをご覧ください。

認証情報ベンディングを使用して構成する

上記の例では、認証情報ベンディングは使用されていません。認証情報ベンディングを使用するには、認証情報ベンディング モードでカタログを使用し、`SparkSession` ビルダーに次の行を追加して、値が `vended-credentials` の `X-Iceberg-Access-Delegation` ヘッダーを Apache Iceberg REST カタログ エンドポイント リクエストに追加する必要があります。X-Iceberg-Access-Delegationvended-credentialsSparkSession

.config(f'spark.sql.catalog.{catalog_name}.header.X-Iceberg-Access-Delegation','vended-credentials')

認証情報ベンディングの例

次の例では、認証情報ベンディングを使用してクエリエンジンを構成します。

import pyspark
from pyspark.context import SparkContext
from pyspark.sql import SparkSession

catalog_name = "CATALOG_NAME"
spark = SparkSession.builder.appName("APP_NAME") \
  .config(f'spark.sql.catalog.{catalog_name}', 'org.apache.iceberg.spark.SparkCatalog') \
  .config(f'spark.sql.catalog.{catalog_name}.type', 'rest') \
  .config(f'spark.sql.catalog.{catalog_name}.uri', 'https://biglake.googleapis.com/iceberg/REST_API_VERSION/restcatalog') \
  .config(f'spark.sql.catalog.{catalog_name}.warehouse', 'gs://CLOUD_STORAGE_BUCKET_NAME') \
  .config(f'spark.sql.catalog.{catalog_name}.header.x-goog-user-project', 'PROJECT_ID') \
  .config(f'spark.sql.catalog.{catalog_name}.rest.auth.type', 'org.apache.iceberg.gcp.auth.GoogleAuthManager') \
  .config(f'spark.sql.catalog.{catalog_name}.io-impl', 'org.apache.iceberg.gcp.gcs.GCSFileIO') \
  .config(f'spark.sql.catalog.{catalog_name}.header.X-Iceberg-Access-Delegation','vended-credentials') \
  .config('spark.sql.extensions', 'org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions') \
  .config('spark.sql.defaultCatalog', 'CATALOG_NAME') \
  .getOrCreate()

詳細については、Apache Iceberg ドキュメントの セクションのヘッダーをご覧ください。RESTCatalog

以前の Apache Iceberg リリース

1.10 より前のオープンソース Apache Iceberg リリースでは、次のセッションを構成して標準の OAuth 認証を構成できます。

import pyspark
from pyspark.context import SparkContext
from pyspark.sql import SparkSession

catalog_name = "CATALOG_NAME"
spark = SparkSession.builder.appName("APP_NAME") \
  .config('spark.jars.packages', 'org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.9.1,org.apache.iceberg:iceberg-gcp-bundle:1.9.1') \
  .config(f'spark.sql.catalog.{catalog_name}', 'org.apache.iceberg.spark.SparkCatalog') \
  .config(f'spark.sql.catalog.{catalog_name}.type', 'rest') \
  .config(f'spark.sql.catalog.{catalog_name}.uri', 'https://biglake.googleapis.com/iceberg/REST_API_VERSION/restcatalog') \
  .config(f'spark.sql.catalog.{catalog_name}.warehouse', 'WAREHOUSE_PATH') \
  .config(f'spark.sql.catalog.{catalog_name}.header.x-goog-user-project', 'PROJECT_ID') \
  .config(f"spark.sql.catalog.{catalog_name}.token", "TOKEN") \
  .config(f"spark.sql.catalog.{catalog_name}.oauth2-server-uri", "https://oauth2.googleapis.com/token") \
  .config(f'spark.sql.catalog.{catalog_name}.io-impl', 'org.apache.iceberg.gcp.gcs.GCSFileIO') \
  .config('spark.sql.extensions', 'org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions') \
  .config('spark.sql.defaultCatalog', 'CATALOG_NAME') \
  .getOrCreate()

次のように置き換えます。

  • CATALOG_NAME: Apache Iceberg REST カタログ エンドポイントの名前。
  • APP_NAME: Spark セッションの名前。
  • REST_API_VERSION: API の安定版の場合は v1 に設定します。
  • WAREHOUSE_PATH: ウェアハウスへのパス。 gs://CLOUD_STORAGE_BUCKET_NAME を使用します。BigQuery カタログ フェデレーションを使用するには、 BigQuery でカタログ フェデレーションを使用するをご覧ください。
  • PROJECT_ID: Apache Iceberg REST カタログ エンドポイントの使用に対して課金されるプロジェクト。Cloud Storage バケットを所有するプロジェクトとは異なる場合があります。REST API を使用する場合の プロジェクト構成の詳細については、 システム パラメータをご覧ください。
  • TOKEN: 認証トークン。有効期間は 1 時間です。たとえば、gcloud auth application-default print-access-token を使用して生成されたトークンです。

認証情報ベンディングを使用して構成する

上記の例では、認証情報ベンディングは使用されていません。認証情報ベンディングを使用するには、認証情報ベンディング モードでカタログを使用し、`SparkSession` ビルダーに次の行を追加して、値が `vended-credentials` の `X-Iceberg-Access-Delegation` ヘッダーを Apache Iceberg REST カタログ エンドポイント リクエストに追加する必要があります。X-Iceberg-Access-Delegationvended-credentialsSparkSession

.config(f'spark.sql.catalog.{catalog_name}.header.X-Iceberg-Access-Delegation','vended-credentials')

認証情報ベンディングの例

次の例では、認証情報ベンディングを使用してクエリエンジンを構成します。

import pyspark
from pyspark.context import SparkContext
from pyspark.sql import SparkSession

catalog_name = "CATALOG_NAME"
spark = SparkSession.builder.appName("APP_NAME") \
  .config(f'spark.sql.catalog.{catalog_name}', 'org.apache.iceberg.spark.SparkCatalog') \
  .config(f'spark.sql.catalog.{catalog_name}.type', 'rest') \
  .config(f'spark.sql.catalog.{catalog_name}.uri', 'https://biglake.googleapis.com/iceberg/REST_API_VERSION/restcatalog') \
  .config(f'spark.sql.catalog.{catalog_name}.warehouse', 'gs://CLOUD_STORAGE_BUCKET_NAME') \
  .config(f'spark.sql.catalog.{catalog_name}.header.x-goog-user-project', 'PROJECT_ID') \
  .config(f"spark.sql.catalog.{catalog_name}.token", "TOKEN") \
  .config(f"spark.sql.catalog.{catalog_name}.oauth2-server-uri", "https://oauth2.googleapis.com/token") \
  .config(f'spark.sql.catalog.{catalog_name}.io-impl', 'org.apache.iceberg.gcp.gcs.GCSFileIO') \
  .config(f'spark.sql.catalog.{catalog_name}.header.X-Iceberg-Access-Delegation','vended-credentials') \
  .config('spark.sql.extensions', 'org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions') \
  .config('spark.sql.defaultCatalog', 'CATALOG_NAME') \
  .getOrCreate()

詳細については、Apache Iceberg ドキュメントの セクションのヘッダーをご覧ください。RESTCatalog

Namespace またはスキーマを作成する

クライアントを構成したら、テーブルを整理するための Namespace またはスキーマを作成します。Namespace またはスキーマを作成する構文は、クエリエンジンによって異なります。次の例では、Spark と Trino を使用して作成する方法を示します。

コンソール

  1. コンソールで、[Lakehouse] に移動します。 Google Cloud

    [Lakehouse] に移動

  2. 既存のカタログを選択するか、カタログがない場合は作成します。

  3. メニューバーで、[+ Namespace を作成] をクリックします。

  4. [**Namespace 名**] に、Namespace の一意の名前を入力します。

  5. [**ロケーション**] で、 Namespace に関連付ける Cloud Storage バケットを選択します。

  6. [作成] をクリックします。

Spark

Cloud Storage ウェアハウス

spark.sql("CREATE NAMESPACE IF NOT EXISTS NAMESPACE_NAME;")
spark.sql("USE NAMESPACE_NAME;")

NAMESPACE_NAME は、Namespace の名前に置き換えます。

Trino

Cloud Storage ウェアハウス

CREATE SCHEMA IF NOT EXISTS  CATALOG_NAME.SCHEMA_NAME;
USE CATALOG_NAME.SCHEMA_NAME;

次のように置き換えます。

  • CATALOG_NAME: Apache Iceberg REST カタログ エンドポイントを使用する Trino カタログの名前。
  • SCHEMA_NAME: スキーマの名前。

次のステップ