Cloud Bigtable の読み取り

このページでは、Cloud Bigtable に送信できる読み取りリクエストの種類と、パフォーマンスへの影響について説明し、特定の種類のクエリに関する推奨事項を示します。このページを読む前に、Cloud Bigtable の概要を理解する必要があります。

概要

Cloud Bigtable への読み取りリクエストは、リクエストされた行の内容をキー順にストリーミング バックします。つまり、行の内容は保存されている順序で返されます。レスポンスを返した書き込みを読み取ることができます。

テーブルがサポートするクエリは、ユースケースに最適な読み取りのタイプを決定する際に有用です。Cloud Bigtable の読み取りリクエストは、次の 2 つの一般カテゴリに分類されます。

  • 単一行の読み取り
  • スキャン、または複数行の読み取り

読み取りは行レベルでアトミックに処理されます。つまり、行の読み取りリクエストを送信すると、Cloud Bigtable は行全体を返すか、リクエストが失敗した場合は行を返しません。行の一部は、明示的にリクエストしない限り返されません。

API を直接呼び出すのではなく、Cloud Bigtable クライアント ライブラリを使用してテーブルからデータを読み取ることを強くおすすめします。読み取りリクエストを送信する方法を示すコードサンプルは、複数の言語でご利用いただけます。すべての読み取りリクエストは ReadRows API 呼び出しを行います。

単一行の読み取り

行キーに基づいて単一行をリクエストできます。コードサンプルは次のバリエーションでご利用いただけます。

スキャン

スキャンは、Cloud Bigtable データを読み取る最も一般的な方法です。行キー接頭辞を指定するか、行キーの先頭と末尾を指定することで、Cloud Bigtable から連続する行の範囲または複数の行の範囲を読み取ることができます。コードサンプルは次のバリエーションでご利用いただけます。

フィルタ後の読み取り

特定の値を格納する行または行の一部のみが必要な場合は、読み取りリクエストでフィルタを使用できます。フィルタを使用すると、必要なデータを詳細に選択できます。

また、フィルタを使用すると、テーブルが使用しているガベージ コレクション ポリシーに読み取りが一致するようにできます。これは、タイムスタンプ付きの新しいセルを既存の列に頻繁に書き込む場合に特に有用です。ガベージ コレクションは期限切れのデータを削除するのに最大 1 週間を要する場合があるため、フィルタを使用してデータの読み取りを行うことで、必要以上のデータを読み取ることを回避できます。

フィルタの概要では、使用できるフィルタの種類について詳しく説明しています。フィルタの使用では複数の言語で例を示しています。

読み取りとパフォーマンス

フィルタを使用する読み取りは、フィルタなしの読み取りよりも実行速度が低下し、CPU 使用率が増大します。一方、返されるデータの量を制限することで、使用するネットワーク帯域幅の量を大幅に削減できます。 一般に、フィルタはレイテンシではなくスループット効率を制御するために使用します。

読み取りパフォーマンスを最適化するには、次の方法を検討してください。

  1. 行セットを可能な限り制限します。ノードがスキャンしなければならない行数を制限することは、最初のバイトまでの時間と全体的なクエリ レイテンシを改善するための最初のステップです。行セットを制限しない場合、Cloud Bigtable はほぼ確実にテーブル全体をスキャンする必要があります。 このことが、最も一般的なクエリが上記のように機能するようスキーマを設計することをおすすめする理由です。

  2. 行セットを制限した後にパフォーマンスをさらに調整するには、基本フィルタの追加を試みます。列のセットまたは返されるバージョンの数を制限すると、一般にレイテンシは増大せず、場合によっては Cloud Bigtable は各行の過去の無関係なデータを効率的にシークできます。

  3. 最初の 2 つの方法を実施した後でさらに読み取りパフォーマンスを調整する場合は、より複雑なフィルタの使用を検討してください。これを試すことについては、次のような理由が考えられます。

    • 依然として不要なデータが大量に返される。
    • クエリを Cloud Bigtable に push することで、アプリケーション コードを簡素化する必要があります。

    ただし、大きな値に対して条件、インターリーブ、正規表現一致を必要とするフィルタには、スキャン対象データのほとんどを一致結果として返す場合にメリットよりもデメリットが多くなる傾向が見られる点に留意してください。この問題は、クライアント側で大幅な節約には至らずに、クラスタの CPU 使用率が増加するという形で発生します。

特定の状況での読み取り

Large rows

Cloud Bigtable では、行のサイズが 256 MB に制限されていますが、誤ってその最大値を超過する場合があります。上限を超えた行を読み取る必要がある場合は、リクエストをページ分割して、cells per row limit フィルタcells per row offset フィルタを使用します。ページ分割された読み取りリクエストの間に書き込みが開始された場合、読み取りはアトミックに実行されない可能性があります。

リバース スキャンのシミュレーション

Cloud Bigtable には、HBase のようなリバース スキャンを行う機能はありません。ただし、リバース スキャンをシミュレーションできます。この手法は、同じ行と列に保存されていない値の最新バージョンを検索する場合に有用です。

この手法は、数値や日付などの減算できる値を含む行キーを作成したことを前提としています。検索対象とする行 X から処理を開始します。まず、X より前のいくつかの行 YX-YX)を検索します。値が見つからない場合は、次の一連の行(X-Y*2X-Y、または X-Y*3X-Y など)を検索します。値が見つからない場合は、値が見つかるまで次の一連の行を検索します。

たとえば、行キーがお客様 ID と日付(123ABC#2020-05-02 形式)で構成され、列の 1 つが password_reset でありパスワードがリセットされた時刻を格納するとします。Cloud Bigtable では、次のように辞書順に自動的に保存されます。この列は、パスワードがリセットされなかった行(日)には存在しません。

`123ABC#2020-02-12,password_reset:03`
`123ABC#2020-04-02,password_reset:11`
`123ABC#2020-04-14`
`123ABC#2020-05-02`
`223ABC#2020-05-22`

顧客 123ABC が最後にパスワードを再設定した時刻を確認する場合は、まず 2020-05-212020-05-22 の範囲の読み取りを行います。値が見つからない場合は、列 password_reset の値を格納する行を取得するまで、2020-05-192020-05-20 を検索します。

次のステップ