Unterschiede zwischen HBase und Bigtable

Eine Möglichkeit, auf Bigtable zuzugreifen, ist die Verwendung einer angepassten Version des Apache HBase-Clients für Java. Allgemein stellt der angepasste Client die gleiche API wie eine Standardinstallation von HBase zur Verfügung. Auf dieser Seite werden die Unterschiede zwischen dem Cloud Bigtable-HBase-Client für Java und einer Standard-HBase-Installation beschrieben. Viele dieser Unterschiede hängen mit Verwaltungsaufgaben zusammen, die Bigtable automatisch ausführt.

Der Cloud Bigtable-HBase-Client für Java ist für Kunden gedacht, die von HBase zu Bigtable migrieren und die HBase API weiterhin verwenden möchten. In allen anderen Fällen sollten Java-Entwickler stattdessen den Cloud Bigtable-Client für Java verwenden, der die Bigtable APIs aufruft.

Spaltenfamilien

Wenn Sie eine Spaltenfamilie erstellen, können Sie die Blockgröße oder Kompressionsmethode nicht konfigurieren, und zwar weder mit der HBase-Shell noch der HBase-API. Bigtable verwaltet die Blockgröße und Kompression eigenständig.

Außerdem meldet die HBase-Shell, wenn Sie darüber Informationen zu einer Tabelle abfragen, immer für jede Spaltenfamilie, dass diese keine Kompression verwendet. Tatsächlich verwendet Bigtable jedoch proprietäre Kompressionsmethoden für alle Ihre Daten.

Die folgenden Einstellungen für Spaltenfamilien werden ignoriert, da Bigtable den zugrunde liegenden Speicher für Sie verwaltet:

  • 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

Die Einstellungen VERSIONS, MIN_VERSIONS und TTL werden in Richtlinien für die automatische Speicherbereinigung von Bigtable konvertiert.

Bigtable erfordert, dass Namen von Spaltenfamilien dem regulären Ausdruck [_a-zA-Z0-9][-_.a-zA-Z0-9]* folgen. Wenn Sie Daten aus HBase in Bigtable importieren, müssen Sie möglicherweise zuerst die Familiennamen so ändern, dass sie diesem Muster entsprechen.

Zeilen und Zellen

  • Sie können für eine individuelle Zeile keine ACL definieren. Mit autorisierten Bigtable-Ansichten können Sie Zugriff auf eine Teilmenge der Daten einer Tabelle gewähren. Diese werden jedoch nicht über die HBase API bereitgestellt.
  • Sie können die Sichtbarkeit von einzelnen Zellen nicht einstellen.
  • Tags werden nicht unterstützt. Mit der Klasse org.apache.hadoop.hbase.Tag können Sie einzelnen Zellen keine Metadaten hinzufügen. Alle Tags, die Sie einer Zelle hinzufügen, werden vor dem Schreiben der Zelle gelöscht.

Mutationen und Löschungen

  • Append-Vorgänge in Bigtable sind sowohl für Leser als auch für Autoren vollständig atomar. Leser können einen teilweise angewendeten Append-Vorgang jedoch nie lesen.
  • Increment-Vorgänge sind atomar, aber das Festlegen eines Zeitraums für einen Increment wird nicht unterstützt.
  • Ein RowMutations-Objekt, das Sie an Table#mutateRow() übergeben, kann entweder Put- und Delete-Vorgänge oder Append- und Increment-Vorgänge enthalten, aber nicht beides. RowMutations-Objekte, die Append- oder Increment-Vorgänge enthalten, werden in batch(), checkAndMutate() oder BufferedMutator nicht unterstützt.
  • Das Löschen einer bestimmten Version einer bestimmten Spalte anhand ihres Zeitstempels wird unterstützt. Die folgenden Arten von Löschungen werden jedoch nicht unterstützt:

    • Nur die aktuelle Version einer Spalte löschen
    • Alle Werte in einer Zeile mit einem bestimmten Zeitstempel löschen
    • Alle Werte in einer Spaltenfamilie mit einem bestimmten Zeitstempel oder einem Zeitstempel davor löschen

    Daher werden die folgenden Methoden in der Klasse org.apache.hadoop.hbase.client.Delete nicht unterstützt: + new Delete(byte[] row, long timestamp) + addColumn(byte[] family, byte[] qualifier) + addFamily(byte[] family, long timestamp) + addFamilyVersion(byte[] family, long timestamp)

  • In HBase werden Puts von Löschvorgängen maskiert. Bigtable maskiert Puts nach Löschvorgängen hingegen nicht, wenn PUT-Anfragen nach Löschanfragen gesendet werden. Das heißt, dass in Bigtable eine an eine Zelle gesendete Schreibanfrage nicht von einer zuvor an dieselbe Zelle gesendeten Löschanfrage betroffen ist.

