Differenze tra HBase e Bigtable
Un modo per accedere a Bigtable è utilizzare una versione personalizzata del client Apache HBase per Java. In generale, il client personalizzato espone la stessa API di un'installazione standard di HBase. Questa pagina descrive le differenze tra il client Cloud Bigtable HBase per Java e un'installazione HBase standard. Molte di queste differenze sono correlate alle attività di gestione gestite automaticamente da Bigtable.
Famiglie di colonne
Quando crei una famiglia di colonne, non puoi configurare la dimensione del blocco o il metodo di compressione, né con la shell HBase né tramite l'API HBase. Bigtable gestisce le dimensioni e la compressione dei blocchi per te.
Inoltre, se utilizzi la shell HBase per ottenere informazioni su una tabella, la shell HBase segnalerà sempre che ogni famiglia di colonne non utilizza la compressione. In realtà, Bigtable utilizza metodi di compressione proprietari per tutti i tuoi dati.
Bigtable richiede che i nomi famiglia di colonne rispettino l'espressione regolare [_a-zA-Z0-9][-_.a-zA-Z0-9]*
. Se importi
dati in Bigtable da HBase, potrebbe essere necessario prima modificare
i nomi di famiglia in modo che rispettino questo pattern.
Righe e celle
- Non puoi definire un ACL per una singola riga.
- Non puoi impostare la visibilità delle singole celle.
- I tag non sono supportati. Non puoi utilizzare la classe
org.apache.hadoop.hbase.Tag
per aggiungere metadati alle singole celle.
Mutazioni ed eliminazioni
- Le operazioni
Append
in Bigtable sono completamente atomiche sia per i lettori che per gli autori. I lettori non potranno mai leggere un'operazioneAppend
applicata parzialmente. - L'eliminazione di una versione specifica di una colonna specifica in base al relativo timestamp è supportata, ma l'eliminazione di tutti i valori con un timestamp specifico in una determinata famiglia di colonne o riga non è supportata. I seguenti metodi della classe
org.apache.hadoop.hbase.client.Delete
non sono supportati:new Delete(byte[] row, long timestamp)
addColumn(byte[] family, byte[] qualifier)
addFamily(byte[] family, long timestamp)
addFamilyVersion(byte[] family, long timestamp)
- In HBase, le eliminazioni mascherano i put, ma Bigtable non maschera i put dopo le eliminazioni quando le richieste put vengono inviate dopo le richieste di eliminazione. Ciò significa che in Bigtable, una richiesta di scrittura inviata a una cellula non è interessata da una richiesta di eliminazione inviata in precedenza alla stessa cellula.
Recupera e scansiona
- Le ricerche inverse ti consentono di leggere un intervallo di righe in ordine inverso. Per maggiori dettagli, vedi Scansioni inversa.
- A differenza di HBase, quando invii una richiesta di lettura, Bigtable non filtra automaticamente i dati scaduti contrassegnati per l'eliminazione in un prossimo ciclo di garbage collection. Per evitare di leggere dati scaduti, utilizza un filtro nella richiesta di lettura. Per ulteriori informazioni, consulta la panoramica del recupero del cestino.
- Le query sulle versioni delle famiglie di colonne all'interno di un intervallo di timestamp non sono supportate. Non puoi chiamare i seguenti metodi:
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)
- Il limite del numero di valori per riga per famiglia di colonne non è supportato. Non puoi chiamare il metodo
org.apache.hadoop.hbase.client.Scan#setMaxResultsPerColumnFamily(int limit)
. - L'impostazione del numero massimo di celle da restituire per ogni chiamata a
next()
non è supportata. Le chiamate al metodoorg.apache.hadoop.hbase.client.Scan#setBatch(int batch)
vengono ignorate. - L'impostazione del numero di righe per la memorizzazione nella cache non è supportata. Le chiamate al metodo
org.apache.hadoop.hbase.client.Scan#setCaching(int caching)
vengono ignorate.
Coprocessori
I coprocessori non sono supportati. Non puoi creare classi che implementano l'interfaccia
org.apache.hadoop.hbase.coprocessor
.
Filtri
La tabella seguente mostra i filtri supportati. Tutti questi
filtri sono inclusi nel pacchetto
org.apache.hadoop.hbase.filter
.
Supportato | Supportato, con limitazioni | Non supportata |
---|---|---|
|
||
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 |
Inoltre, le seguenti differenze influiscono sui filtri Bigtable:
- Nei filtri che utilizzano il comparatore delle espressioni regolari
(
org.apache.hadoop.hbase.filter.RegexStringComparator
), le espressioni regolari utilizzano la sintassi RE2, non la sintassi Java. - I filtri personalizzati non sono supportati. Non puoi creare classi che ereditano da
org.apache.hadoop.hbase.filter.Filter
. - Le espressioni di filtro hanno un limite di dimensioni di 20 KB. Come soluzione alternativa per ridurre le dimensioni di un'espressione di filtro, utilizza una colonna supplementare che memorizzi il valore hash dei criteri di filtro.
Timestamp
Bigtable memorizza i timestamp in microsecondi, mentre HBase memorizza i timestamp in millisecondi. Questa distinzione ha implicazioni quando utilizzi la libreria client HBase per Bigtable e hai dati con timestamp invertiti.
La libreria client esegue la conversione tra microsecondi e millisecondi, ma poiché il timestamp HBase più grande che Bigtable può memorizzare è Long.MAX_VALUE/1000, qualsiasi valore superiore viene convertito in Long.MAX_VALUE/1000. Di conseguenza, i valori dei timestamp invertiti di grandi dimensioni potrebbero non essere convertiti correttamente.
Amministrazione
Questa sezione descrive i metodi nell'interfaccia
org.apache.hadoop.hbase.client.Admin
che non sono disponibili
su Bigtable o che si comportano in modo diverso su Bigtable
rispetto a HBase. Questi elenchi non sono esaustivi e potrebbero non riflettere i metodi dell'API HBase aggiunti più di recente.
La maggior parte di questi metodi non è necessaria in Bigtable, perché le attività di gestione vengono gestite automaticamente. Alcuni metodi non sono disponibili perché si riferiscono a funzionalità non supportate da Bigtable.
Attività di manutenzione generale
Bigtable gestisce automaticamente la maggior parte delle attività di manutenzione. Di conseguenza, i seguenti metodi non sono disponibili:
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)
Gruppi di località
Bigtable non consente di specificare gruppi di località per le famiglie di colonne. Di conseguenza, non puoi chiamare i metodi HBase che restituiscono un gruppo di località.
Spazi dei nomi
Bigtable non utilizza gli spazi dei nomi. Puoi utilizzare i prefissi chiave di riga per simulare gli spazi dei nomi. I seguenti metodi non sono disponibili:
createNamespace(NamespaceDescriptor descriptor)
deleteNamespace(String name)
getNamespaceDescriptor(String name)
listNamespaceDescriptors()
listTableDescriptorsByNamespace(String name)
listTableNamesByNamespace(String name)
modifyNamespace(NamespaceDescriptor descriptor)
Gestione delle regioni
Bigtable utilizza i tablet, che sono simili alle regioni. Bigtable gestisce automaticamente i tablet. Di conseguenza, i seguenti metodi non sono disponibili:
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)
Snapshot
I seguenti metodi non sono disponibili.
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)
Gestione delle tabelle
Attività come il compattamento delle tabelle vengono gestite automaticamente. Di conseguenza, i seguenti metodi non sono disponibili:
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)
Coprocessori
Bigtable non supporta i coprocessori. Di conseguenza, i seguenti metodi non sono disponibili:
coprocessorService()
coprocessorService(ServerName serverName)
getMasterCoprocessors()
Procedure distribuite
Bigtable non supporta le procedure distribuite. Di conseguenza, i seguenti metodi non sono disponibili:
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)