HBase と Bigtable の違い

Bigtable にアクセスする方法の 1 つは、Java 用 Apache HBase クライアントのカスタマイズ バージョンを使用することです。通常、カスタマイズされたクライアントでは HBase の標準インストールと同じ API が公開されています。このページでは、Java 用 Cloud Bigtable HBase クライアントと標準の HBase インストールの違いについて説明します。相違点のほとんどは、Bigtable で自動的に処理される管理タスクに関するものです。

Java 用 Cloud Bigtable HBase クライアントは、HBase から Bigtable に移行し、HBase API を引き続き使用するお客様を対象としています。それ以外の場合は、Java デベロッパーは、Bigtable API を呼び出す Java 用 Cloud Bigtable クライアントを使用する必要があります。

列ファミリー

列ファミリーを作成した場合、HBase shell や HBase API からはブロックサイズや圧縮方法を構成できません。ブロックサイズと圧縮は Bigtable で自動的に管理されるためです。

また、HBase シェルを使用してテーブル情報を取得すると、列ファミリーはいずれも圧縮を使用しないというレポートが常に HBase シェルから返されますが、実際には、Bigtable 独自の圧縮方法がすべてのデータに自動的に使用されます。

Bigtable が基盤となるストレージを管理するため、次の列ファミリーの設定は無視されます。

  • BLOCKCACHE
  • BLOCKSIZE
  • BLOOMFILTER
  • CACHE_BLOOMS_ON_WRITE
  • CACHE_DATA_IN_L1
  • CACHE_DATA_ON_WRITE
  • CACHE_INDEX_ON_WRITE
  • COMPRESS_TAGS
  • COMPRESSION
  • COMPRESSION_COMPACT
  • DATA_BLOCK_ENCODING
  • EVICT_BLOCKS_ON_CLOSE
  • IN_MEMORY
  • KEEP_DELETED_CELLS
  • PREFETCH_BLOCKS_ON_OPEN
  • REPLICATION_SCOPE

VERSIONS、MIN_VERSIONS、TTL の設定は、Bigtable のガベージ コレクション ポリシーに変換されます。

Bigtable では、列ファミリー名が正規表現 [_a-zA-Z0-9][-_.a-zA-Z0-9]* に従っている必要があります。Bigtable に HBase からデータをインポートする場合は、このパターンに従うために、まずファミリー名の変更が必要な場合があります。

行とセル

  • 個々の行に ACL を定義することはできません。Bigtable の承認済みビューを使用すると、テーブルのデータのサブセットへのアクセス権を付与できますが、HBase API を介して公開されることはありません。
  • 個々のセルの表示 / 非表示を設定できません。
  • タグはサポートされていません。org.apache.hadoop.hbase.Tag クラスを使用して個々のセルにメタデータを追加することはできません。セルに追加したタグは、セルが書き込まれる前に削除されます。

mutation と削除

  • Bigtable の Append オペレーションは、リーダーとライターのどちらにとっても完全にアトミックです。リーダーは部分的に適用された Append オペレーションを読み取ることはできません。
  • Increment オペレーションはアトミックですが、Increment に期 間を設定することはできません。
  • Table#mutateRow() に渡す RowMutations オブジェクトには、Put オペレーションと Delete オペレーション、または Append オペレーションと Increment オペレーションのいずれかを含めることができます。両方を含めることはできません。Append オペレーションまたは Increment オペレーションを含む RowMutations オブジェクトは、batch()、checkAndMutate()、BufferedMutator ではサポートされていません。
  • タイムスタンプに基づいて特定の列の特定のバージョンを削除できます。ただし、次の種類の削除はサポートされていません。

    • 列の最新バージョンのみを削除する
    • 特定のタイムスタンプを持つ行のすべての値を削除する
    • 特定のタイムスタンプ以前の列ファミリーのすべての値を削除する

    そのため、クラス org.apache.hadoop.hbase.client.Delete の次のメソッドはサポートされていません。 + new Delete(byte[] row, long timestamp) + addColumn(byte[] family, byte[] qualifier) + addFamily(byte[] family, long timestamp) + addFamilyVersion(byte[] family, long timestamp)

  • HBase では、削除は Put をマスクしますが、Bigtable では、削除リクエストの送信後に Put リクエストが送信された場合は、削除の後の Put をマスクしません。つまり、Bigtable では、セルに送信された書き込みリクエストは、以前に同じセルに送信された削除リクエストの影響を受けません。

