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.

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.

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 die Familiennamen ändern, um diesem Muster zu folgen.

Zeilen und Zellen

  • Sie können für eine individuelle Zeile keine ACL definieren.
  • 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.

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.
  • Das Löschen von einer spezielle Version einer speziellen Spalte auf Basis ihres Zeitstempels wird unterstützt, das Löschen aller Werte mit einem speziellen Zeitstempel in einer gegebenen Spaltenfamilie jedoch nicht. Die folgenden Methoden in der Klasse org.apache.hadoop.hbase.client.Delete werden 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 aufgeführt. Alle diese Filter befinden sich im Paket org.apache.hadoop.hbase.filter.

Unterstützt Mit Einschränkungen unterstützt Nicht unterstützt
  1. Unterstützt nur eine Spaltenfamilie.
  2. Das Aufrufen von setLenAsVal(true) wird nicht unterstützt.
  3. Unterstützt nur den Vergleichsoperator BinaryComparator. Wenn Sie einen anderen Operator als EQUAL verwenden, wird nur eine einzelne Spaltenfamilie unterstützt.
  4. Unterstützt nur die folgenden Vergleichsoperatoren:
    • BinaryComparator
    • RegexStringComparator ohne Flags (Flags werden ignoriert) und den Operator EQUAL
  5. Wenn sich ein PageFilter in einer FilterList befindet, funktioniert PageFilter nur dann ähnlich wie HBase, wenn die FilterList auf MUST_PASS_ALL gesetzt ist. Dies ist das Standardverhalten. Wenn die FilterList auf MUST_PASS_ONE gesetzt ist, behandelt Bigtable den PageFilter als MUST_PASS_ALL und gibt nur eine Anzahl von Zeilen zurück, die der "pageSize" des PageFilter entsprechen.
  6. 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.
  7. Hängt vom Bigtable-Bedingungsfilter ab, der langsam sein kann. Unterstützt, aber nicht empfohlen.
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

Zusätzlich wirkt sich Folgendes auf die Filter in Bigtable 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.
  • Für Filterausdrücke gilt ein Größenlimit von 20 KB. Verwenden Sie als Behelfslösung zur Reduzierung der Größe eines Filterausdrucks eine zusätzliche Spalte, in der der Hashwert der Filterkriterien gespeichert ist.

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 werden Methoden in der Schnittstelle org.apache.hadoop.hbase.client.Admin beschrieben, die in Bigtable nicht verfügbar sind oder sich in Bigtable anders verhalten als in HBase. Diese Listen sind nicht vollständig und spiegeln möglicherweise nicht die zuletzt hinzugefügten HBase API-Methoden wider.

Die meisten dieser Methoden sind für Bigtable nicht nötig, da Verwaltungsaufgaben automatisch ausgeführt werden. Einige Methoden sind nicht verfügbar, weil sie sich auf Funktionen beziehen, die von Bigtable nicht unterstützt werden.

Allgemeine Wartungsaufgaben

Bigtable führt die meisten Wartungsaufgaben automatisch aus. Daher sind folgende Methoden nicht verfügbar:

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

Ortsgruppen

In Bigtable können Sie keine Ortsgruppen für Spaltenfamilien angeben. Daher können Sie HBase-Methoden, die eine Ortsgruppe zurückgeben, nicht aufrufen.

Namespaces

Bigtable verwendet keine Namespaces. Sie können aber mit Zeilenschlüsselpräfixen Namespaces simulieren. Die folgenden Methoden sind nicht verfügbar:

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

Regionsverwaltung

Bigtable verwendet Tabellenreihen, die Regionen ähneln. Bigtable verwaltet Ihre Tabellenreihen automatisch. Daher sind folgende Methoden nicht verfügbar:

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

Snapshots

Die folgenden Methoden sind nicht verfügbar:

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

Tabellenverwaltung

Aufgaben wie die Tabellenkompression werden automatisch ausgeführt. Daher sind folgende Methoden nicht verfügbar:

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

Koprozessoren

Bigtable unterstützt keine Koprozessoren. Daher sind folgende Methoden nicht verfügbar:

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

Verteilte Vorgänge

Bigtable unterstützt keine verteilten Vorgänge. Daher sind folgende Methoden nicht verfügbar:

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