HBase と Bigtable の違い

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

列ファミリー

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

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

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

行とセル

  • 個々の行に対して ACL を定義できません。
  • 個々のセルの表示 / 非表示を設定できません。
  • タグはサポートされていません。クラス org.apache.hadoop.hbase.Tag を使用して個々のセルにメタデータを追加することはできません。

ミューテーションと削除

  • Bigtable の Append オペレーションは、リーダーとライターのどちらにとっても完全にアトミックです。リーダーは部分的に適用された Append オペレーションを読み取ることはできません。
  • 特定の列の特定のバージョンをタイムスタンプに基づいて削除することはできますが、指定した列ファミリーまたは行で特定のタイムスタンプを持つすべての値を削除することはサポートされていません。クラス 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 に入っています。

サポート対象 制限付きでサポート サポート対象外
  1. 1 つの列ファミリーだけがサポートされています。
  2. setLenAsVal(true) の呼び出しはサポートされていません。
  3. BinaryComparator コンパレータのみをサポートします。EQUAL 以外の演算子が使用されている場合は、1 つの列ファミリーだけがサポートされています。
  4. 次のコンパレータだけがサポートされています。
    • BinaryComparator
    • フラグなし(フラグは無視されます)で EQUAL 演算子付きの RegexStringComparator
  5. PageFilterFilterList にある場合、FilterListMUST_PASS_ALL に設定されている場合に PageFilter は HBase と同様の機能のみを示します。これがデフォルトの動作です。FilterListMUST_PASS_ONE に設定されている場合、Bigtable は PageFilterMUST_PASS_ALL として扱い、PageFilter の pageSize に対応する行数のみを返します。
  6. ほとんどの場合、PrefixFilterPrefixFilter 内の行をスキャンします。ただし、PrefixFilterFilterList の一部であり、演算子 MUST_PASS_ONE を含む場合、Bigtable ではこの場合が意味する範囲を判別できません。代わりに、開始列から停止列までをフィルタなしでスキャンします。この場合、PrefixFilterBigtableExtendedScan またはフィルタの組み合わせと併用すると、パフォーマンスを最適化できます。
  7. Bigtable の条件フィルタを使用します。これによって動作速度が低下する可能性があります。サポートされていますが、おすすめしません。
ColumnPrefixFilter
FamilyFilter
FilterList
FuzzyRowFilter
MultipleColumnPrefixFilter
MultiRowRangeFilter
PrefixFilter 6
RandomRowFilter
TimestampsFilter
ColumnCountGetFilter 1
ColumnPaginationFilter 1
ColumnRangeFilter 1
FirstKeyOnlyFilter 1
KeyOnlyFilter 2
PageFilter 5
QualifierFilter 3
RowFilter 1, 4
SingleColumnValueExcludeFilter 1, 4, 7
SingleColumnValueFilter 4, 7
ValueFilter 4
DependentColumnFilter
FirstKeyValueMatchingQualifiersFilter
InclusiveStopFilter
ParseFilter
SkipFilter
WhileMatchFilter

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

  • 正規表現コンパレータ(org.apache.hadoop.hbase.filter.RegexStringComparator)を使用するフィルタでは、Java 構文ではなく RE2 構文の正規表現が使用されます。
  • カスタム フィルタはサポートされていません。org.apache.hadoop.hbase.filter.Filter を継承するクラスは作成できません。
  • フィルタ式には 20 KB のサイズ上限があります。フィルタ式のサイズを縮小するための回避策としては、フィルタ条件のハッシュ値を格納する補助列を使用します。

タイムスタンプ

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

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

管理

このセクションでは、インターフェース org.apache.hadoop.hbase.client.Admin のメソッドのうち、Bigtable では使用できないメソッドや、Bigtable では HBase と異なる動作をするメソッドについて説明します。これらのリストはすべてを網羅しているわけではなく、最後に追加した HBase API メソッドを反映していない場合があります。

Bigtable では管理タスクが自動的に処理されるため、これらのメソッドのほとんどは不要です。Bigtable ではサポートされていない機能に関連するいくつかのメソッドがあり、それらは使用できません。

全般的なメンテナンス タスク

