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 HBase di Cloud Bigtable per Java e un'installazione HBase standard. Molte di queste differenze sono legate alle attività di gestione che Bigtable gestisce automaticamente.
Il client HBase di Cloud Bigtable per Java è destinato ai clienti che eseguono la migrazione a Bigtable da HBase e vogliono continuare a utilizzare l'API HBase. In tutti gli altri casi, gli sviluppatori Java devono utilizzare il client Cloud Bigtable per Java, che chiama le API Bigtable.
Famiglie di colonne
Quando crei un 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.
Le seguenti impostazioni della famiglia di colonne vengono ignorate perché Bigtable gestisce lo spazio di archiviazione sottostante per te:
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
Le impostazioni VERSIONS, MIN_VERSIONS e TTL vengono convertite in policy di garbage collection di Bigtable.
Bigtable richiede che i nomi famiglia di colonne seguano l'espressione regolare [_a-zA-Z0-9][-_.a-zA-Z0-9]*. Se importi dati in Bigtable da HBase, potresti dover prima modificare i nomi delle famiglie in modo che seguano questo pattern.
Righe e celle
- Non puoi definire un ACL per una singola riga. Le viste autorizzate di Bigtable consentono di concedere l'accesso a un sottoinsieme dei dati di una tabella, ma non sono esposte tramite l'API HBase.
- Non puoi impostare la visibilità di singole celle.
- I tag non sono supportati. Non puoi utilizzare la classe
org.apache.hadoop.hbase.Tagper aggiungere metadati alle singole celle. Tutti i tag aggiunti a una cella vengono eliminati prima della scrittura della cella.
Mutazioni ed eliminazioni
- Le operazioni
Appendin Bigtable sono completamente atomiche sia per i lettori che per gli scrittori. I lettori non potranno mai leggere un'operazioneAppendapplicata parzialmente. - Le operazioni
Incrementsono atomiche, ma l'impostazione di un intervallo di tempo su unIncrementnon è supportata. - Un oggetto
RowMutationsche passi aTable#mutateRow()può contenere operazioniPuteDeleteoppure operazioniAppendeIncrement, ma non entrambe. Gli oggettiRowMutationsche contengono operazioniAppendoIncrementnon sono supportati inbatch(),checkAndMutate()oBufferedMutator. È supportata l'eliminazione di una versione specifica di una colonna specifica in base al relativo timestamp. Tuttavia, i seguenti tipi di eliminazioni non sono supportati:
- Eliminazione solo dell'ultima versione di una colonna
- Eliminazione di tutti i valori in una riga con un timestamp specifico
- Eliminazione di tutti i valori in una famiglia di colonne in corrispondenza o prima di un timestamp specifico
Di conseguenza, i seguenti metodi nella classe
org.apache.hadoop.hbase.client.Deletenon 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 gli inserimenti, ma Bigtable non maschera gli inserimenti dopo le eliminazioni quando le richieste di inserimento vengono inviate dopo le richieste di eliminazione. Ciò significa che in Bigtable una richiesta di scrittura inviata a una cella non è interessata da una richiesta di eliminazione inviata in precedenza alla stessa cella.
Get e scansioni
- Le scansioni inverse consentono di leggere un intervallo di righe al contrario. Per maggiori dettagli, consulta Scansioni inverse.
- A differenza di HBase, quando invii una richiesta di lettura, Bigtable non 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 saperne di più, consulta la panoramica della garbage collection.
- La limitazione del numero di valori per riga per famiglia di colonne non è supportata. Non puoi chiamare il metodo
org.apache.hadoop.hbase.client.Scan#setMaxResultsPerColumnFamily(int limit). - I risultati parziali non sono supportati. Le righe vengono sempre restituite per intero. Le chiamate ai metodi
org.apache.hadoop.hbase.client.Scan#setBatch(int batch)eorg.apache.hadoop.hbase.client.Scan#setAllowPartialResults(boolean allowPartialResults)vengono ignorate. - In una chiamata
Table#getScanner(Scan)sincrona,org.apache.hadoop.hbase.client.Scan#setCaching(int caching)controlla il numero di righe recuperate dal client alla volta.AsyncTable#getScanner()ignorasetCaching(). Le chiamate al metodoorg.apache.hadoop.hbase.client.Scan#setMaxResultSize(long maxResultSize)vengono sempre ignorate.
Coprocessori
I coprocessori non sono supportati. Non puoi creare classi che implementano l'interfaccia org.apache.hadoop.hbase.coprocessor.
Filtri
La tabella seguente elenca i filtri supportati nel pacchetto org.apache.hadoop.hbase.filter. Tutti gli altri filtri
di quel pacchetto non sono supportati e generano un UnsupportedOperationException.
| Supportato | Supportato, con limitazioni |
|---|---|
|
|
ColumnCountGetFilterColumnPrefixFilterFilterListFirstKeyOnlyFilterFuzzyRowFilterMultipleColumnPrefixFilterPrefixFilter 1RandomRowFilterTimestampsFilter
|
ColumnPaginationFilter 2ColumnRangeFilter 3FamilyFilter 4KeyOnlyFilter 5MultiRowRangeFilter 6PageFilter 7QualifierFilter 8RowFilter 4SingleColumnValueExcludeFilter 3, 9, 10SingleColumnValueFilter 9, 10ValueFilter 9WhileMatchFilter 6, 11
|
Inoltre, le seguenti differenze influiscono sui filtri Bigtable:
- Sono supportati solo i comparatori
BinaryComparatoreRegexStringComparator. Tutti gli altri comparatori non sono supportati e generano un erroreUnsupportedOperationException. - Nei filtri che utilizzano l'operatore di confronto 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. Per utilizzare un filtro Bigtable che non ha un equivalente HBase, inseriscilo in uncom.google.cloud.bigtable.hbase.filter.BigtableFilter. - Le espressioni di filtro hanno un limite di dimensioni di 20 kB e i filtri non possono essere nidificati per più di 20 livelli. Come soluzione alternativa per ridurre le dimensioni di un'espressione di filtro, utilizza una colonna supplementare che memorizza il valore hash dei criteri di filtro.
Timestamp
Bigtable memorizza i timestamp in microsecondi, mentre HBase li memorizza 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ò archiviare è Long.MAX_VALUE/1000, qualsiasi valore superiore viene convertito in Long.MAX_VALUE/1000. Di conseguenza, i valori di timestamp invertiti di grandi dimensioni potrebbero non essere convertiti correttamente.
Amministrazione
Questa sezione descrive in che modo il client HBase Bigtable per Java implementa l'interfaccia org.apache.hadoop.hbase.client.Admin. Poiché Bigtable gestisce automaticamente la maggior parte delle attività di gestione dei cluster e dello spazio di archiviazione, molti metodi amministrativi di HBase non sono applicabili. Qualsiasi metodo Admin non elencato in questa sezione come supportato o come privo di effetto non è supportato e genera un UnsupportedOperationException.
Gestione dei tavoli
Sono supportati i seguenti metodi Admin per la gestione di tabelle e famiglie di colonne:
addColumnFamily(TableName tableName, ColumnFamilyDescriptor columnFamily)eaddColumnFamilyAsync(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)ecreateTableAsync(TableDescriptor desc, byte[][] splitKeys)deleteColumnFamily(TableName tableName, byte[] columnName)edeleteColumnFamilyAsync(TableName tableName, byte[] columnName)(HBase 1.x:deleteColumn(TableName tableName, byte[] columnName))deleteTable(TableName tableName),deleteTableAsync(TableName tableName),deleteTables(Pattern pattern)edeleteTables(String regex)disableTable(TableName tableName),disableTableAsync(TableName tableName),disableTables(Pattern pattern)edisableTables(String regex)enableTable(TableName tableName),enableTableAsync(TableName tableName),enableTables(Pattern pattern)eenableTables(String regex)getAlterStatus(TableName tableName)egetAlterStatus(byte[] tableName)getDescriptor(TableName tableName),getTableDescriptor(TableName tableName),getTableDescriptors(List<String> names)egetTableDescriptorsByTableName(List<TableName> tableNames)isTableAvailable(TableName tableName)eisTableAvailable(TableName tableName, byte[][] splitKeys)isTableDisabled(TableName tableName)eisTableEnabled(TableName tableName)listTableDescriptors(),listTableDescriptors(List<TableName> tableNames),listTableDescriptors(Pattern pattern)elistTableDescriptors(Pattern pattern, boolean includeSysTables)(HBase 1.x:listTables(),listTables(Pattern pattern),listTables(Pattern pattern, boolean includeSysTables),listTables(String regex)elistTables(String regex, boolean includeSysTables))listTableNames(),listTableNames(Pattern pattern),listTableNames(Pattern pattern, boolean includeSysTables),listTableNames(String regex)elistTableNames(String regex, boolean includeSysTables)modifyColumnFamily(TableName tableName, ColumnFamilyDescriptor columnFamily)emodifyColumnFamilyAsync(TableName tableName, ColumnFamilyDescriptor columnFamily)(HBase 1.x:modifyColumn(TableName tableName, HColumnDescriptor column))modifyTable(TableDescriptor td),modifyTable(TableName tableName, TableDescriptor td),modifyTableAsync(TableDescriptor td)emodifyTableAsync(TableName tableName, TableDescriptor td)tableExists(TableName tableName)truncateTable(TableName tableName, boolean preserveSplits)etruncateTableAsync(TableName tableName, boolean preserveSplits)
I seguenti metodi di gestione delle tabelle supportati si comportano in modo diverso su Bigtable o ignorano determinati parametri:
- Le tabelle Bigtable non possono essere disattivate.
disableTable(),disableTableAsync(),disableTables(),enableTable(),enableTableAsync()eenableTables()modificano lo stato della tabella solo nella memoria del client (cheisTableDisabled()eisTableEnabled()leggono). modifyTable()emodifyTableAsync()applicano solo le modifiche alle famiglie di colonne. Gli attributi a livello di tabella vengono ignorati.truncateTable()etruncateTableAsync()eliminano tutti i dati nella tabella. Il parametropreserveSplitsviene ignorato.- I sovraccarichi
listTableDescriptors(),listTables()elistTableNames()che accettano un parametroincludeSysTablesignoranoincludeSysTables, perché Bigtable non dispone di tabelle di sistema. isTableAvailable(TableName tableName, byte[][] splitKeys)verifica solo se la tabella esiste e ignora il parametrosplitKeys.getAlterStatus()restituisce sempre(0, 0)perché le modifiche allo schema in Bigtable sono sincrone.
Attività come la compattazione e la suddivisione delle tabelle vengono gestite automaticamente. Di conseguenza, i seguenti metodi non hanno alcun effetto:
compact(TableName tableName)compact(TableName tableName, byte[] columnFamily)majorCompact(TableName tableName)majorCompact(TableName tableName, byte[] columnFamily)split(TableName tableName)split(TableName tableName, byte[] splitPoint)
Snapshot
I metodi di snapshot HBase creano e gestiscono i backup di Bigtable. Poiché i backup vengono archiviati in un cluster specifico, se l'istanza ha più di un cluster, devi impostare la proprietà di configurazione google.bigtable.snapshot.cluster.id sul cluster da utilizzare. I backup creati con snapshot() scadono dopo il numero di secondi nella proprietà di configurazione google.bigtable.snapshot.default.ttl.secs (24 ore per impostazione predefinita).
cloneSnapshot() esegue il ripristino da un backup in una nuova tabella.
In Admin sono supportati i seguenti metodi di snapshot:
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)
Inoltre, AsyncAdmin supporta listSnapshots(), listSnapshots(Pattern
pattern) e snapshot(SnapshotDescription snapshot). Tutti gli altri metodi di snapshot, inclusi restoreSnapshot(), deleteSnapshots(), deleteTableSnapshots(), listTableSnapshots() e cloneSnapshot(String
snapshotName, TableName tableName, boolean restoreAcl), non sono supportati e generano un UnsupportedOperationException.
Gestione delle regioni
Bigtable utilizza i tablet, che sono simili alle regioni. I seguenti metodi per recuperare le informazioni sulla regione sono supportati, con differenze rispetto ad HBase standard:
getRegions(TableName tableName)egetTableRegions(TableName tableName), nonché i metodi nell'interfacciaorg.apache.hadoop.hbase.client.RegionLocator, restituiscono confini approssimativi basati su un campione di chiavi di riga nella tabella. I nomi dei server nelle regioni restituite non sono server reali.getRegionMetrics(ServerName serverName, TableName tableName)ignora il parametroserverNamee restituisce metriche approssimative sulle dimensioni della regione basate su un campione di chiavi di riga nella tabella.
Poiché Bigtable gestisce automaticamente i tablet, i seguenti metodi non hanno alcun effetto:
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, anche compactRegionServer(ServerName sn, boolean major), mergeRegions(byte[] encodedNameOfRegionA, byte[] encodedNameOfRegionB, boolean
forcible), move(byte[] encodedRegionName, byte[] destServerName) e unassign(byte[] regionName, boolean force) non hanno alcun effetto. I loro equivalenti HBase 2.x non sono supportati e generano un'eccezione UnsupportedOperationException.
Stato e connessione del cluster
Bigtable gestisce automaticamente le attività di manutenzione del cluster, quindi i metodi di manutenzione in Admin generano un UnsupportedOperationException. Sono supportati solo i seguenti metodi di connessione e stato:
close()non ha alcun effetto.getClusterMetrics(),getClusterMetrics(EnumSet<Option> options)egetClusterStatus()restituiscono valori segnaposto con elenchi di server vuoti egetClusterMetrics(EnumSet<Option> options)ignora il parametrooptions.getConfiguration()restituisce l'oggetto clientConfiguration.getConnection()restituisce l'oggetto clientConnection.
Spazi dei nomi
Bigtable non utilizza gli spazi dei nomi. Puoi utilizzare i prefissi chiave di riga per simulare gli spazi dei nomi.
Per impostazione predefinita, tutti i metodi dello spazio dei nomi generano un errore UnsupportedOperationException.
Tuttavia, se imposti la proprietà di configurazione google.bigtable.namespace.warnings su true, i seguenti metodi registrano un avviso e non hanno alcun effetto (restituendo null o un risultato vuoto) anziché generare un'eccezione:
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)
Anche quando google.bigtable.namespace.warnings è impostato su true,
listNamespaces() genera un UnsupportedOperationException.
Altre funzionalità amministrative
Bigtable non supporta i metodi Admin nelle seguenti categorie e la loro chiamata genera un UnsupportedOperationException:
- Gruppi di località: Bigtable non consente di specificare gruppi di località per le famiglie di colonne.
- Coprocessori e procedure distribuite: Bigtable non supporta coprocessori o procedure distribuite.
- Quote: per scoprire di più sulle quote di Bigtable, consulta Quote e limiti.
- Replica: Bigtable replica automaticamente i dati tra i cluster di un'istanza. Per maggiori dettagli, consulta Panoramica della replica. Per eseguire la replica da HBase a Bigtable, consulta Replica da HBase a Bigtable.
- Controllo degli accessi: Bigtable utilizza IAM per controllo dell'accesso.
- Gruppi RegionServer: Bigtable gestisce i server automaticamente e non espone i gruppi RegionServer.