protobuf スキーマを作成して管理する
このドキュメントでは、スキーマ バンドルを作成してオペレーションを実行する方法について説明します。
Bigtable では、プロトコル バッファ(protobuf)スキーマを使用して、列にバイトとして保存されている protobuf メッセージ内の個々のフィールドをクエリできます。これを行うには、スキーマをスキーマ バンドル(1 つ以上の protobuf スキーマを含むテーブルレベルのリソース)にアップロードします。
スキーマ バンドルを使用すると、次のメリットがあります。
- 時間と労力を節約する: プロトコル バッファを使用すると、proto ファイルでデータ構造を一度定義するだけで、生成されたソースコードを使用してデータを読み書きできます。
- データの整合性を向上させる: proto ファイルを単一の信頼できる情報源として使用することで、すべてのアプリケーションとサービスが同じデータモデルを使用していることを確認できます。
- データ重複の排除: 特定のプロジェクトのコードベースの外部にある proto ファイルでメッセージ タイプを定義することで、プロジェクト全体でプロトコル バッファを使用できます。
Bigtable でスキーマを使用するプロセスは、proto ファイルから始まります。proto ファイルは、データの構造を定義するテキスト ファイルです。protobuf コンパイラ ツール(protoc とも呼ばれます)を使用して、protobuf ファイル記述子セットを生成します。これは、proto ファイルの機械可読スキーマです。この記述子セットを使用して、スキーマ バンドルを作成します。
proto ファイルとそれに対応する記述子セットの例については、データの例をご覧ください。
次の図は、Bigtable でスキーマを使用するプロセスを示しています。
スキーマ バンドルは、 Google Cloud コンソールまたは Google Cloud CLI を使用して作成できます。スキーマ バンドルを Bigtable にアップロードすると、Bigtable Studio クエリビルダー、Bigtable 用 GoogleSQL、BigQuery の Bigtable 外部テーブルを使用してデータをクエリできます。
始める前に
gcloud CLI を使用する場合は、次の操作を行います。
- Google Cloud CLI をインストールします。
gcloud CLI を初期化します。
gcloud init
必要なロール
スキーマ バンドルの作成と管理に必要な権限を取得するには、テーブルに対する Bigtable 管理者(roles/bigtable.admin)Identity and Access Management(IAM)ロールを付与するよう管理者に依頼してください。
この事前定義ロールには、Bigtable がスキーマ バンドルを操作するために必要な権限が含まれています。必要とされる正確な権限については、「必要な権限」セクションを開いてご確認ください。
必要な権限
bigtable.schemaBundles.createbigtable.schemaBundles.updatebigtable.schemaBundles.deletebigtable.schemaBundles.getbigtable.schemaBundles.list
カスタムロールや他の事前定義ロールを使用して、これらの権限を取得することもできます。
Bigtable のロールと権限の詳細については、IAM によるアクセス制御をご覧ください。
protobuf ファイル記述子セットを生成する
スキーマ バンドルを作成する前に、protobuf コンパイラ ツールを使用して、proto ファイルから記述子セットを生成する必要があります。
- コンパイラをインストールするには、パッケージをダウンロードし、README ファイルの手順に沿って操作します。
コンパイラを実行します。
protoc --proto_path=IMPORT_PATH --include_imports \ --descriptor_set_out=DESCRIPTOR_OUTPUT_LOCATION PATH_TO_PROTO次のように置き換えます。
IMPORT_PATH: protoc コンパイラが proto ファイルを検索するディレクトリ。DESCRIPTOR_OUTPUT_LOCATION: protoc コンパイラが生成された記述子セットを保存するディレクトリ。PATH_TO_PROTO: proto ファイルのパス。
たとえば、現在のディレクトリにある library.proto ファイルの library.pb という名前の記述子セットを作成するには、次のコマンドを使用します。
protoc --include_imports --descriptor_set_out=library.pb
library.proto
スキーマ バンドルを作成する
コンソール
Google Cloud コンソールで、Bigtable インスタンスのリストを開きます。
リストからインスタンスを選択します。
ナビゲーション パネルで [Bigtable Studio] をクリックします。
[エクスプローラ] ペインで、スキーマ バンドルを作成するテーブルの横にある more_vert アクション メニューをクリックし、[スキーマ バンドルを作成] をクリックします。
[スキーマ バンドルを作成] ダイアログの [スキーマ バンドル ID] フィールドに、スキーマ バンドルの一意の識別子を入力します。
ID は 1 ~ 50 文字で指定します。使用できるのは英字、数字、アンダースコア、ハイフンのみです。先頭をハイフンにすることはできません。また、ピリオド(
.)を含めることはできません。[File Descriptor Set (.pb file)] フィールドで、[Browse] をクリックして、このドキュメントの protobuf ファイル記述子セットを生成するで作成した protobuf ファイル記述子セットを選択します。ファイルサイズは 4 MB 以下にしてください。
[作成] をクリックします。
スキーマ バンドルが新しいタブで開きます。
gcloud
スキーマ バンドルを作成するには、gcloud bigtable schema-bundles create コマンドを使用します。
gcloud bigtable schema-bundles create SCHEMA_BUNDLE_ID \
--instance=INSTANCE_ID \
--table=TABLE_ID \
--proto-descriptors-file=PROTO_DESCRIPTORS_FILE
次のように置き換えます。
SCHEMA_BUNDLE_ID: 新しいスキーマ バンドルの一意の ID。ピリオド(.)文字を含めることはできません。INSTANCE_ID: スキーマ バンドルを作成するインスタンスの ID。TABLE_ID: スキーマ バンドルを作成するテーブルの ID。PROTO_DESCRIPTORS_FILE: このドキュメントの protobuf ファイル記述子セットを生成するで作成した記述子セットのパス。
Java
スキーマ バンドルを作成するには、createSchemaBundle メソッドを使用します。
Bigtable 用のクライアント ライブラリをインストールして使用する方法については、Bigtable クライアント ライブラリをご覧ください。
Bigtable で認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
スキーマ バンドルに関する情報を表示する
スキーマ バンドルに関する情報を表示するには、少なくとも 1 つのスキーマ バンドルを含む Bigtable テーブルが必要です。テーブル内のスキーマ バンドルに関する情報を取得するには、単一のスキーマ バンドルの定義を取得するか、テーブル内のすべてのスキーマ バンドルを一覧表示します。
スキーマ バンドル定義を取得する
コンソール
Google Cloud コンソールで、Bigtable インスタンスのリストを開きます。
リストからインスタンスを選択します。
ナビゲーション パネルで [Bigtable Studio] をクリックします。
[エクスプローラ] ペインで、スキーマ バンドルを含むテーブルを開き、[スキーマ バンドル] を開きます。
表示するスキーマ バンドルをクリックするか、スキーマ バンドルの横にある more_vert 操作メニューをクリックして、[詳細を表示] をクリックします。
スキーマ バンドル定義が表示されたタブが開きます。
(省略可)スキーマ バンドルを使用するサンプルクエリを含む SQL クエリエディタ タブを開くには、スキーマ バンドルの横にある more_vert 操作メニューをクリックし、[サンプルクエリ] をクリックします。
gcloud
スキーマ バンドルの詳細を取得するには、gcloud bigtable schema-bundles describe コマンドを使用します。
gcloud bigtable schema-bundles describe SCHEMA_BUNDLE_ID \
--instance=INSTANCE_ID \
--table=TABLE_ID
次のように置き換えます。
SCHEMA_BUNDLE_ID: スキーマ バンドルの ID。INSTANCE_ID: インスタンスの ID。TABLE_ID: テーブルの ID。
Java
スキーマ バンドルの定義を取得するには、getSchemaBundle メソッドを使用します。このメソッドは、スキーマ定義を含む SchemaBundle オブジェクトを返します。
次の例は、スキーマ バンドルを取得し、記述子セットを逆シリアル化してスキーマの内容を出力する方法を示しています。
Bigtable 用のクライアント ライブラリをインストールして使用する方法については、Bigtable クライアント ライブラリをご覧ください。
Bigtable で認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
出力は次のようになります。
--------- Deserialized FileDescriptorSet ---------
File: my_schema.proto
Package: my_package
Message: MyMessage
--------------------------------------------------
スキーマ バンドルをテーブルで一覧表示する
コンソール
Google Cloud コンソールで、Bigtable インスタンスのリストを開きます。
リストからインスタンスを選択します。
ナビゲーション パネルで [Bigtable Studio] をクリックします。
[エクスプローラ] ペインで、表示するスキーマ バンドルを含むテーブルを開きます。
[スキーマ バンドル] を開きます。
テーブルにスキーマ バンドルのリストが表示されます。テーブルにスキーマ バンドルがない場合、[スキーマ バンドル] リストは表示されません。
gcloud
テーブルのスキーマ バンドルのリストを表示するには、gcloud bigtable schema-bundles list コマンドを使用します。
gcloud bigtable schema-bundles list \
--instance=INSTANCE_ID \
--table=TABLE_ID
次のように置き換えます。
INSTANCE_ID: インスタンスの ID。TABLE_ID: テーブルの ID。
Java
テーブル内のすべてのスキーマ バンドルのリストを表示するには、listSchemaBundles メソッドを使用します。このメソッドは、スキーマ バンドル ID のリストを返します。
次の例は、スキーマ バンドルをテーブルに一覧表示する方法を示しています。
Bigtable 用のクライアント ライブラリをインストールして使用する方法については、Bigtable クライアント ライブラリをご覧ください。
Bigtable で認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
出力は次のようになります。
my-schema-bundle-1
my-schema-bundle-2
スキーマ バンドルを更新する
スキーマ バンドルを更新すると、Bigtable は新しい記述子セットが既存の記述子セットと下位互換性があるかどうかを確認します。Bigtable が非互換性を検出すると、更新は失敗し、FailedPrecondition エラーが返されます。削除したフィールド番号は、再利用を防ぐために予約することをおすすめします。詳細については、protobuf ドキュメントの Proto のベスト プラクティスをご覧ください。
互換性のない変更が安全であることを確認し、更新を強制的に行う場合は、gcloud CLI で --ignore-warnings フラグを使用できます。ただし、スキーマ バンドルが継続的マテリアライズド ビューまたは論理ビューで使用されている場合は、互換性のない変更を強制することはできません。ビューは、スキーマ バンドルのメッセージ定義に依存してデータを解析し、クエリを実行するため、互換性のない変更を行うと、論理ビューに対するクエリが中断され、継続的マテリアライズド ビューがデータ処理中に失敗します。ビューで参照されているスキーマ バンドルに下位互換性のない変更を加えるには、まず参照ビューを更新または削除する必要があります。
コンソール
Google Cloud コンソールで、Bigtable インスタンスのリストを開きます。
リストからインスタンスを選択します。
ナビゲーション パネルで [Bigtable Studio] をクリックします。
[エクスプローラ] ペインで、スキーマ バンドルを含むテーブルを開き、[スキーマ バンドル] を開きます。
更新するスキーマ バンドルの横にある more_vert 操作メニューをクリックし、[更新] をクリックします。
[スキーマ バンドルを更新] ダイアログの [ファイル記述子セット(.pb ファイル)] フィールドで、新しい protobuf ファイル記述子セットを選択します。ファイルサイズは 4 MB 以下にしてください。
[保存] をクリックします。
gcloud
別の記述子セットを使用するようにスキーマ バンドルを更新するには、gcloud bigtable schema-bundles update コマンドを使用します。
gcloud bigtable schema-bundles update SCHEMA_BUNDLE_ID \
--instance=INSTANCE_ID \
--table=TABLE_ID \
--proto-descriptors-file=PROTO_DESCRIPTORS_FILE
次のように置き換えます。
SCHEMA_BUNDLE_ID: 更新するスキーマ バンドルの ID。INSTANCE_ID: スキーマ バンドルを含むインスタンスの ID。TABLE_ID: スキーマ バンドルを含むテーブルの ID。PROTO_DESCRIPTORS_FILE: 新しい記述子セット ファイルのパス。
(省略可)互換性のない変更がある場合でも更新を強制するには、コマンドに --ignore-warnings フラグを追加します。スキーマ バンドルが継続的マテリアライズド ビューまたは論理ビューで使用されている場合、互換性のない変更を強制することはできません。
Java
Bigtable 用のクライアント ライブラリをインストールして使用する方法については、Bigtable クライアント ライブラリをご覧ください。
Bigtable で認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
スキーマ バンドルを削除する
継続的マテリアライズド ビューまたは論理ビューで使用されているスキーマ バンドルは削除できません。バンドルを削除すると、論理ビューに対するクエリが失敗し、継続的マテリアライズド ビューが受信データを処理できなくなります。スキーマ バンドルを削除するには、まずスキーマ バンドルを参照しているビューを削除するか、参照を削除するようにビューを更新する必要があります。
コンソール
Google Cloud コンソールで、Bigtable インスタンスのリストを開きます。
リストからインスタンスを選択します。
ナビゲーション パネルで [Bigtable Studio] をクリックします。
[エクスプローラ] ペインで、スキーマ バンドルを含むテーブルを開き、[スキーマ バンドル] を開きます。
削除するスキーマ バンドルの横にある more_vert 操作メニューをクリックし、[削除] をクリックします。
確認ダイアログで [削除] をクリックします。
gcloud
スキーマ バンドルを削除するには、gcloud bigtable schema-bundles delete コマンドを使用します。
gcloud bigtable schema-bundles delete SCHEMA_BUNDLE_ID \
--instance=INSTANCE_ID \
--table=TABLE_ID
次のように置き換えます。
SCHEMA_BUNDLE_ID: 削除するスキーマ バンドルの ID。INSTANCE_ID: スキーマ バンドルを含むインスタンスの ID。TABLE_ID: スキーマ バンドルを含むテーブルの ID。
Java
Bigtable 用のクライアント ライブラリをインストールして使用する方法については、Bigtable クライアント ライブラリをご覧ください。
Bigtable で認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
制限事項
スキーマ バンドルには次の制限があります。
- テーブルごとに作成できるスキーマ バンドルは最大 10 個です。
- スキーマ バンドル内のシリアル化されたプロトコル バッファ記述子の合計サイズは 4 MB を超えることはできません。バンドルに含めることができる個々のスキーマの数に直接的な上限はありません。ただし、バンドルの合計サイズがこの上限を超えないようにする必要があります。
次のステップ
- protobuf データにクエリを実行する方法を確認する。
- クエリの変更や不確実なクエリをご覧ください。
- Bigtable 用の GoogleSQL の概要をご覧ください。