Diferencias entre HBase y Bigtable

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

El cliente de HBase de Cloud Bigtable para Java está dirigido a los clientes que migran de HBase a Bigtable y quieren seguir usando la API de HBase. En el resto de los casos, los desarrolladores de Java deben usar el cliente de Cloud Bigtable para Java, que llama a las APIs de Bigtable.

Familias de columnas

Cuando creas una familia de columnas, no puedes configurar el tamaño de bloque ni el método de compresión, ni con el shell de HBase ni con la API de HBase. Bigtable gestiona el tamaño de los bloques y la compresión.

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

Bigtable requiere que los nombres de las familias de columnas sigan la expresión regular [_a-zA-Z0-9][-_.a-zA-Z0-9]*. Si vas a importar datos de HBase a Bigtable, puede que primero tengas que cambiar los nombres de las familias para que sigan este patrón.

Filas y celdas

  • No puedes definir una lista de control de acceso para una fila concreta.
  • No puedes definir la visibilidad de celdas concretas.
  • No se admiten etiquetas. No puedes usar la clase org.apache.hadoop.hbase.Tag para añadir metadatos a celdas individuales.

Mutaciones y eliminaciones

  • Las operaciones Append en Bigtable son totalmente atómicas tanto para lectores como para escritores. Los lectores nunca podrán leer una operación Append aplicada parcialmente.
  • Se puede eliminar una versión específica de una columna concreta en función de su marca de tiempo, pero no se pueden eliminar todos los valores con una marca de tiempo específica en una familia de columnas o una fila determinadas. No se admiten los siguientes métodos de la clase org.apache.hadoop.hbase.client.Delete:
    • new Delete(byte[] row, long timestamp)
    • addColumn(byte[] family, byte[] qualifier)
    • addFamily(byte[] family, long timestamp)
    • addFamilyVersion(byte[] family, long timestamp)
  • En HBase, las eliminaciones enmascaran las inserciones, pero Bigtable no enmascara las inserciones después de las eliminaciones cuando se envían solicitudes de inserción después de las solicitudes de eliminación. Esto significa que, en Bigtable, una solicitud de escritura enviada a una celda no se ve afectada por una solicitud de eliminación enviada anteriormente a la misma celda.

Obtenciones y análisis

Coprocesadores

No se admiten coprocesadores. No puedes crear clases que implementen la interfaz org.apache.hadoop.hbase.coprocessor.

Filtros

En la siguiente tabla se muestran los filtros admitidos. Todos estos filtros se encuentran en el paquete org.apache.hadoop.hbase.filter.

Compatible Admitido, con limitaciones No compatible
  1. Solo admite una familia de columnas.
  2. No se admiten llamadas a setLenAsVal(true).
  3. Solo admite el comparador BinaryComparator. Si se usa cualquier otro operador que no sea EQUAL, solo se admite una familia de columnas.
  4. Solo admite los siguientes comparadores:
    • BinaryComparator
    • RegexStringComparator sin marcas (las marcas se ignoran) y el operador EQUAL
  5. Si un PageFilter está en un FilterList, PageFilter solo funcionará de forma similar a HBase cuando el FilterList esté definido como MUST_PASS_ALL, que es el comportamiento predeterminado. Si FilterList tiene el valor MUST_PASS_ONE, Bigtable tratará el PageFilter como un MUST_PASS_ALL y solo devolverá un número de filas correspondiente al pageSize de PageFilter.
  6. PrefixFilter busca filas en la PrefixFilter en la mayoría de los casos. Sin embargo, si PrefixFilter forma parte de un FilterList y tiene el operador MUST_PASS_ONE, Bigtable no puede determinar el intervalo implícito y, en su lugar, realiza un análisis sin filtrar desde la fila de inicio hasta la fila de parada. Usa PrefixFilter con BigtableExtendedScan o una combinación de filtros para optimizar el rendimiento en este caso.
  7. Se basa en el filtro de condición de Bigtable, que puede ser lento. Se admite, pero no se recomienda.
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

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

  • En los filtros que usan el comparador de expresiones regulares (org.apache.hadoop.hbase.filter.RegexStringComparator), las expresiones regulares usan la sintaxis RE2, no la sintaxis Java.
  • No se admiten filtros personalizados. No puedes crear clases que hereden de org.apache.hadoop.hbase.filter.Filter.
  • Las expresiones de filtro tienen un límite de tamaño de 20 KB. Para reducir el tamaño de una expresión de filtro, use una columna complementaria que almacene el valor hash de los criterios de filtro.

Marcas de tiempo

Bigtable almacena las marcas de tiempo en microsegundos, mientras que HBase lo hace en milisegundos. Esta distinción tiene implicaciones cuando usas la biblioteca de cliente de HBase para Bigtable y tienes datos con marcas de tiempo invertidas.

La biblioteca de cliente convierte los microsegundos en milisegundos, pero como la marca de tiempo de HBase más grande que puede almacenar Bigtable es Long.MAX_VALUE/1000, cualquier valor superior se convierte en Long.MAX_VALUE/1000. Por lo tanto, es posible que los valores de marca de tiempo invertidos grandes no se conviertan correctamente.

Administración

En esta sección se describen los métodos de la interfaz org.apache.hadoop.hbase.client.Admin que no están disponibles en Bigtable o que se comportan de forma diferente en Bigtable que en HBase. Estas listas no son exhaustivas y es posible que no reflejen los métodos de la API de HBase añadidos más recientemente.

La mayoría de estos métodos no son necesarios en Bigtable, ya que las tareas de gestión se realizan automáticamente. Algunos métodos no están disponibles porque están relacionados con funciones que Bigtable no admite.

Tareas de mantenimiento generales

Bigtable gestiona la mayoría de las tareas de mantenimiento automáticamente. Por lo tanto, 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 de localidades

Bigtable no permite especificar grupos de localidad para familias de columnas. Por lo tanto, no puedes llamar a métodos de HBase que devuelvan un grupo de localidad.

Espacios de nombres

Bigtable no usa espacios de nombres. Puedes usar prefijos de clave de fila para simular 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)

Gestión de regiones

Bigtable usa tablets, que son similares a las regiones. Bigtable gestiona tus tablets automáticamente. Por lo tanto, 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)

Capturas

Los siguientes métodos no están disponibles.

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

Gestión de tablas

Tareas como la compactación de tablas se gestionan automáticamente. Por lo tanto, 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

Bigtable no admite coprocesadores. Por lo tanto, los siguientes métodos no están disponibles:

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

Procedimientos distribuidos

Bigtable no admite procedimientos distribuidos. Por lo tanto, 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)