Gets und Scans

Koprozessoren

Koprozessoren werden nicht unterstützt. Sie können keine Klassen erstellen, die die Schnittstelle org.apache.hadoop.hbase.coprocessor implementieren.

Filter

In der folgenden Tabelle sind die unterstützten Filter im Paket org.apache.hadoop.hbase.filter aufgeführt. Alle anderen Filter in diesem Paket werden nicht unterstützt und lösen einen UnsupportedOperationException aus.

Unterstützt Mit Einschränkungen unterstützt
  1. PrefixFilter sucht in den meisten Fällen nach Zeilen im PrefixFilter. Wenn PrefixFilter aber Teil einer FilterList ist und den Operator MUST_PASS_ONE hat, kann Bigtable den implizierten Bereich nicht ermitteln und führt stattdessen einen ungefilterten Scan von der Startzeile bis zur Stoppzeile durch. Verwenden Sie PrefixFilter mit BigtableExtendedScan oder eine Kombination von Filtern, um die Leistung in diesem Fall zu optimieren.
  2. Erfordert nur dann eine einzelne Spaltenfamilie, wenn Sie einen Spaltenqualifizierer als Spalten-Offset verwenden.
  3. Unterstützt nur eine Spaltenfamilie.
  4. Unterstützt nur den Operator EQUAL, entweder mit dem Vergleichsoperator BinaryComparator oder dem Vergleichsoperator RegexStringComparator.
  5. Das Erstellen des Filters mit new KeyOnlyFilter(true) wird nicht unterstützt.
  6. Kann nicht Teil einer FilterList sein, die den Operator MUST_PASS_ONE verwendet.
  7. Ein PageFilter muss der Filter auf oberster Ebene oder der letzte Filter in einem FilterList auf oberster Ebene sein, der den Operator MUST_PASS_ALL verwendet. Dies ist das Standardverhalten. Ein PageFilter in einem FilterList, der den Operator MUST_PASS_ONE verwendet, wird nicht unterstützt.
  8. Unterstützt nur den Vergleichsoperator BinaryComparator oder den Vergleichsoperator RegexStringComparator mit dem Operator EQUAL. Wenn ein anderer Operator als EQUAL verwendet wird, wird nur eine einzelne Spaltenfamilie unterstützt.
  9. Unterstützt nur die folgenden Vergleichsoperatoren:
    • BinaryComparator
    • RegexStringComparator ohne Flags (Flags werden ignoriert) und den Operator EQUAL
  10. Hängt vom Bigtable-Bedingungsfilter ab, der langsam sein kann. Unterstützt, aber nicht empfohlen.
  11. Pro Scan wird nur ein WhileMatchFilter unterstützt.
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