取得とスキャン

コプロセッサ

コプロセッサはサポートされていません。インターフェース org.apache.hadoop.hbase.coprocessor を実装するクラスは作成できません。

フィルタ

次の表に、パッケージ org.apache.hadoop.hbase.filter でサポートされているフィルタを示します。そのパッケージ内の他のすべてのフィルタはサポートされておらず、UnsupportedOperationException をスローします。

サポート対象 制限付きでサポート
  1. ほとんどの場合、PrefixFilter は PrefixFilter 内の行をスキャンします。ただし、PrefixFilter が FilterList の一部であり、演算子 MUST_PASS_ONE を含む場合、Bigtable ではこの場合が意味する範囲を判別できません。代わりに、開始列から停止列までをフィルタなしでスキャンします。この場合、PrefixFilter を BigtableExtendedScan またはフィルタの組み合わせと併用すると、パフォーマンスを最適化できます。
  2. 列修飾子を列オフセットとして使用する場合にのみ、単一の列ファミリーが必要です。
  3. 1 つの列ファミリーだけがサポートされています。
  4. EQUAL 演算子のみをサポートします。BinaryComparator 比較演算子または RegexStringComparator 比較演算子を使用します。
  5. new KeyOnlyFilter(true) を使用したフィルタの作成はサポートされていません。
  6. MUST_PASS_ONE 演算子を使用する FilterList の一部にすることはできません。
  7. PageFilter は、最上位のフィルタにするか、MUST_PASS_ALL 演算子を使用する最上位の FilterList の最後のフィルタにする必要があります。これがデフォルトの動作です。MUST_PASS_ONE 演算子を使用する FilterList の PageFilter はサポートされていません。
  8. BinaryComparator 比較演算子、または EQUAL 演算子を使用した RegexStringComparator 比較演算子のみをサポートします。EQUAL 以外の演算子を使用する場合は、1 つの列ファミリーのみがサポートされます。
  9. 次のコンパレータだけがサポートされています。
    • BinaryComparator
    • フラグなし(フラグは無視されます)で EQUAL 演算子付きの RegexStringComparator
  10. Bigtable の条件フィルタを使用します。これによって動作速度が低下する可能性があります。サポートされていますが、おすすめしません。
  11. スキャンごとに 1 つの WhileMatchFilter のみがサポートされます。
ColumnCountGetFilter
ColumnPrefixFilter
FilterList
FirstKeyOnlyFilter
FuzzyRowFilter
MultipleColumnPrefixFilter
PrefixFilter 1
RandomRowFilter
TimestampsFilter
ColumnPaginationFilter 2
ColumnRangeFilter 3
FamilyFilter 4
KeyOnlyFilter 5
MultiRowRangeFilter 6
PageFilter 7
QualifierFilter 8
RowFilter 4
SingleColumnValueExcludeFilter 3、9、10
SingleColumnValueFilter 9、10
ValueFilter 9
WhileMatchFilter 6、11

また、Bigtable のフィルタは以下の違いによる影響を受けます。

  • 比較演算子 BinaryComparator と RegexStringComparator のみがサポートされています。他のすべての比較演算子はサポートされておらず、UnsupportedOperationException がスローされます。
  • 正規表現コンパレータ(org.apache.hadoop.hbase.filter.RegexStringComparator)を使用するフィルタでは、Java 構文ではなく RE2 構文の正規表現が使用されます。
  • カスタム フィルタはサポートされていません。org.apache.hadoop.hbase.filter.Filter を継承するクラスは作成できません。HBase に相当するものがない Bigtable フィルタを使用するには、com.google.cloud.bigtable.hbase.filter.BigtableFilter でラップします。
  • フィルタ式には 20 KB のサイズ上限があり、フィルタを 20 レベルより深くネストすることはできません。フィルタ式のサイズを小さくする回避策として、フィルタ条件のハッシュ値を格納する補助列を使用します。

