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 angewendetenAppend
-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
- Mit umgekehrten Scans können Sie einen Zeilenbereich rückwärts lesen. Weitere Informationen finden Sie unter Reverse-Scans.
- Im Gegensatz zu HBase werden in Bigtable beim Senden einer Leseanfrage nicht automatisch abgelaufene Daten herausgefiltert, die in einem anstehenden Zyklus der automatischen Speicherbereinigung zum Löschen markiert sind. Verwenden Sie einen Filter in der Leseanfrage, um das Lesen abgelaufener Daten zu vermeiden. Weitere Informationen finden Sie unter Automatische Speicherbereinigung – Übersicht.
- Die Abfrage von Versionen von Spaltenfamilien innerhalb eines Zeitstempelbereichs wird nicht unterstützt. Die folgenden Methoden können nicht aufgerufen werden:
org.apache.hadoop.hbase.client.Query#setColumnFamilyTimeRange(byte[] cf, long minStamp, long maxStamp)
org.apache.hadoop.hbase.client.Get#setColumnFamilyTimeRange(byte[] cf, long minStamp, long maxStamp)
org.apache.hadoop.hbase.client.Scan#setColumnFamilyTimeRange(byte[] cf, long minStamp, long maxStamp)
- 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. - Das Festlegen der maximalen Anzahl von Zellen, die für jeden Aufruf von
next()
zurückgegeben werden sollen, wird nicht unterstützt. Aufrufe der Methodeorg.apache.hadoop.hbase.client.Scan#setBatch(int batch)
werden ignoriert. - Die Festlegung der Anzahl der Zeilen für das Caching wird nicht unterstützt. Aufrufe der Methode
org.apache.hadoop.hbase.client.Scan#setCaching(int caching)
werden 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 aufgeführt. Alle diese Filter befinden sich im Paket org.apache.hadoop.hbase.filter
.
Unterstützt | Mit Einschränkungen unterstützt | Nicht unterstützt |
---|---|---|
|
||
ColumnPrefixFilter FamilyFilter FilterList FuzzyRowFilter MultipleColumnPrefixFilter MultiRowRangeFilter PrefixFilter 6RandomRowFilter TimestampsFilter |
ColumnCountGetFilter 1ColumnPaginationFilter 1ColumnRangeFilter 1FirstKeyOnlyFilter 1KeyOnlyFilter 2PageFilter 5QualifierFilter 3RowFilter 1, 4SingleColumnValueExcludeFilter 1, 4, 7SingleColumnValueFilter 4, 7ValueFilter 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)