Apache Iceberg マネージド テーブル

Apache Iceberg マネージド テーブル(以前の BigQuery 内の Apache Iceberg 用 BigLake テーブル)は、 Google Cloudでオープン形式のレイクハウスを構築するための基盤になります。Iceberg マネージド テーブルは、標準の BigQuery テーブルと同じフルマネージド エクスペリエンスを提供しますが、お客様所有のストレージ バケットにデータを保存します。Iceberg マネージド テーブルは、オープン Iceberg テーブル形式をサポートしているため、データの単一コピーでオープンソースとサードパーティのコンピューティング エンジンとの相互運用性が向上します。

Iceberg マネージド テーブルは、次の機能をサポートしています。

アーキテクチャ

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 リクエストを拒否する条件で、バケット権限ポリシーを設定します。

  • 機密データをさらに保護するために、Google 管理または顧客管理の暗号鍵を適用します。

  • 運用の透明性、トラブルシューティング、データアクセスのモニタリングのために、監査ロギングを有効にします。

  • 誤って削除された場合に備えて、デフォルトの削除(復元可能)ポリシー(7 日間の保持)を維持します。ただし、データが削除された場合は、オブジェクトを手動で復元するのではなく、サポートにお問い合わせください。BigQuery の外部で追加または変更されたオブジェクトは、BigQuery メタデータで追跡されません。

  • 適応型ファイルサイズ設定、自動クラスタリング、ガベージ コレクションは自動的に有効になり、ファイル パフォーマンスと費用の最適化に役立ちます。

  • Iceberg マネージド テーブルではサポートされていないため、次の Cloud Storage 機能は使用しないでください。

これらのベスト プラクティスを実装するには、次のコマンドを使用してバケットを作成します。

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: オブジェクトの ID
  • LOCATION: 新しいバケットのロケーション

Iceberg マネージド テーブルのワークフロー

次のセクションでは、Iceberg マネージド テーブルの作成、読み込み、管理、クエリの方法について説明します。

始める前に

Iceberg マネージド テーブルを作成して使用する前に、ストレージ バケットへの Cloud リソース接続が設定されていることを確認してください。次の必要なロール セクションで指定されているように、接続にはストレージ バケットへの書き込み権限が必要です。接続に必要なロールと権限の詳細については、接続を管理するをご覧ください。

必要なロール

プロジェクト内のテーブルを BigQuery が管理できるようにするために必要な権限を取得するには、次の IAM ロールの付与を管理者に依頼してください。

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

これらの事前定義ロールには、プロジェクト内のテーブルの 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 ファイルが