タイムスタンプ

Bigtable はマイクロ秒単位でタイムスタンプを保存し、HBase はミリ秒単位でタイムスタンプを保存します。この違いは、Bigtable 用 HBase クライアント ライブラリを使用していて、リバース タイムスタンプのデータがある場合に影響します。

クライアント ライブラリはマイクロ秒とミリ秒の間で変換しますが、Bigtable が格納できる最大の HBase タイムスタンプは Long.MAX_VALUE/1000 であるため、それ以上の値は Long.MAX_VALUE/1000 に変換されます。その結果、大きいリバース タイムスタンプの値が正しく変換されないことがあります。

管理

このセクションでは、Java 用 Bigtable HBase クライアントが org.apache.hadoop.hbase.client.Admin インターフェースを実装する方法について説明します。Bigtable はほとんどのクラスタ管理タスクとストレージ管理タスクを自動的に処理するため、多くの HBase 管理メソッドは適用されません。このセクションにサポート対象として記載されていない、または効果がないと記載されていない Admin メソッドはサポートされておらず、UnsupportedOperationException がスローされます。

テーブル管理

テーブルと列ファミリーを管理するための次の Admin メソッドがサポートされています。

  • addColumnFamily(TableName tableName, ColumnFamilyDescriptor columnFamily) および addColumnFamilyAsync(TableName tableName, ColumnFamilyDescriptor columnFamily)(HBase 1.x: addColumn(TableName tableName, HColumnDescriptor column))
  • createTable(TableDescriptor desc)、createTable(TableDescriptor desc, byte[][] splitKeys)、createTable(TableDescriptor desc, byte[] startKey, byte[] endKey, int numRegions)、createTableAsync(TableDescriptor desc)、createTableAsync(TableDescriptor desc, byte[][] splitKeys)
  • deleteColumnFamily(TableName tableName, byte[] columnName) と deleteColumnFamilyAsync(TableName tableName, byte[] columnName)(HBase 1.x: deleteColumn(TableName tableName, byte[] columnName))
  • deleteTable(TableName tableName)、deleteTableAsync(TableName tableName)、deleteTables(Pattern pattern)、deleteTables(String regex)
  • disableTable(TableName tableName)、disableTableAsync(TableName tableName)、disableTables(Pattern pattern)、disableTables(String regex)
  • enableTable(TableName tableName)、enableTableAsync(TableName tableName)、enableTables(Pattern pattern)、enableTables(String regex)
  • getAlterStatus(TableName tableName) と getAlterStatus(byte[] tableName)
  • getDescriptor(TableName tableName)、getTableDescriptor(TableName tableName)、getTableDescriptors(List<String> names)、getTableDescriptorsByTableName(List<TableName> tableNames)
  • isTableAvailable(TableName tableName) と isTableAvailable(TableName tableName, byte[][] splitKeys)
  • isTableDisabled(TableName tableName) と isTableEnabled(TableName tableName)
  • listTableDescriptors()、listTableDescriptors(List<TableName> tableNames)、listTableDescriptors(Pattern pattern)、listTableDescriptors(Pattern pattern, boolean includeSysTables)(HBase 1.x: listTables()、listTables(Pattern pattern)、listTables(Pattern pattern, boolean includeSysTables)、listTables(String regex)、listTables(String regex, boolean includeSysTables))
  • listTableNames()、listTableNames(Pattern pattern)、listTableNames(Pattern pattern, boolean includeSysTables)、listTableNames(String regex)、listTableNames(String regex, boolean includeSysTables)
  • modifyColumnFamily(TableName tableName, ColumnFamilyDescriptor columnFamily) と modifyColumnFamilyAsync(TableName tableName, ColumnFamilyDescriptor columnFamily)(HBase 1.x: modifyColumn(TableName tableName, HColumnDescriptor column))
  • modifyTable(TableDescriptor td)、modifyTable(TableName tableName, TableDescriptor td)、modifyTableAsync(TableDescriptor td)、modifyTableAsync(TableName tableName, TableDescriptor td)
  • tableExists(TableName tableName)
  • truncateTable(TableName tableName, boolean preserveSplits) と truncateTableAsync(TableName tableName, boolean preserveSplits)。