Zusätzlich wirkt sich Folgendes auf die Filter in Bigtable aus:

  • Es werden nur die Vergleichsoperatoren BinaryComparator und RegexStringComparator unterstützt. Alle anderen Vergleichsoperatoren werden nicht unterstützt und lösen einen UnsupportedOperationException aus.
  • In Filtern mit dem vergleichsoperator für reguläre Ausdrücke (org.apache.hadoop.hbase.filter.RegexStringComparator) verwenden reguläre Ausdrücke die RE2-Syntax und nicht die Java-Syntax.
  • Benutzerdefinierte Filter werden nicht unterstützt. Sie können keine Klassen erstellen, die von org.apache.hadoop.hbase.filter.Filter Daten übernehmen. Wenn Sie einen Bigtable-Filter verwenden möchten, für den es kein HBase-Äquivalent gibt, verpacken Sie ihn in einen com.google.cloud.bigtable.hbase.filter.BigtableFilter.
  • Für Filterausdrücke gilt eine Größenbeschränkung von 20 KB. Filter dürfen nicht mehr als 20 Ebenen tief verschachtelt sein. Als Behelfslösung zur Reduzierung der Größe eines Filterausdrucks können Sie eine zusätzliche Spalte verwenden, in der der Hash-Wert der Filterkriterien gespeichert wird.

Zeitstempel

Bigtable speichert Zeitstempel in Mikrosekunden. HBase speichert Zeitstempel hingegen in Millisekunden. Diese Unterscheidung hat Auswirkungen, wenn Sie die HBase-Clientbibliothek für Bigtable verwenden und Daten mit umgekehrten Zeitstempeln vorliegen.

Die Clientbibliothek konvertiert zwischen Mikrosekunden und Millisekunden. Da aber der größte HBase-Zeitstempel, den Bigtable speichern kann, Long.MAX_VALUE/1000 ist, wird jeder größere Wert in Long.MAX_VALUE/1000 konvertiert. Große umgekehrte Zeitstempelwerte werden deshalb möglicherweise nicht richtig konvertiert.

Verwaltung

In diesem Abschnitt wird beschrieben, wie der Bigtable-HBase-Client für Java die Schnittstelle org.apache.hadoop.hbase.client.Admin implementiert. Da Bigtable die meisten Cluster- und Speicherverwaltungsaufgaben automatisch ausführt, sind viele HBase-Verwaltungsmethoden nicht anwendbar. Alle Admin-Methoden, die in diesem Abschnitt nicht als unterstützt oder als ohne Auswirkung aufgeführt sind, werden nicht unterstützt und geben einen UnsupportedOperationException aus.

Tabellenverwaltung

Die folgenden Admin-Methoden zum Verwalten von Tabellen und Spaltenfamilien werden unterstützt:

  • addColumnFamily(TableName tableName, ColumnFamilyDescriptor columnFamily) und 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) und createTableAsync(TableDescriptor desc, byte[][] splitKeys)
  • deleteColumnFamily(TableName tableName, byte[] columnName) und deleteColumnFamilyAsync(TableName tableName, byte[] columnName) (HBase 1.x: deleteColumn(TableName tableName, byte[] columnName))
  • deleteTable(TableName tableName), deleteTableAsync(TableName tableName), deleteTables(Pattern pattern) und deleteTables(String regex)
  • disableTable(TableName tableName), disableTableAsync(TableName tableName), disableTables(Pattern pattern) und disableTables(String regex)
  • enableTable(TableName tableName), enableTableAsync(TableName tableName), enableTables(Pattern pattern) und enableTables(String regex)
  • getAlterStatus(TableName tableName) und getAlterStatus(byte[] tableName)
  • getDescriptor(TableName tableName), getTableDescriptor(TableName tableName), getTableDescriptors(List<String> names) und getTableDescriptorsByTableName(List<TableName> tableNames)
  • isTableAvailable(TableName tableName) und isTableAvailable(TableName tableName, byte[][] splitKeys)
  • isTableDisabled(TableName tableName) und isTableEnabled(TableName tableName)
  • listTableDescriptors(), listTableDescriptors(List<TableName> tableNames), listTableDescriptors(Pattern pattern) und listTableDescriptors(Pattern pattern, boolean includeSysTables) (HBase 1.x: listTables(), listTables(Pattern pattern), listTables(Pattern pattern, boolean includeSysTables), listTables(String regex) und listTables(String regex, boolean includeSysTables))
  • listTableNames(), listTableNames(Pattern pattern), listTableNames(Pattern pattern, boolean includeSysTables), listTableNames(String regex) und listTableNames(String regex, boolean includeSysTables)
  • modifyColumnFamily(TableName tableName, ColumnFamilyDescriptor columnFamily) und modifyColumnFamilyAsync(TableName tableName, ColumnFamilyDescriptor columnFamily) (HBase 1.x: modifyColumn(TableName tableName, HColumnDescriptor column))
  • modifyTable(TableDescriptor td), modifyTable(TableName tableName, TableDescriptor td), modifyTableAsync(TableDescriptor td) und modifyTableAsync(TableName tableName, TableDescriptor td)
  • tableExists(TableName tableName)
  • truncateTable(TableName tableName, boolean preserveSplits) und truncateTableAsync(TableName tableName, boolean preserveSplits)

