Differenze tra HBase e Bigtable

Un modo per accedere a Bigtable è utilizzare una versione personalizzata del client ApacheHBase per Java. In generale, il client personalizzato espone la stessa API di un'installazione standard di HBase. In questa pagina vengono descritte 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 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, con la shell HBase o tramite l'API HBase. Bigtable gestisce la dimensione e la compressione dei blocchi per te.

Inoltre, se utilizzi la shell HBase per ottenere informazioni su una tabella, quest'ultima 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 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 per seguire questo pattern.

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 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'operazione Append parzialmente applicata.
  • È supportata l'eliminazione di una versione specifica di una colonna specifica in base al relativo timestamp, ma non è supportata l'eliminazione di tutti i valori con un timestamp specifico in una determinata famiglia di colonne o riga. 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, elimina i mask mettere, 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 cella non è interessata da una richiesta di eliminazione inviata in precedenza alla stessa cella.

Recupera e scansiona

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 si trovano nel pacchetto org.apache.hadoop.hbase.filter.

Supportato Supportata, con limitazioni Funzionalità non supportata
  1. Supporta una sola famiglia di colonne.
  2. La chiamata a setLenAsVal(true) non è supportata.
  3. Supporta solo il criterio di confronto BinaryComparator. Se viene utilizzato qualsiasi operatore diverso da EQUAL, è supportata una sola famiglia di colonne.
  4. Supporta solo i seguenti comparatori:
    • BinaryComparator
    • RegexStringComparator senza flag (i flag vengono ignorati) e con l'operatore EQUAL
  5. Se PageFilter si trova in un FilterList, PageFilter funzionerà in modo simile a HBase solo quando FilterList è impostato su MUST_PASS_ALL, che è il comportamento predefinito. Se il FilterList è impostato su MUST_PASS_ONE, Bigtable tratterà PageFilter come MUST_PASS_ALL e restituirà solo un numero di righe corrispondenti a pageSize di PageFilter.
  6. Nella maggior parte dei casi PrefixFilter esegue la scansione delle righe in PrefixFilter. Tuttavia, se PrefixFilter fa parte di un FilterList e ha l'operatore MUST_PASS_ONE, Bigtable non può determinare l'intervallo implicito ed esegue invece una scansione non filtrata dalla riga iniziale alla riga di interruzione. Utilizza PrefixFilter con BigtableExtendedScan o una combinazione di filtri per ottimizzare le prestazioni in questo caso.
  7. Si basa sul filtro delle condizioni di Bigtable, che può essere lento. Supportata, ma non consigliata.
ColumnPrefixFilter
FamilyFilter
FilterList
FuzzyRowFilter
MultipleColumnPrefixFilter
MultiRowRangeFilter
PrefixFilter 6
RandomRowFilter
TimestampsFilter
ColumnCountGetFilter 1
ColumnPaginationFilter 1
ColumnRangeFilter 1
FirstKeyOnlyFilter 1
KeyOnlyFilter 2
PageFilter 5
QualifierFilter 3
RowFilter 1, 4
SingleColumnValueExcludeFilter 1, 4, 7
SingleColumnValueFilter 4, 7
ValueFilter 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), le espressioni regolari utilizzano la sintassi RE2, non la sintassi Java.
  • I filtri personalizzati non sono supportati. Non puoi creare corsi 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 per ridurre le dimensioni di un'espressione di filtro, utilizza una colonna supplementare che archivi il valore hash dei criteri di filtro.

Timestamp

Bigtable archivia i timestamp in microsecondi, mentre HBase archivia i timestamp in millisecondi. Questa distinzione ha implicazioni quando utilizzi la libreria client HBase per Bigtable e disponi di dati con timestamp invertiti.

La libreria client esegue la conversione tra microsecondi e millisecondi, ma dato che il timestamp HBase più grande che Bigtable può archiviare è Long.MAX_VALUE/1000, qualsiasi valore maggiore di questo viene convertito in Long.MAX_VALUE/1000. Di conseguenza, valori di timestamp grandi invertiti 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 completi e potrebbero non riflettere i metodi dell'API HBase aggiunti più di recente.

La maggior parte di questi metodi non è necessaria su Bigtable, perché le attività di gestione vengono gestite automaticamente. Alcuni metodi non sono disponibili perché sono relativi a funzionalità non supportate da Bigtable.

Attività di manutenzione generali

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 metodi HBase che restituiscono un gruppo di località.

Spazi dei nomi

Bigtable non utilizza 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 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, i seguenti metodi 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)