HBase と Cloud Bigtable の違い

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

列ファミリー

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

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

行とセル

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

ミューテーションと削除

  • Cloud 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 をマスクしますが、Cloud Bigtable では、削除リクエストの送信後に Put リクエストが送信された場合は、削除の後の Put をマスクしません。つまり、Cloud 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 に設定されている場合、Cloud Bigtable は PageFilterMUST_PASS_ALL として扱い、PageFilter の pageSize に対応する行数を返すだけです。
  6. ほとんどの場合、PrefixFilterPrefixFilter 内の行をスキャンします。ただし、PrefixFilterFilterList の一部であり、演算子 MUST_PASS_ONE を含む場合、Cloud Bigtable ではこの場合が意味する範囲を判別できません。代わりに、開始列から停止列までをフィルタなしでスキャンします。この場合、PrefixFilterBigtableExtendedScan またはフィルタの組み合わせと併用すると、パフォーマンスを最適化できます。
  7. Cloud 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

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

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

タイムスタンプ

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

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

管理

このセクションでは、インターフェース org.apache.hadoop.hbase.client.Admin のメソッドのうち、Cloud Bigtable では使用できないメソッドや、Cloud Bigtable では HBase と異なる動作をするメソッドについて説明します。

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

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

Cloud 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)

地域グループ

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

名前空間

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

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

リージョン管理

Cloud Bigtable では、リージョンに類似したタブレットが使用されています。Cloud 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)

スナップショット

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

  • cloneSnapshot(byte[] snapshotName, TableName tableName)
  • cloneSnapshot(String snapshotName, TableName tableName)
  • deleteSnapshot(byte[] snapshotName)
  • deleteSnapshot(String snapshotName)
  • deleteSnapshots(Pattern pattern)
  • deleteSnapshots(String regex)
  • isSnapshotFinished(HBaseProtos.SnapshotDescription snapshot)
  • listSnapshots()
  • listSnapshots(Pattern pattern)
  • listSnapshots(String regex)
  • restoreSnapshot(byte[] snapshotName)
  • restoreSnapshot(String snapshotName)
  • restoreSnapshot(byte[] snapshotName, boolean takeFailSafeSnapshot)
  • restoreSnapshot(String snapshotName, boolean takeFailSafeSnapshot)
  • snapshot(HBaseProtos.SnapshotDescription snapshot)
  • snapshot(byte[] snapshotName, TableName tableName)
  • snapshot(String snapshotName, TableName tableName)
  • snapshot(String snapshotName, TableName tableName, HBaseProtos.SnapshotDescription.Type type)
  • takeSnapshotAsync(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)

コプロセッサ

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

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

分散プロシージャ

Cloud 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)