Die folgenden unterstützten Methoden zur Tabellenverwaltung verhalten sich in Bigtable anders oder ignorieren bestimmte Parameter:

  • Bigtable-Tabellen können nicht deaktiviert werden. disableTable(), disableTableAsync(), disableTables(), enableTable(), enableTableAsync() und enableTables() ändern den Status der Tabelle nur im Arbeitsspeicher des Clients (der von isTableDisabled() und isTableEnabled() gelesen wird).
  • modifyTable() und modifyTableAsync() wenden nur Änderungen auf Spaltenfamilien an. Attribute auf Tabellenebene werden ignoriert.
  • Mit truncateTable() und truncateTableAsync() werden alle Daten in der Tabelle gelöscht. Der Parameter preserveSplits wird ignoriert.
  • Überladungen von listTableDescriptors(), listTables() und listTableNames(), die einen includeSysTables-Parameter akzeptieren, ignorieren includeSysTables, da Bigtable keine Systemtabellen hat.
  • isTableAvailable(TableName tableName, byte[][] splitKeys) prüft nur, ob die Tabelle vorhanden ist, und ignoriert den Parameter splitKeys.
  • getAlterStatus() gibt immer (0, 0) zurück, da Schemaänderungen in Bigtable synchron sind.

Aufgaben wie das Komprimieren und Aufteilen von Tabellen werden automatisch ausgeführt. Daher haben die folgenden Methoden keine Auswirkungen:

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

Snapshots

Mit HBase-Snapshot-Methoden werden Bigtable-Sicherungen erstellt und verwaltet. Da Sicherungen in einem bestimmten Cluster gespeichert werden, müssen Sie die Konfigurationseigenschaft google.bigtable.snapshot.cluster.id auf den zu verwendenden Cluster festlegen, wenn Ihre Instanz mehr als einen Cluster hat. Sicherungen, die Sie mit snapshot() erstellen, laufen nach der Anzahl von Sekunden ab, die in der Konfigurationseigenschaft google.bigtable.snapshot.default.ttl.secs angegeben ist (standardmäßig 24 Stunden). cloneSnapshot() stellt eine Sicherung in einer neuen Tabelle wieder her.

Die folgenden Snapshot-Methoden werden in Admin unterstützt:

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

Darüber hinaus unterstützt AsyncAdmin listSnapshots(), listSnapshots(Pattern pattern) und snapshot(SnapshotDescription snapshot). Alle anderen Snapshot-Methoden, einschließlich restoreSnapshot(), deleteSnapshots(), deleteTableSnapshots(), listTableSnapshots() und cloneSnapshot(String snapshotName, TableName tableName, boolean restoreAcl), werden nicht unterstützt und geben einen UnsupportedOperationException aus.

Regionsverwaltung

