Diferencias entre HBase y Cloud Bigtable

Una forma de acceder a Cloud Bigtable es usar una versión personalizada del cliente de Apache HBase para Java. Por lo general, en el cliente personalizado se expone la misma API que en la instalación estándar de HBase. En esta página, se describen las diferencias entre el cliente de Cloud Bigtable de HBase para Java y una instalación estándar de HBase. Muchas de estas diferencias se relacionan con las tareas de administración que Cloud Bigtable maneja automáticamente.

Familias de columnas

Cuando creas una familia de columnas, no puedes configurar el tamaño de bloque o el método de compresión con la shell de HBase o mediante la API de HBase. Cloud Bigtable administra el tamaño y compresión de bloque por ti.

Además, si usas la shell de HBase para obtener información sobre una tabla, siempre informará que cada familia de columnas no usa compresión. En realidad, Cloud Bigtable utiliza métodos de compresión patentados para todos sus datos.

Filas y celdas

  • No se puede definir una LCA para una fila individual.
  • No se puede establecer la visibilidad de las celdas individuales.
  • Las etiquetas no son compatibles. No puedes usar la clase org.apache.hadoop.hbase.Tag para agregar metadatos a celdas individuales.

Mutaciones y eliminaciones

  • Las operaciones Append en Cloud Bigtable son completamente atómicas tanto para lectores como para escritores. Los lectores nunca podrán leer una operación Append que se aplica de forma parcial.
  • Se puede borrar una versión específica de una columna específica en función de su marca de tiempo, pero no se pueden borrar todos los valores con una marca de tiempo específica en una fila ni familia de columnas determinada. Los siguientes métodos de la clase org.apache.hadoop.hbase.client.Delete no son compatibles:
    • new Delete(byte[] row, long timestamp)
    • addColumn(byte[] family, byte[] qualifier)
    • addFamily(byte[] family, long timestamp)
    • addFamilyVersion(byte[] family, long timestamp)

Solicitudes y análisis

Coprocesadores

Los coprocesadores no son compatibles. No puedes crear clases que implementen la interfaz org.apache.hadoop.hbase.coprocessor.

Filtros

En la siguiente tabla se muestra qué filtros son compatibles actualmente. Todos estos filtros están en el paquete org.apache.hadoop.hbase.filter.

Compatible Compatible, con limitaciones No compatible
  1. Admite solo con una familia de columnas.
  2. No se admite la llamada a setLenAsVal(true).
  3. Es compatible solo con el comparador BinaryComparator. Admite una sola familia de columnas, si se usa un operador distinto de EQUAL.
  4. Admite solo los siguientes comparadores:
    • BinaryComparator
    • RegexStringComparator sin marcas y el operador EQUAL
  5. Si un PageFilter está en un FilterList, PageFilter solo funcionará de manera similar a HBase cuando FilterList se establezca en MUST_PASS_ALL, que es el comportamiento predeterminado. Si FilterList se configura como MUST_PASS_ONE, Cloud Bigtable tratará el PageFilter como un MUST_PASS_ALL y solo mostrará una cantidad de filas correspondientes al pageSize de PageFilter.
  6. En la mayoría de los casos, PrefixFilter analiza las filas de PrefixFilter. Sin embargo, si PrefixFilter es parte de un FilterList y tiene el operador MUST_PASS_ONE, Cloud Bigtable no puede determinar el rango implícito y realiza un análisis sin filtrar desde la fila de inicio hasta la última. Usa PrefixFilter con BigtableExtendedScan o una combinación de filtros para optimizar el rendimiento en este caso.
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
SingleColumnValueFilter 4
ValueFilter 4
DependentColumnFilter
FirstKeyValueMatchingQualifiersFilter
InclusiveStopFilter
ParseFilter
SkipFilter
WhileMatchFilter

Además, las siguientes diferencias afectan a los filtros de Cloud Bigtable:

Administración

En esta sección, se describen métodos en la interfaz org.apache.hadoop.hbase.client.Admin que no están disponibles en Cloud Bigtable o que se comportan de forma diferente en Cloud Bigtable que en HBase.

La mayoría de los métodos son innecesarios en Cloud Bigtable, porque las tareas de administración se controlan automáticamente. Algunos métodos no están disponibles porque se relacionan con características que no son compatibles con Cloud Bigtable.

Tareas de mantenimiento general

Cloud Bigtable controla la mayoría de las tareas de mantenimiento automáticamente. Como resultado, los siguientes métodos no están disponibles:

  • 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)

Grupos locales

En Cloud Bigtable, no se permite especificar grupos locales para las familias de columnas. Como resultado, no puedes llamar a los métodos de HBase que muestran un grupo local.

Espacios de nombres

Cloud Bigtable no usa espacios de nombres. Puedes usar los prefijos de clave de fila para simular los espacios de nombres. Los siguientes métodos no están disponibles:

  • createNamespace(NamespaceDescriptor descriptor)
  • deleteNamespace(String name)
  • getNamespaceDescriptor(String name)
  • listNamespaceDescriptors()
  • listTableDescriptorsByNamespace(String name)
  • listTableNamesByNamespace(String name)
  • modifyNamespace(NamespaceDescriptor descriptor)

Administración de regiones

Cloud Bigtable usa tablets, que son similares a las regiones, y las administra automáticamente. Como resultado, los siguientes métodos no están disponibles:

  • 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)

Instantáneas

Los siguientes métodos no están disponibles actualmente:

  • cloneSnapshot(byte[] snapshotName, TableName tableName)
  • cloneSnapshot(String snapshotName, TableName tableName)
  • deleteSnapshot(byte[] snapshotName)
  • deleteSnapshot(String snapshotName)
  • deleteSnapshots(Pattern pattern)
  • deleteSnapshots(String regex)
  • isSnapshotFinished(HBaseProtos.SnapshotDescription snapshot)
  • listSnapshots()
  • listSnapshots(Pattern pattern)
  • listSnapshots(String regex)
  • restoreSnapshot(byte[] snapshotName)
  • restoreSnapshot(String snapshotName)
  • restoreSnapshot(byte[] snapshotName, boolean takeFailSafeSnapshot)
  • restoreSnapshot(String snapshotName, boolean takeFailSafeSnapshot)
  • snapshot(HBaseProtos.SnapshotDescription snapshot)
  • snapshot(byte[] snapshotName, TableName tableName)
  • snapshot(String snapshotName, TableName tableName)
  • snapshot(String snapshotName, TableName tableName, HBaseProtos.SnapshotDescription.Type type)
  • takeSnapshotAsync(HBaseProtos.SnapshotDescription snapshot)

Administración de tablas

Las tareas como la compactación de tablas se controlan automáticamente. Como resultado, los siguientes métodos no están disponibles:

  • 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)

Coprocesadores

Cloud Bigtable no es compatible con los coprocesadores. Como resultado, los siguientes métodos no están disponibles:

  • coprocessorService()
  • coprocessorService(ServerName serverName)
  • getMasterCoprocessors()

Procedimientos distribuidos

Cloud Bigtable no es compatible con los procedimientos distribuidos. Como resultado, los siguientes métodos no están disponibles:

  • 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)