Apache Iceberg REST カタログ エンドポイントを介して BigQuery テーブルにクエリを実行する

Lakehouse は、Apache Iceberg REST カタログ エンドポイントを介して BigQuery カタログにリクエストをルーティングすることで、BigQuery との相互運用性を提供します。この機能により、BigQuery で管理されているテーブル(Iceberg マネージド テーブルなど)を、Apache Spark や Trino などの外部オープンソース(OSS)エンジンに公開できます。

メタデータを保存するための専用の Lakehouse カタログ コンテナを作成する代わりに、Apache Iceberg REST カタログ エンドポイントは純粋にプロキシ ゲートウェイとして機能します。外部エンジンが bq:// ウェアハウス接頭辞を使用して接続すると、ゲートウェイはカタログ リクエストを BigQuery の内部カタログに直接ルーティングします。これにより、標準の BigQuery DDL または API を使用して BigQuery 内で直接テーブルを作成および管理できます。また、外部 OSS エンジンに読み取り専用アクセス権を付与して、REST カタログ エンドポイントを介してそれらのテーブルにクエリを実行できます。

REST カタログ エンドポイントを介して BigQuery テーブルをクエリする仕組み

リクエストを BigQuery カタログにルーティングすると、Lakehouse ランタイム カタログの Apache Iceberg REST カタログ エンドポイントを介して、Iceberg マネージド テーブルや BigQuery metastore テーブルなどの BigQuery テーブルを公開できます。

ワークフローは次のように動作します。

  1. BigQuery カタログにテーブルを作成する: DDL ステートメントを使用して、BigQuery に Iceberg マネージド テーブルを作成します。このテーブルは BigQuery カタログに存在し、BigQuery アクセス制御リスト(ACL)に則って管理され、BigQuery REST リソースとして機能します。
  2. Lakehouse ランタイム カタログから BigQuery ウェアハウスに連携する: Lakehouse ランタイム カタログの Apache Iceberg REST API を使用して、bq://projects/PROJECT_ID ウェアハウス パス形式(またはリージョン バージョン bq://projects/PROJECT_ID/locations/LOCATION)で指定されたウェアハウスに連携します。これにより、Apache Iceberg REST Catalog API を介して、Apache Spark などの Compute Engine から BigQuery テーブルにアクセスできます。この構成では、Spark からは読み取り専用のエクスペリエンス、BigQuery からは読み取り / 書き込みのエクスペリエンスが得られます。

考慮事項

  • BigQuery カタログにリクエストをルーティングしても、専用の Lakehouse カタログ リソースは作成されません。そのため、リソース階層、バケットとカタログのリージョン、4 つの部分からなる P.C.N.T 命名構造など、他のカタログレベルのコンセプトと構成は、この方法には適用されません。基盤となる API では、これは CATALOG_TYPE_BIGQUERY 構成に対応します。ストレージ アクセスの委任(認証情報の自動販売)は、連携 BigQuery カタログではサポートされていません。

  • REST カタログ エンドポイントを介して BigQuery テーブルを公開することは、ボーダーレス Lakehouse のクロス クラウド データアクセス機能とは異なります。このワークフローでは Google Cloud テーブルが外部 OSS エンジンに公開されますが、Lakehouse は Google Cloud を Databricks Unity Catalog などのリモート外部カタログに接続し、データを移行することなく、他のクラウド プロバイダに保存されているデータを BigQuery や OSS エンジンから直接クエリします。このワークフローの詳細については、クロスクラウド データアクセスについてをご覧ください。

Apache Iceberg REST カタログ エンドポイントで管理されるテーブルとの比較

REST カタログ エンドポイントを介して BigQuery テーブルを公開することは、Lakehouse ランタイム カタログが Apache Iceberg REST カタログ エンドポイントを使用するワークフローとは次の点で異なります。

  • リソース管理とカタログ ストレージ: 連携テーブルは BigQuery REST リソースとして BigQuery カタログに存在し、Lakehouse ランタイム カタログはプロキシ ゲートウェイとして機能します。Lakehouse ランタイム カタログが Apache Iceberg REST カタログ エンドポイントを使用する場合、テーブルは Lakehouse REST リソースとしてカタログ内に直接保存されます。
  • アクセス制御: 連携テーブルでは、BigQuery IAM 権限とアクセス制御リスト(ACL)が使用されます。Lakehouse ランタイム カタログが Apache Iceberg REST カタログ エンドポイントを使用する場合、テーブルは Lakehouse ACL を使用します。
  • エンジンの読み取り / 書き込み機能: 連携テーブルは、BigQuery を介した読み取り / 書き込みアクセスを提供しますが、Spark などの外部エンジンからの読み取り専用アクセスを提供します。Lakehouse ランタイム カタログが Apache Iceberg REST カタログ エンドポイントを使用する場合、テーブルは BigQuery API と Spark などの外部エンジンの両方からの読み取り / 書き込みオペレーションをサポートします。