Bigtable verwendet Tabellenreihen, die Regionen ähneln. Die folgenden Methoden zum Abrufen von Regionsinformationen werden unterstützt, wobei es Unterschiede zu Standard-HBase gibt:

  • getRegions(TableName tableName) und getTableRegions(TableName tableName) sowie die Methoden in der Schnittstelle org.apache.hadoop.hbase.client.RegionLocator geben ungefähre Grenzen basierend auf einer Stichprobe von Zeilenschlüsseln in der Tabelle zurück. Die Servernamen in den zurückgegebenen Regionen sind keine echten Server.
  • getRegionMetrics(ServerName serverName, TableName tableName) ignoriert den Parameter serverName und gibt ungefähre Messwerte für die Regionsgröße zurück, die auf einer Stichprobe von Zeilenschlüsseln in der Tabelle basieren.

Da Bigtable Ihre Tablets automatisch verwaltet, haben die folgenden Methoden keine Auswirkungen:

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

In HBase 1.x haben compactRegionServer(ServerName sn, boolean major), mergeRegions(byte[] encodedNameOfRegionA, byte[] encodedNameOfRegionB, boolean forcible), move(byte[] encodedRegionName, byte[] destServerName) und unassign(byte[] regionName, boolean force) ebenfalls keine Auswirkungen. Die entsprechenden HBase 2.x-Äquivalente werden nicht unterstützt und geben einen UnsupportedOperationException aus.

Clusterstatus und -verbindung

Bigtable führt Clusterwartungsaufgaben automatisch aus. Daher wird bei Wartungsmethoden in Admin eine UnsupportedOperationException ausgegeben. Es werden nur die folgenden Verbindungs- und Statusmethoden unterstützt:

  • close() hat keine Auswirkungen.
  • getClusterMetrics(), getClusterMetrics(EnumSet<Option> options) und getClusterStatus() geben Platzhalterwerte mit leeren Serverlisten zurück und getClusterMetrics(EnumSet<Option> options) ignoriert den Parameter options.
  • getConfiguration() gibt das Clientobjekt Configuration zurück.
  • getConnection() gibt das Clientobjekt Connection zurück.

Namespaces

Bigtable verwendet keine Namespaces. Sie können aber mit Zeilenschlüsselpräfixen Namespaces simulieren.

Standardmäßig lösen alle Namespace-Methoden einen UnsupportedOperationException aus. Wenn Sie jedoch die Konfigurationseigenschaft google.bigtable.namespace.warnings auf true festlegen, wird bei den folgenden Methoden eine Warnung protokolliert und sie haben keine Auswirkungen (sie geben null oder ein leeres Ergebnis zurück), anstatt eine Ausnahme auszulösen:

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

Auch wenn google.bigtable.namespace.warnings auf true festgelegt ist, wird von listNamespaces() ein UnsupportedOperationException ausgegeben.

Weitere Verwaltungsfunktionen

Bigtable unterstützt keine Admin-Methoden in den folgenden Kategorien. Wenn Sie sie aufrufen, wird ein UnsupportedOperationException-Fehler ausgegeben:

  • Lokalitätsgruppen: In Bigtable können Sie keine Lokalitätsgruppen für Spaltenfamilien angeben.
  • Coprozessoren und verteilte Vorgänge: Bigtable unterstützt keine Coprozessoren oder verteilten Vorgänge.
  • Kontingente: Informationen zu Bigtable-Kontingenten finden Sie unter Kontingente und Limits.
  • Replikation: Bigtable repliziert Daten automatisch zwischen den Clustern in einer Instanz. Weitere Informationen finden Sie unter Replikation – Übersicht. Informationen zur Replikation von HBase zu Bigtable finden Sie unter Von HBase in Bigtable replizieren.
  • Zugriffssteuerung: Bigtable verwendet IAM für die Zugriffssteuerung.
  • RegionServer-Gruppen: Bigtable verwaltet Server automatisch und stellt keine RegionServer-Gruppen bereit.