Diferencias entre HBase y Bigtable

Una forma de acceder a 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 Bigtable maneja automáticamente.

Familias de columnas

Cuando creas una familia de columnas, no puedes configurar el tamaño de bloque ni el método de compresión con la shell de HBase o mediante la API de HBase. Bigtable administra la compresión y el tamaño 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, Bigtable utiliza métodos de compresión patentados para todos sus datos.

Bigtable exige que los nombres de las familias de columnas sigan la expresión regular [_a-zA-Z0-9][-_.a-zA-Z0-9]*. Si importas datos a Bigtable desde HBase, es posible que primero debas cambiar los nombres de las familias para seguir este patrón.

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 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)
  • En HBase, borra las operaciones put de enmascaramiento, pero Bigtable no enmascara las operaciones put después de las eliminaciones cuando se envían solicitudes put luego 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 que se envió antes a la misma celda.

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 muestran los filtros compatibles. 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 (se ignoran las 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, 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, 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.
  7. Depende del 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 de Java.
  • No se admiten los filtros personalizados. No puedes crear clases heredadas de org.apache.hadoop.hbase.filter.Filter.
  • Existe un límite de tamaño de 20 KB para las expresiones de filtro. Como solución alternativa para reducir el tamaño de una expresión de filtro, usa una columna complementaria que almacene el valor de hash de los criterios de filtro.

Marcas de tiempo

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

La biblioteca cliente convierte entre microsegundos y milisegundos, pero debido a que la marca de tiempo más grande de HBase que puede almacenar Bigtable es Long.MAX_VALUE/1000, cualquier valor mayor que ese se convierte en Long.MAX_VALUE/1000. Como resultado, es posible que los valores grandes de marca de tiempo invertidas no se conviertan de manera correcta.

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 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 más recientes de la API de HBase.

La mayoría de los métodos son innecesarios en 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 Bigtable.

Tareas de mantenimiento general

Bigtable controla la mayoría de las tareas de mantenimiento de forma automática. 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 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

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

Bigtable usa tablets, que son similares a las regiones. Bigtable administra tus tablets 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.

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

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

Bigtable no admite coprocesadores. Como resultado, los siguientes métodos no están disponibles:

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

Procedimientos distribuidos

Bigtable no admite 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)