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:
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
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.Tagkö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 angewendetenAppend-Vorgang jedoch nie lesen.Increment-Vorgänge sind atomar, aber das Festlegen eines Zeitraums für einenIncrementwird nicht unterstützt.- Ein
RowMutations-Objekt, das Sie anTable#mutateRow()übergeben, kann entwederPut- undDelete-Vorgänge oderAppend- undIncrement-Vorgänge enthalten, aber nicht beides.RowMutations-Objekte, dieAppend- oderIncrement-Vorgänge enthalten, werden inbatch(),checkAndMutate()oderBufferedMutatornicht 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.Deletenicht 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
- Mit umgekehrten Scans können Sie einen Bereich von Zeilen rückwärts lesen. Weitere Informationen finden Sie unter Umgekehrte Scans.
- Im Gegensatz zu HBase filtert Bigtable beim Senden einer Leseanfrage nicht automatisch abgelaufene Daten heraus, die für die Löschung in einem anstehenden automatischen Speicherbereinigungszyklus markiert sind. Verwenden Sie einen Filter in der Leseanfrage, um das Lesen abgelaufener Daten zu vermeiden. Weitere Informationen finden Sie in der Übersicht über die automatische Speicherbereinigung.
- Die Begrenzung der Anzahl der Werte pro Zeile pro Spaltenfamilie wird nicht unterstützt. Sie können die Methode
org.apache.hadoop.hbase.client.Scan#setMaxResultsPerColumnFamily(int limit)nicht aufrufen. - Teilergebnisse werden nicht unterstützt. Zeilen werden immer vollständig zurückgegeben. Aufrufe der Methoden
org.apache.hadoop.hbase.client.Scan#setBatch(int batch)undorg.apache.hadoop.hbase.client.Scan#setAllowPartialResults(boolean allowPartialResults)werden ignoriert. - Bei einem synchronen
Table#getScanner(Scan)-Aufruf steuertorg.apache.hadoop.hbase.client.Scan#setCaching(int caching), wie viele Zeilen der Client gleichzeitig abruft.AsyncTable#getScanner()ignoriertsetCaching(). Aufrufe der Methodeorg.apache.hadoop.hbase.client.Scan#setMaxResultSize(long maxResultSize)werden immer ignoriert.
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 |
|---|---|
|
|
ColumnCountGetFilterColumnPrefixFilterFilterListFirstKeyOnlyFilterFuzzyRowFilterMultipleColumnPrefixFilterPrefixFilter 1RandomRowFilterTimestampsFilter
|
ColumnPaginationFilter 2ColumnRangeFilter 3FamilyFilter 4KeyOnlyFilter 5MultiRowRangeFilter 6PageFilter 7QualifierFilter 8RowFilter 4SingleColumnValueExcludeFilter 3, 9, 10SingleColumnValueFilter 9, 10ValueFilter 9WhileMatchFilter 6, 11
|
Zusätzlich wirkt sich Folgendes auf die Filter in Bigtable aus:
- Es werden nur die Vergleichsoperatoren
BinaryComparatorundRegexStringComparatorunterstützt. Alle anderen Vergleichsoperatoren werden nicht unterstützt und lösen einenUnsupportedOperationExceptionaus. - 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.FilterDaten übernehmen. Wenn Sie einen Bigtable-Filter verwenden möchten, für den es kein HBase-Äquivalent gibt, verpacken Sie ihn in einencom.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)undaddColumnFamilyAsync(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)undcreateTableAsync(TableDescriptor desc, byte[][] splitKeys)deleteColumnFamily(TableName tableName, byte[] columnName)unddeleteColumnFamilyAsync(TableName tableName, byte[] columnName)(HBase 1.x:deleteColumn(TableName tableName, byte[] columnName))deleteTable(TableName tableName),deleteTableAsync(TableName tableName),deleteTables(Pattern pattern)unddeleteTables(String regex)disableTable(TableName tableName),disableTableAsync(TableName tableName),disableTables(Pattern pattern)unddisableTables(String regex)enableTable(TableName tableName),enableTableAsync(TableName tableName),enableTables(Pattern pattern)undenableTables(String regex)getAlterStatus(TableName tableName)undgetAlterStatus(byte[] tableName)getDescriptor(TableName tableName),getTableDescriptor(TableName tableName),getTableDescriptors(List<String> names)undgetTableDescriptorsByTableName(List<TableName> tableNames)isTableAvailable(TableName tableName)undisTableAvailable(TableName tableName, byte[][] splitKeys)isTableDisabled(TableName tableName)undisTableEnabled(TableName tableName)listTableDescriptors(),listTableDescriptors(List<TableName> tableNames),listTableDescriptors(Pattern pattern)undlistTableDescriptors(Pattern pattern, boolean includeSysTables)(HBase 1.x:listTables(),listTables(Pattern pattern),listTables(Pattern pattern, boolean includeSysTables),listTables(String regex)undlistTables(String regex, boolean includeSysTables))listTableNames(),listTableNames(Pattern pattern),listTableNames(Pattern pattern, boolean includeSysTables),listTableNames(String regex)undlistTableNames(String regex, boolean includeSysTables)modifyColumnFamily(TableName tableName, ColumnFamilyDescriptor columnFamily)undmodifyColumnFamilyAsync(TableName tableName, ColumnFamilyDescriptor columnFamily)(HBase 1.x:modifyColumn(TableName tableName, HColumnDescriptor column))modifyTable(TableDescriptor td),modifyTable(TableName tableName, TableDescriptor td),modifyTableAsync(TableDescriptor td)undmodifyTableAsync(TableName tableName, TableDescriptor td)tableExists(TableName tableName)truncateTable(TableName tableName, boolean preserveSplits)undtruncateTableAsync(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()undenableTables()ändern den Status der Tabelle nur im Arbeitsspeicher des Clients (der vonisTableDisabled()undisTableEnabled()gelesen wird). modifyTable()undmodifyTableAsync()wenden nur Änderungen auf Spaltenfamilien an. Attribute auf Tabellenebene werden ignoriert.- Mit
truncateTable()undtruncateTableAsync()werden alle Daten in der Tabelle gelöscht. Der ParameterpreserveSplitswird ignoriert. - Überladungen von
listTableDescriptors(),listTables()undlistTableNames(), die einenincludeSysTables-Parameter akzeptieren, ignorierenincludeSysTables, da Bigtable keine Systemtabellen hat. isTableAvailable(TableName tableName, byte[][] splitKeys)prüft nur, ob die Tabelle vorhanden ist, und ignoriert den ParametersplitKeys.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)undgetTableRegions(TableName tableName)sowie die Methoden in der Schnittstelleorg.apache.hadoop.hbase.client.RegionLocatorgeben 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 ParameterserverNameund 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)undgetClusterStatus()geben Platzhalterwerte mit leeren Serverlisten zurück undgetClusterMetrics(EnumSet<Option> options)ignoriert den Parameteroptions.getConfiguration()gibt das ClientobjektConfigurationzurück.getConnection()gibt das ClientobjektConnectionzurü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.