Apache Iceberg マネージド テーブル
Apache Iceberg マネージド テーブル(以前の BigQuery 内の Apache Iceberg 用 BigLake テーブル)は、 Google Cloudでオープン形式のレイクハウスを構築するための基盤になります。Iceberg マネージド テーブルは、標準の BigQuery テーブルと同じフルマネージド エクスペリエンスを提供しますが、お客様所有のストレージ バケットにデータを保存します。Iceberg マネージド テーブルは、オープン Iceberg テーブル形式をサポートしているため、データの単一コピーでオープンソースとサードパーティのコンピューティング エンジンとの相互運用性が向上します。
Iceberg マネージド テーブルは、次の機能をサポートしています。
- テーブル ミューテーション: GoogleSQL データ操作言語(DML)を使用します。
- 統合されたバッチ処理と高スループット ストリーミング: Spark、Dataflow、その他のエンジンなどのコネクタを介して BigQuery Storage Write API(gRPC)を使用します。
- Iceberg V2 スナップショットのエクスポートと自動更新。Spark などのオープンソースとサードパーティのクエリエンジンを使用して直接クエリにアクセスするための各テーブル ミューテーション。
- スキーマの進化: ニーズに合わせて列の追加、削除、名前の変更が可能です。この機能を使用すると、既存の列のデータ型とモードを変更することもできます。詳細については、変換ルールをご覧ください。
- ストレージの自動最適化: 適応型ファイルサイズ設定、自動クラスタリング、ガベージ コレクション、メタデータの最適化などが含まれます。
- BigQuery での過去のデータアクセス用のタイムトラベル。
- 列レベルのセキュリティとデータ マスキング。
- マルチステートメント トランザクション。
- テーブルのパーティショニング。
- Dataform ワークフローでのテーブル作成。
- BigQuery の高度なランタイム。
- BigQuery Storage Write API(gRPC)を使用したストリーミング。
アーキテクチャ
Iceberg マネージド テーブルを使用すると、独自のクラウド バケットに存在するテーブルで、BigQuery リソース管理の利便性を享受できます。これらのテーブルでは、管理するバケットからデータを移動することなく、BigQuery とオープンソースのコンピューティング エンジンを使用できます。Iceberg マネージド テーブルの使用を開始する前に、Cloud Storage バケットを構成する必要があります。
Iceberg マネージド テーブルを使用すると、バケットに次のような影響があります。
- BigQuery は、書き込みリクエストやバックグラウンドのストレージ最適化(DML ステートメントやストリーミングなど)に応じて、バケットに新しいデータファイルを作成します。
- バケット内のデータファイルに対して自動圧縮とクラスタリングが実行されます。タイムトラベル ウィンドウの有効期限が切れると、データファイルはガベージ コレクションされます。ただし、テーブルが削除されると、関連付けられたデータファイルはガベージ コレクションされません。詳細については、ストレージの最適化をご覧ください。
Iceberg マネージド テーブルの作成は、BigQuery テーブルの作成と似ています。データをオープン形式で Cloud Storage に保存するため、次の操作を行う必要があります。
WITH CONNECTIONを使用して Cloud リソース接続を指定し、BigQuery が Cloud Storage にアクセスするための接続認証情報を構成します。file_format = PARQUETステートメントを使用して、データ ストレージのファイル形式をPARQUETとして指定します。table_format = ICEBERGステートメントを使用して、オープンソースのメタデータ テーブル形式をICEBERGとして指定します。
ベスト プラクティス
BigQuery の外部でバケットのファイルを直接変更または追加すると、データ損失や回復不能エラーが発生する可能性があります。次の表に、考えられるシナリオを示します。
| 操作 | 結果 | 予防策 |
|---|---|---|
| BigQuery の外部にあるバケットに新しいファイルを追加する。 | データ損失: BigQuery の外部で追加された新しいファイルやオブジェクトは、BigQuery によって追跡されません。追跡されないファイルは、バックグラウンドのガベージ コレクション プロセスによって削除されます。 | データの追加を常に BigQuery を介して行うと、BigQuery によってファイルが追跡され、ガベージ コレクションを防止できます。 誤って追加されることやデータが失われることがないように、Iceberg マネージド テーブルを含むバケットに対して、外部ツールの書き込み権限を制限することもおすすめします。 |
| 空でない接頭辞に新しい Iceberg マネージド テーブルを作成する。 | データ損失: 既存のデータは BigQuery によって追跡されないため、これらのファイルは追跡対象外とみなされ、バックグラウンドのガベージ コレクション プロセスによって削除されます。 | 空の接頭辞にのみ新しい Iceberg マネージド テーブルを作成します。 |
| Iceberg マネージド テーブルのデータファイルを変更または置換する。 | データ損失: 外部で変更または置換を行うと、テーブルの整合性チェックが失敗して読み取り不能になり、テーブルに対するクエリが失敗します。 この状態からセルフサービスで復元する方法はありません。データ復元のサポートが必要な場合は、サポートにご連絡ください。 |
データの変更を常に BigQuery を介して行うと、BigQuery によってファイルが追跡され、ガベージ コレクションを防止できます。 誤って追加されることやデータが失われることがないように、Iceberg マネージド テーブルを含むバケットに対して、外部ツールの書き込み権限を制限することもおすすめします。 |
| 同じ、または重複する URI に Iceberg マネージド テーブルを 2 つ作成する。 | データ損失: BigQuery は、Iceberg マネージド テーブルの同じ URI インスタンスをブリッジしません。各テーブルのバックグラウンドのガベージ コレクション プロセスは、もう一方のテーブルにあるファイルを追跡対象外とみなして削除するため、データ損失が発生します。 | Iceberg マネージド テーブルごとに一意の URI を使用します。 |
Cloud Storage バケットの構成に関するベスト プラクティス
Cloud Storage バケットの構成と BigQuery との接続は、Iceberg マネージド テーブルのパフォーマンス、費用、データの整合性、セキュリティ、ガバナンスに直接影響します。この構成に役立つベスト プラクティスは次のとおりです。
バケットが Iceberg マネージド テーブル専用であることを明確に示す名前を選択します。
BigQuery データセットと同じリージョンに配置されている単一リージョン Cloud Storage バケットを選択します。この調整により、データ転送料金を回避できるため、パフォーマンスが向上し、費用が削減されます。
デフォルトでは、Cloud Storage はデータを Standard ストレージ クラスに保存します。このクラスは十分なパフォーマンスを提供します。データ ストレージ費用を最適化するには、Autoclass を有効にして、ストレージ クラスの移行を自動的に管理します。Autoclass は Standard Storage クラスから始まり、アクセスされないオブジェクトをよりコールドなクラスに移動して、ストレージ費用を削減します。オブジェクトが再度読み取られると、Standard クラスに戻ります。
均一なバケットレベルのアクセスと公開アクセスの防止を有効にします。
必要なロールが適切なユーザーとサービス アカウントに割り当てられていることを確認します。
Cloud Storage バケット内のデータの誤った削除や破損を防ぐには、組織内のほとんどのユーザーの書き込み権限と削除権限を制限します。これを行うには、指定したユーザーを除くすべてのユーザーに対して
PUTリクエストとDELETEリクエストを拒否する条件で、バケット権限ポリシーを設定します。運用の透明性、トラブルシューティング、データアクセスのモニタリングのために、監査ロギングを有効にします。
誤って削除された場合に備えて、デフォルトの削除(復元可能)ポリシー(7 日間の保持)を維持します。ただし、データが削除された場合は、オブジェクトを手動で復元するのではなく、サポートにお問い合わせください。BigQuery の外部で追加または変更されたオブジェクトは、BigQuery メタデータで追跡されません。
適応型ファイルサイズ設定、自動クラスタリング、ガベージ コレクションは自動的に有効になり、ファイル パフォーマンスと費用の最適化に役立ちます。
Iceberg マネージド テーブルではサポートされていないため、次の Cloud Storage 機能は使用しないでください。
- オブジェクト アクセス制御リスト(ACL)
- 顧客指定の暗号鍵
- オブジェクトのバージョニング
- オブジェクト ロック
- バケットロック
- BigQuery API または bq CLI を使用して削除済み(復元可能)オブジェクトを復元する
これらのベスト プラクティスを実装するには、次のコマンドを使用してバケットを作成します。
gcloud storage buckets create gs://BUCKET_NAME \ --project=PROJECT_ID \ --location=LOCATION \ --enable-autoclass \ --public-access-prevention \ --uniform-bucket-level-access
次のように置き換えます。
BUCKET_NAME: 新しいバケットの名前PROJECT_ID: オブジェクトの IDLOCATION: 新しいバケットのロケーション
Iceberg マネージド テーブルのワークフロー
次のセクションでは、Iceberg マネージド テーブルの作成、読み込み、管理、クエリの方法について説明します。
始める前に
Iceberg マネージド テーブルを作成して使用する前に、ストレージ バケットへの Cloud リソース接続が設定されていることを確認してください。次の必要なロール セクションで指定されているように、接続にはストレージ バケットへの書き込み権限が必要です。接続に必要なロールと権限の詳細については、接続を管理するをご覧ください。
必要なロール
プロジェクト内のテーブルを BigQuery が管理できるようにするために必要な権限を取得するには、次の IAM ロールの付与を管理者に依頼してください。
-
Iceberg マネージド テーブルを作成するには:
- プロジェクトに対する BigQuery データオーナー(
roles/bigquery.dataOwner) - プロジェクトに対する BigQuery Connection 管理者(
roles/bigquery.connectionAdmin)
- プロジェクトに対する BigQuery データオーナー(
-
Iceberg マネージド テーブルをクエリするには:
- プロジェクトに対する BigQuery データ閲覧者(
roles/bigquery.dataViewer) - プロジェクトに対する BigQuery ユーザー(
roles/bigquery.user)
- プロジェクトに対する BigQuery データ閲覧者(
-
Cloud Storage でのデータの読み取りと書き込みを接続サービス アカウントで行えるように、次のロールを付与します。
- バケットに対するStorage オブジェクト ユーザー (
roles/storage.objectUser) - バケットに対する Storage レガシー バケット読み取り(
roles/storage.legacyBucketReader)
- バケットに対するStorage オブジェクト ユーザー (
ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。
これらの事前定義ロールには、プロジェクト内のテーブルの BigQuery による管理を許可するために必要な権限が含まれています。必要とされる正確な権限については、「必要な権限」セクションを開いてご確認ください。
必要な権限
プロジェクト内のテーブルの BigQuery による管理を許可するには、次の権限が必要です。
-
すべて:
- プロジェクトに対する
bigquery.connections.delegate - プロジェクトに対する
bigquery.jobs.create - プロジェクトに対する
bigquery.readsessions.create - プロジェクトに対する
bigquery.tables.create - プロジェクトに対する
bigquery.tables.get - プロジェクトに対する
bigquery.tables.getData -
バケットに対する
storage.buckets.get -
バケットに対する
storage.objects.create -
バケットに対する
storage.objects.delete -
バケットに対する
storage.objects.get -
バケットに対する
storage.objects.list
- プロジェクトに対する
カスタムロールや他の事前定義ロールを使用して、これらの権限を取得することもできます。
Iceberg マネージド テーブルを作成する
Iceberg マネージド テーブルを作成するには、次のいずれかの方法を選択します。
SQL
CREATE TABLE [PROJECT_ID.]DATASET_ID.TABLE_NAME ( COLUMN DATA_TYPE[, ...] ) CLUSTER BY CLUSTER_COLUMN_LIST WITH CONNECTION {CONNECTION_NAME | DEFAULT} OPTIONS ( file_format = 'PARQUET', table_format = 'ICEBERG', storage_uri = 'STORAGE_URI');
次のように置き換えます。
- PROJECT_ID: データセットを含むプロジェクト。未定義の場合、コマンドはデフォルトのプロジェクトを想定します。
- DATASET_ID: 既存のデータセット。
- TABLE_NAME: 作成するテーブルの名前。
- DATA_TYPE: 列に含まれる情報のデータ型。
- CLUSTER_COLUMN_LIST(省略可): 最大 4 つの列を含むカンマ区切りリスト。最上位の非繰り返し列である必要があります。
- CONNECTION_NAME: 接続の名前。例:
myproject.us.myconnectionデフォルトの接続を使用するには、接続名の代わりにDEFAULTを指定します。 - STORAGE_URI: 完全修飾の Cloud Storage URI。例:
gs://mybucket/table
bq
bq --project_id=PROJECT_ID mk \ --table \ --file_format=PARQUET \ --table_format=ICEBERG \ --connection_id=CONNECTION_NAME \ --storage_uri=STORAGE_URI \ --schema=COLUMN_NAME:DATA_TYPE[, ...] \ --clustering_fields=CLUSTER_COLUMN_LIST \ DATASET_ID.MANAGED_TABLE_NAME
次のように置き換えます。
- PROJECT_ID: データセットを含むプロジェクト。未定義の場合、コマンドはデフォルトのプロジェクトを想定します。
- CONNECTION_NAME: 接続の名前。例:
myproject.us.myconnection - STORAGE_URI: 完全修飾の Cloud Storage URI。例:
gs://mybucket/table - COLUMN_NAME: 列の名前。
- DATA_TYPE: 列に含まれる情報のデータ型。
- CLUSTER_COLUMN_LIST(省略可): 最大 4 つの列を含むカンマ区切りリスト。最上位の非繰り返し列である必要があります。
- DATASET_ID: 既存のデータセットの ID。
- MANAGED_TABLE_NAME: 作成するテーブルの名前。
API
次のように、定義済みのテーブル リソースを使用して tables.insert メソッドを呼び出します。
{ "tableReference": { "tableId": "TABLE_NAME" }, "biglakeConfiguration": { "connectionId": "CONNECTION_NAME", "fileFormat": "PARQUET", "tableFormat": "ICEBERG", "storageUri": "STORAGE_URI" }, "schema": { "fields": [ { "name": "COLUMN_NAME", "type": "DATA_TYPE" } [, ...] ] } }
次のように置き換えます。
- TABLE_NAME: 作成するテーブルの名前。
- CONNECTION_NAME: 接続の名前。例:
myproject.us.myconnection - STORAGE_URI: 完全修飾の Cloud Storage URI。ワイルドカードもサポートされています。例:
gs://mybucket/table - COLUMN_NAME: 列の名前。
- DATA_TYPE: 列に含まれる情報のデータ型。
Iceberg マネージド テーブルにデータをインポートする
次のセクションでは、さまざまなテーブル形式から Iceberg マネージド テーブルにデータをインポートする方法について説明します。
フラット ファイルからのデータの標準読み込み
Iceberg マネージド テーブルは、BigQuery 読み込みジョブを使用して外部ファイルを Iceberg マネージド テーブルに読み込みます。既存の Iceberg マネージド テーブルがある場合は、bq load CLI ガイドまたは LOAD SQL ガイドに沿って外部データを読み込みます。データの読み込み後、新しい Parquet ファイルが