始める前に

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

  2. BigLake API を有効にします(有効になっていない場合)。

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

    API を有効にするには、serviceusage.services.enable 権限が必要です。プロジェクトを作成した場合は、オーナーロール(roles/owner)を介してこの権限がすでに付与されている可能性があります。それ以外の場合は、Service Usage 管理者ロール(roles/serviceusage.serviceUsageAdmin)を介してこの権限を取得できます。ロールを付与する方法を確認する。

    API の有効化

必要なロール

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

  • カタログ リソースを読み取り、テーブルデータをクエリする:
  • データ操作言語(DML)オペレーションを実行する。
    • プロジェクトに対する BigQuery データ編集者 (roles/bigquery.dataEditor)
    • Cloud Storage バケットに対するストレージ管理者 (roles/storage.admin)。Managed Service for Apache Spark などのクエリエンジンを使用して DML オペレーションを実行する場合は、そのエンジンでジョブを実行するために使用するサービス アカウントにこれらのロールを付与します。

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

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

BigQuery ウェアハウス用にクライアントを構成する

BigQuery ウェアハウスに接続するには、クライアント アプリケーションを構成するのクライアント構成例の WAREHOUSE_PATH フィールドで、bq://projects/PROJECT_ID ウェアハウス形式を使用してクライアント(Apache Spark や Trino など)を構成します。

BigQuery のロケーションを含めて、今後のリクエストを bq://projects/PROJECT_ID/locations/LOCATION 形式を使用して単一のロケーションに制限することもできます。

これらのリソースは BigQuery によって管理されるため、該当する必要な権限が必要です。

連携テーブルの名前空間を作成する

クライアントを構成したら、テーブルの名前空間を作成できます。

Spark

BigQuery ウェアハウスに名前空間を作成するには、LOCATION 句と DBPROPERTIES 句を含めます。

spark.sql("CREATE NAMESPACE IF NOT EXISTS NAMESPACE_NAME LOCATION 'gs://BUCKET_NAME/NAMESPACE_NAME' WITH DBPROPERTIES ('gcp-region' = 'LOCATION');")
spark.sql("USE NAMESPACE_NAME;")

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

  • NAMESPACE_NAME: 名前空間の名前。
  • BUCKET_NAME: カタログで使用している Cloud Storage バケット。
  • LOCATION: BigQuery のロケーション。デフォルト値は US マルチリージョンです。

Trino

BigQuery ウェアハウスにスキーマを作成するには、LOCATION プロパティと gcp-region プロパティを含めます。

CREATE SCHEMA IF NOT EXISTS  CATALOG_NAME.SCHEMA_NAME WITH ( LOCATION = 'gs://BUCKET_NAME/SCHEMA_NAME', "gcp-region" = 'LOCATION');
USE CATALOG_NAME.SCHEMA_NAME;

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

  • CATALOG_NAME: Apache Iceberg REST カタログ エンドポイントを使用する Trino カタログの名前。
  • SCHEMA_NAME: スキーマの名前。
  • BUCKET_NAME: カタログで使用している Cloud Storage バケット。
  • LOCATION: BigQuery のロケーション。デフォルト値は US マルチリージョンです。

BigQuery で連携テーブルに対してクエリを実行する

連携カタログで作成したテーブルは BigQuery に表示され、標準の BigQuery SQL を使用して直接クエリできます(4 つの部分からなる P.C.N.T 名は必要ありません)。

SELECT * FROM `NAMESPACE_NAME.TABLE_NAME`;

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

  • NAMESPACE_NAME: 名前空間の名前。
  • TABLE_NAME: テーブルの名前。

次のステップ