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 では、列ファミリー名が正規表現 [_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 では、セルに送信された書き込みリクエストは、以前に同じセルに送信された削除リクエストの影響を受けません。
取得とスキャン
- リバース スキャンでは、行の範囲を逆方向に読み取ることができます。詳細については、リバース スキャンをご覧ください。
- HBase とは異なり、Bigtable では、読み取りリクエストを送信しても、次のガベージ コレクション サイクルで削除対象としてマークされている期限切れのデータが自動的に除外されることはありません。期限切れのデータを読み取らないようにするには、読み取りリクエストでフィルタを使用します。詳細については、ガベージ コレクションの概要をご覧ください。
- タイムスタンプ範囲内の列ファミリーのバージョンのクエリはサポートされていません。以下のメソッドを呼び出すことはできません。
org.apache.hadoop.hbase.client.Query#setColumnFamilyTimeRange(byte[] cf, long minStamp, long maxStamp)org.apache.hadoop.hbase.client.Get#setColumnFamilyTimeRange(byte[] cf, long minStamp, long maxStamp)org.apache.hadoop.hbase.client.Scan#setColumnFamilyTimeRange(byte[] cf, long minStamp, long maxStamp)
- 列ファミリーの行ごとの値の数を制限することはサポートされていません。メソッド
org.apache.hadoop.hbase.client.Scan#setMaxResultsPerColumnFamily(int limit)を呼び出すことはできません。 next()の呼び出しごとに返すセルの最大数の設定はサポートされていません。メソッドorg.apache.hadoop.hbase.client.Scan#setBatch(int batch)の呼び出しは無視されます。- キャッシュ保存する行数の設定はサポートされていません。メソッド
org.apache.hadoop.hbase.client.Scan#setCaching(int caching)の呼び出しは無視されます。
コプロセッサ
コプロセッサはサポートされていません。インターフェース org.apache.hadoop.hbase.coprocessor を実装するクラスは作成できません。
フィルタ
サポートされているフィルタを次の表に示します。これらのフィルタはすべてパッケージ org.apache.hadoop.hbase.filter に入っています。
| サポート対象 | 制限付きでサポート | サポート対象外 |
|---|---|---|
|
||
ColumnPrefixFilterFamilyFilterFilterListFuzzyRowFilterMultipleColumnPrefixFilterMultiRowRangeFilterPrefixFilter 6RandomRowFilterTimestampsFilter
|
ColumnCountGetFilter 1ColumnPaginationFilter 1ColumnRangeFilter 1FirstKeyOnlyFilter 1KeyOnlyFilter 2PageFilter 5QualifierFilter 3RowFilter 1, 4SingleColumnValueExcludeFilter 1, 4, 7SingleColumnValueFilter 4, 7ValueFilter 4
|
DependentColumnFilterFirstKeyValueMatchingQualifiersFilterInclusiveStopFilterParseFilterSkipFilterWhileMatchFilter |
また、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)