カタログ連携を使用して BigQuery をクエリする

Lakehouse は、BigQuery カタログ フェデレーション と呼ばれる機能を通じて BigQuery との相互運用性を提供します。この機能を使用すると、BigQuery で管理されているテーブル(Iceberg マネージド テーブルなど)を、Apache Spark や Trino などの外部オープンソース(OSS)エンジンに公開できます。

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

BigQuery カタログ フェデレーションの仕組み

BigQuery カタログ フェデレーションを使用すると、Iceberg マネージド テーブルや BigQuery metastore テーブルなどの BigQuery テーブルを、Lakehouse ランタイム カタログの Apache Iceberg REST カタログのエンドポイントを介して公開できます。

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)で指定されたウェアハウスにフェデレーションします。これにより、Lakehouse API を介して Apache Spark などのコンピューティング エンジンから BigQuery テーブルにアクセスできます。この構成では、Spark からは読み取り専用のエクスペリエンスが得られますが、BigQuery からは読み取り / 書き込みのエクスペリエンスが得られます。

考慮事項

  • BigQuery カタログ フェデレーションでは専用の Lakehouse カタログ リソースが作成されないため、リソース階層、バケットとカタログのリージョン、4 部構成の P.C.N.T 命名構造など、他のカタログレベルのコンセプトと構成はこの方法には適用されません。基盤となる API では、これは CATALOG_TYPE_BIGQUERY 構成に対応します。フェデレーション BigQuery カタログでは、ストレージ アクセス委任(認証情報の提供)はサポートされていません。

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

Apache Iceberg 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 の有効化

必要なロール

BigQuery でカタログ フェデレーションを使用するために必要な権限を取得するには、次の IAM ロールを付与するよう管理者に依頼してください。

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

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

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

BigQuery カタログ フェデレーションを設定する

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

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

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

フェデレーション テーブルの名前空間を作成する

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: テーブルの名前。

次のステップ