Differenze tra HBase e Bigtable
Un modo per accedere a Bigtable è utilizzare una versione personalizzata Client HBase per Java. In generale, il client personalizzato espone lo stesso API come installazione standard di HBase. In questa pagina vengono descritti i differenze tra il client Cloud Bigtable HBase per Java e un dell'installazione standard di HBase. Molte di queste differenze sono legate alla gestione che Bigtable gestisce automaticamente.
Famiglie di colonne
Quando crei una famiglia di colonne, non puoi configurare la dimensione del blocco o di compressione, con la shell HBase o tramite l'API HBase. Bigtable gestisce la dimensione e la compressione dei blocchi per te.
Inoltre, se usi 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 dei tuoi dati.
Bigtable richiede che i nomi famiglia di colonne seguano
dell'espressione [_a-zA-Z0-9][-_.a-zA-Z0-9]*
. Se importi
in Bigtable da HBase, potresti dover prima modificare
i cognomi devono seguire questo schema.
Righe e celle
- Non puoi definire un ACL per una singola riga.
- Non puoi impostare la visibilità di singole celle.
- I tag non sono supportati. Non puoi utilizzare il corso
org.apache.hadoop.hbase.Tag
per aggiungere metadati a singole celle.
Mutazioni ed eliminazioni
- Le operazioni di
Append
in Bigtable sono completamente sia per i lettori che per gli scrittori. I lettori non potranno mai leggere un operazioneAppend
parzialmente applicata. - L'eliminazione di una versione specifica di una colonna specifica in base al timestamp
supportato, ma elimina tutti i valori con un timestamp specifico in una determinata colonna
famiglia o riga non è supportata. I seguenti metodi nella 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, elimina i metodi di mascheratura, ma Bigtable non maschera le azioni "put" dopo le eliminazioni quando le richieste PU vengono inviate dopo l'eliminazione richieste. Ciò significa che in Bigtable, una richiesta di scrittura inviata non è interessata da una richiesta di eliminazione inviata in precedenza alla stessa cella.
Recupera e scansiona
- Le scansioni inverse consentono di leggere un intervallo di righe all'indietro. Per i dettagli, consulta la sezione Inverti scansioni.
- A differenza di HBase, quando invii una richiesta di lettura, Bigtable filtra automaticamente i dati scaduti contrassegnati per l'eliminazione in un ciclo di garbage collection imminente. Per evitare di leggere dati scaduti, utilizza un filtro nella richiesta di lettura. Per ulteriori informazioni, consulta la raccolta dei rifiuti Panoramica.
- L'esecuzione di query sulle versioni delle famiglie di colonne in un intervallo di timestamp non è
supportati. Non è possibile 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)
- La limitazione del numero di valori per riga per famiglia di colonne non è supportata. Tu
non può 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 è supportati. Chiamate al metodoorg.apache.hadoop.hbase.client.Scan#setBatch(int batch)
vengono ignorati. - L'impostazione del numero di righe per la memorizzazione nella cache non è supportata. Chiamate al metodo
org.apache.hadoop.hbase.client.Scan#setCaching(int caching)
vengono ignorati.
Coprocessori
I coprocessori non sono supportati. Non puoi creare classi che implementano
interfaccia
org.apache.hadoop.hbase.coprocessor
.
Filtri
La tabella seguente mostra i filtri supportati. Tutte queste risposte
filtri nel pacchetto
org.apache.hadoop.hbase.filter
.
Supportato | Supportata, 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, i filtri Bigtable sono influenzati dalle seguenti differenze:
- Nei filtri che utilizzano il comparatore delle espressioni regolari
(
org.apache.hadoop.hbase.filter.RegexStringComparator
), espressioni regolari utilizza 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
. - Esiste un limite di dimensioni di 20 kB per le espressioni di filtro. Come soluzione alternativa a ridurre le dimensioni di un'espressione di filtro, utilizzare una colonna supplementare che il valore hash dei criteri di filtro.
Timestamp
Bigtable archivia i timestamp in microsecondi, mentre HBase archivia in millisecondi. Questa distinzione ha implicazioni quando utilizzi libreria client HBase per Bigtable e dispone di dati con i timestamp.
La libreria client converte tra microsecondi e millisecondi, ma poiché il timestamp HBase più grande che Bigtable può archiviare Lungo.MAX_VALUE/1000, qualsiasi valore maggiore di questo valore viene convertito in Lungo.MAX_VALUE/1000. Di conseguenza, valori di timestamp invertiti di grandi dimensioni potrebbero non convertirlo in modo corretto.
Amministrazione
Questa sezione descrive i metodi utilizzati nell'interfaccia
org.apache.hadoop.hbase.client.Admin
non disponibili
su Bigtable o che si comportano diversamente 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 su Bigtable, e le attività di gestione vengono gestite automaticamente. Alcuni metodi non sono disponibili in quanto sono correlate a funzionalità non supportate da Bigtable.
Attività di manutenzione generali
Bigtable gestisce automaticamente la maggior parte delle attività di manutenzione. Come 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 colonne famiglie. Di conseguenza, non puoi chiamare metodi HBase che restituiscono una località gruppo.
Spazi dei nomi
Bigtable non utilizza spazi dei nomi. Puoi utilizzare i prefissi chiave di riga per simula 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 tablet, simili alle regioni. Bigtable gestisce automaticamente i tuoi 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 la compattazione della tabella 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, non sono disponibili:
coprocessorService()
coprocessorService(ServerName serverName)
getMasterCoprocessors()
Procedure distribuite
Bigtable non supporta 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)