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

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

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

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

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

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 用 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 エンジンから他のクラウド プロバイダに保存されているデータに直接クエリを実行します。このワークフローの詳細については、クロスクラウド Lakehouse についてをご覧ください。

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

BigQuery カタログ フェデレーションは、Lakehouse ランタイム カタログが Apache Iceberg REST カタログ エンドポイントを使用するワークフローとは次の点で異なります。

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

始める前に

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

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

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

    API を有効にするには、serviceusage.services.enable 権限を含む Service Usage 管理者 IAM ロール(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 カタログ フェデレーションを有効にするには、クライアント アプリケーションを構成するのクライアント構成例の WAREHOUSE_PATH フィールドで、bq://projects/PROJECT_ID ウェアハウス形式を使用してクライアント(Apache Spark や Trino など)を構成します。

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

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

連携テーブルの Namespace を作成する

BigQuery カタログ連携用にクライアントを構成したら、連携テーブルの Namespace を作成できます。

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

次のステップ