次のサポートされているテーブル管理メソッドは、Bigtable で動作が異なるか、特定のパラメータを無視します。

  • Bigtable テーブルは無効にできません。disableTable()、disableTableAsync()、disableTables()、enableTable()、enableTableAsync()、enableTables() は、クライアントのメモリ(isTableDisabled() と isTableEnabled() が読み取るメモリ)でのみテーブルの状態を変更します。
  • modifyTable() と modifyTableAsync() は、列ファミリーの変更のみを適用します。テーブルレベルの属性は無視されます。
  • truncateTable() と truncateTableAsync() は、テーブル内のすべてのデータを削除します。preserveSplits パラメータは無視されます。
  • includeSysTables パラメータを受け入れる listTableDescriptors()、listTables()、listTableNames() のオーバーロードは、Bigtable にシステムテーブルがないため、includeSysTables を無視します。
  • isTableAvailable(TableName tableName, byte[][] splitKeys) は、テーブルが存在するかどうかのみを確認し、splitKeys パラメータを無視します。
  • Bigtable のスキーマ変更は同期的であるため、getAlterStatus() は常に (0, 0) を返します。

テーブルの圧縮や分割などのタスクは自動的に処理されます。そのため、次のメソッドは効果がありません。

  • compact(TableName tableName)
  • compact(TableName tableName, byte[] columnFamily)
  • majorCompact(TableName tableName)
  • majorCompact(TableName tableName, byte[] columnFamily)
  • split(TableName tableName)
  • split(TableName tableName, byte[] splitPoint)

スナップショット

HBase スナップショット メソッドは、Bigtable のバックアップを作成して管理します。バックアップは特定のクラスタに保存されるため、インスタンスに複数のクラスタがある場合は、構成プロパティ google.bigtable.snapshot.cluster.id を使用するクラスタに設定する必要があります。snapshot() で作成したバックアップは、構成プロパティ google.bigtable.snapshot.default.ttl.secs の秒数(デフォルトでは 24 時間)が経過すると期限切れになります。cloneSnapshot() は、バックアップから新しいテーブルに復元します。

Admin では、次のスナップショット メソッドがサポートされています。

  • cloneSnapshot(byte[] snapshotName, TableName tableName)
  • cloneSnapshot(String snapshotName, TableName tableName)
  • deleteSnapshot(byte[] snapshotName)
  • deleteSnapshot(String snapshotName)
  • snapshot(byte[] snapshotName, TableName tableName)
  • snapshot(String snapshotName, TableName tableName)

また、AsyncAdmin は listSnapshots()、listSnapshots(Pattern pattern)、snapshot(SnapshotDescription snapshot) をサポートしています。restoreSnapshot()、deleteSnapshots()、deleteTableSnapshots()、listTableSnapshots()、cloneSnapshot(String snapshotName, TableName tableName, boolean restoreAcl) などの他のスナップショット メソッドはすべてサポートされておらず、UnsupportedOperationException がスローされます。

リージョン管理

