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 が基盤となるストレージを管理するため、次の列ファミリーの設定は無視されます。
BLOCKCACHEBLOCKSIZEBLOOMFILTERCACHE_BLOOMS_ON_WRITECACHE_DATA_IN_L1CACHE_DATA_ON_WRITECACHE_INDEX_ON_WRITECOMPRESS_TAGSCOMPRESSIONCOMPRESSION_COMPACTDATA_BLOCK_ENCODINGEVICT_BLOCKS_ON_CLOSEIN_MEMORYKEEP_DELETED_CELLSPREFETCH_BLOCKS_ON_OPENREPLICATION_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 では、セルに送信された書き込みリクエストは、以前に同じセルに送信された削除リクエストの影響を受けません。
取得とスキャン
- リバース スキャンでは、行の範囲を逆方向に読み取ることができます。詳細については、リバース スキャンをご覧ください。
- HBase とは異なり、読み取りリクエストを送信すると、Bigtable は、今後のガベージ コレクション サイクルで削除対象としてマークされている期限切れのデータを自動的に除外しません。期限切れのデータを読み取らないようにするには、読み取りリクエストでフィルタを使用します。詳細については、ガベージ コレクションの概要をご覧ください。
- 列ファミリーの行ごとの値の数を制限することはサポートされていません。メソッド
org.apache.hadoop.hbase.client.Scan#setMaxResultsPerColumnFamily(int limit)を呼び出すことはできません。 - 部分的な結果はサポートされていません。行は常に全体が返されます。
org.apache.hadoop.hbase.client.Scan#setBatch(int batch)メソッドとorg.apache.hadoop.hbase.client.Scan#setAllowPartialResults(boolean allowPartialResults)メソッドの呼び出しは無視されます。 - 同期
Table#getScanner(Scan)呼び出しでは、org.apache.hadoop.hbase.client.Scan#setCaching(int caching)はクライアントが一度に取得する行数を制御します。AsyncTable#getScanner()はsetCaching()を無視します。org.apache.hadoop.hbase.client.Scan#setMaxResultSize(long maxResultSize)メソッドの呼び出しは常に無視されます。
コプロセッサ
コプロセッサはサポートされていません。インターフェース org.apache.hadoop.hbase.coprocessor を実装するクラスは作成できません。
フィルタ
次の表に、パッケージ org.apache.hadoop.hbase.filter でサポートされているフィルタを示します。そのパッケージ内の他のすべてのフィルタはサポートされておらず、UnsupportedOperationException をスローします。
| サポート対象 | 制限付きでサポート |
|---|---|
|
|
ColumnCountGetFilterColumnPrefixFilterFilterListFirstKeyOnlyFilterFuzzyRowFilterMultipleColumnPrefixFilterPrefixFilter 1RandomRowFilterTimestampsFilter
|
ColumnPaginationFilter 2ColumnRangeFilter 3FamilyFilter 4KeyOnlyFilter 5MultiRowRangeFilter 6PageFilter 7QualifierFilter 8RowFilter 4SingleColumnValueExcludeFilter 3、9、10SingleColumnValueFilter 9、10ValueFilter 9WhileMatchFilter 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 グループを公開しません。