Unterschiede zwischen HBase und Cloud Bigtable

Eine Möglichkeit, auf Cloud 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 Cloud 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. Cloud 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 Cloud Bigtable jedoch proprietäre Kompressionsmethoden für alle Ihre Daten.

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 Cloud 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. Cloud Bigtable maskiert Puts nach Löschvorgängen hingegen nicht, wenn PUT-Anfragen nach Löschanfragen gesendet werden. Das heißt, dass in Cloud 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

Die folgende Tabelle zeigt, welche Filter aktuell unterstützt werden. 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 Cloud 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 Cloud 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 Cloud 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 Cloud 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.
  • Umgekehrte Scans werden nicht unterstützt. Sie können die Methode org.apache.hadoop.hbase.filter.Filter#setReversed(boolean reversed) nicht aufrufen.
  • 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

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

Die Clientbibliothek konvertiert zwischen Mikrosekunden und Millisekunden. Da aber der größte HBase-Zeitstempel, den Cloud 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 Cloud Bigtable nicht verfügbar sind oder sich in Cloud Bigtable anders verhalten als in HBase.

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

Allgemeine Wartungsaufgaben

Cloud 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 Cloud Bigtable können Sie keine Ortsgruppen für Spaltenfamilien angeben. Daher können Sie HBase-Methoden, die eine Ortsgruppe zurückgeben, nicht aufrufen.

Namespaces

Cloud 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

Cloud Bigtable verwendet Tabellenreihen, die Regionen ähneln. Cloud 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 derzeit nicht verfügbar:

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

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

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

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

Verteilte Vorgänge

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