Bigtable は、リージョンに似たタブレットを使用します。リージョン情報を取得する次のメソッドがサポートされています。標準の HBase とは異なります。

  • getRegions(TableName tableName) と getTableRegions(TableName tableName)、およびインターフェース org.apache.hadoop.hbase.client.RegionLocator のメソッドは、テーブル内の行キーのサンプルに基づいて、おおよその境界を返します。返されたリージョンのサーバー名は実際のサーバーではありません。
  • getRegionMetrics(ServerName serverName, TableName tableName) は serverName パラメータを無視し、テーブル内の行キーのサンプルに基づいて、おおよそのリージョン サイズの指標を返します。

Bigtable はタブレットを自動的に管理するため、次のメソッドは効果がありません。

  • assign(byte[] regionName)
  • compactRegion(byte[] regionName)
  • compactRegion(byte[] regionName, byte[] columnFamily)
  • flushRegion(byte[] regionName)
  • majorCompactRegion(byte[] regionName)
  • majorCompactRegion(byte[] regionName, byte[] columnFamily)
  • splitRegion(byte[] regionName)
  • splitRegion(byte[] regionName, byte[] splitPoint)

HBase 1.x では、compactRegionServer(ServerName sn, boolean major)、mergeRegions(byte[] encodedNameOfRegionA, byte[] encodedNameOfRegionB, boolean forcible)、move(byte[] encodedRegionName, byte[] destServerName)、unassign(byte[] regionName, boolean force) も効果がありません。HBase 2.x の同等の機能はサポートされておらず、UnsupportedOperationException がスローされます。

クラスタのステータスと接続

Bigtable はクラスタのメンテナンス タスクを自動的に処理するため、Admin のメンテナンス メソッドは UnsupportedOperationException をスローします。サポートされているのは、次の接続メソッドとステータス メソッドのみです。

  • close() は影響しません。
  • getClusterMetrics()、getClusterMetrics(EnumSet<Option> options)、getClusterStatus() は、空のサーバーリストを含むプレースホルダ値を返します。getClusterMetrics(EnumSet<Option> options) は options パラメータを無視します。
  • getConfiguration() はクライアント Configuration オブジェクトを返します。
  • getConnection() はクライアント Connection オブジェクトを返します。

名前空間

Bigtable では名前空間は使用されません。行キーの接頭辞を使用して名前空間をシミュレートできます。

デフォルトでは、すべての名前空間メソッドが UnsupportedOperationException をスローします。ただし、構成プロパティ google.bigtable.namespace.warnings を true に設定すると、次のメソッドは例外をスローする代わりに、警告をログに記録し、効果はありません(null または空の結果を返します)。

  • createNamespace(NamespaceDescriptor descriptor)
  • deleteNamespace(String name)
  • deleteNamespaceAsync(String name)
  • getNamespaceDescriptor(String name)
  • listNamespaceDescriptors()
  • listTableDescriptorsByNamespace(byte[] name)
  • listTableDescriptorsByNamespace(String name)
  • listTableNamesByNamespace(String name)
  • modifyNamespace(NamespaceDescriptor descriptor)

google.bigtable.namespace.warnings が true に設定されている場合でも、listNamespaces() は UnsupportedOperationException をスローします。

その他の管理機能

Bigtable は、次のカテゴリの Admin メソッドをサポートしていません。これらのメソッドを呼び出すと、UnsupportedOperationException がスローされます。

  • ローカリティ グループ: Bigtable では、列ファミリーにローカリティ グループを指定できません。
  • コプロセッサと分散プロシージャ: Bigtable はコプロセッサや分散プロシージャをサポートしていません。
  • 割り当て: Bigtable の割り当てについては、割り当てと上限をご覧ください。
  • レプリケーション: Bigtable は、インスタンス内のクラスタ間でデータを自動的にレプリケートします。詳細については、レプリケーションの概要をご覧ください。HBase から Bigtable にレプリケーションを行うには、HBase から Bigtable へのレプリケーションをご覧ください。
  • アクセス制御: Bigtable は、アクセス制御に IAM を使用します。
  • RegionServer グループ: Bigtable はサーバーを自動的に管理し、RegionServer グループを公開しません。