Bigtable ではほとんどのメンテナンス タスクが自動的に処理されます。そのため、以下のメソッドは使用できません。

  • abort(String why, Throwable e)
  • balancer()
  • enableCatalogJanitor(boolean enable)
  • getMasterInfoPort()
  • getOperationTimeout()
  • isCatalogJanitorEnabled()
  • rollWALWriter(ServerName serverName)
  • runCatalogScan()
  • setBalancerRunning(boolean on, boolean synchronous)
  • shutdown()
  • stopMaster()
  • updateConfiguration()
  • updateConfiguration(ServerName serverName)

地域グループ

Bigtable では、列ファミリーの地域グループを指定できません。そのため、地域グループを返す HBase メソッドを呼び出すことはできません。

名前空間

Bigtable では名前空間は使用されません。行キー接頭辞を使用して名前空間をシミュレートできます。以下のメソッドはサポートされていません。

  • createNamespace(NamespaceDescriptor descriptor)
  • deleteNamespace(String name)
  • getNamespaceDescriptor(String name)
  • listNamespaceDescriptors()
  • listTableDescriptorsByNamespace(String name)
  • listTableNamesByNamespace(String name)
  • modifyNamespace(NamespaceDescriptor descriptor)

リージョン管理

Bigtable では、リージョンに類似したタブレットが使用されています。Bigtable ではユーザーのタブレットが自動的に管理されます。そのため、以下のメソッドは使用できません。

  • assign(byte[] regionName)
  • closeRegion(byte[] regionname, String serverName)
  • closeRegion(ServerName sn, HRegionInfo hri)
  • closeRegion(String regionname, String serverName)
  • closeRegionWithEncodedRegionName(String encodedRegionName, String serverName)
  • compactRegion(byte[] regionName)
  • compactRegion(byte[] regionName, byte[] columnFamily)
  • compactRegionServer(ServerName sn, boolean major)
  • flushRegion(byte[] regionName)
  • getAlterStatus(byte[] tableName)
  • getAlterStatus(TableName tableName)
  • getCompactionStateForRegion(byte[] regionName)
  • getOnlineRegions(ServerName sn)
  • majorCompactRegion(byte[] regionName)
  • majorCompactRegion(byte[] regionName, byte[] columnFamily)
  • mergeRegions(byte[] encodedNameOfRegionA, byte[] encodedNameOfRegionB, boolean forcible)
  • move(byte[] encodedRegionName, byte[] destServerName)
  • offline(byte[] regionName)
  • splitRegion(byte[] regionName)
  • splitRegion(byte[] regionName, byte[] splitPoint)
  • stopRegionServer(String hostnamePort)
  • unassign(byte[] regionName, boolean force)

スナップショット

以下のメソッドはサポートされていません。

  • deleteSnapshots(Pattern pattern)
  • deleteSnapshots(String regex)
  • isSnapshotFinished(HBaseProtos.SnapshotDescription snapshot)
  • restoreSnapshot(byte[] snapshotName)
  • restoreSnapshot(String snapshotName)
  • restoreSnapshot(byte[] snapshotName, boolean takeFailSafeSnapshot)
  • restoreSnapshot(String snapshotName, boolean takeFailSafeSnapshot)
  • snapshot(HBaseProtos.SnapshotDescription snapshot)

テーブル管理

テーブルのコンパクションなどのタスクは自動的に処理されます。そのため、以下のメソッドは使用できません。

  • compact(TableName tableName)
  • compact(TableName tableName, byte[] columnFamily)
  • flush(TableName tableName)
  • getCompactionState(TableName tableName)
  • majorCompact(TableName tableName)
  • majorCompact(TableName tableName, byte[] columnFamily)
  • modifyTable(TableName tableName, HTableDescriptor htd)
  • split(TableName tableName)
  • split(TableName tableName, byte[] splitPoint)

コプロセッサ

Bigtable ではコプロセッサはサポートされていません。そのため、以下のメソッドは使用できません。

  • coprocessorService()
  • coprocessorService(ServerName serverName)
  • getMasterCoprocessors()

分散プロシージャ

Bigtable では分散プロシージャはサポートされていません。そのため、以下のメソッドは使用できません。

  • execProcedure(String signature, String instance, Map<String, String> props)
  • execProcedureWithRet(String signature, String instance, Map<String, String> props)
  • isProcedureFinished(String signature, String instance, Map<String, String> props)