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ónAppend
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
- Los análisis inversos te permiten leer un intervalo de filas hacia atrás. Para obtener más información, consulta Escaneos inversos.
- A diferencia de HBase, cuando envías una solicitud de lectura, Bigtable no filtra automáticamente los datos caducados que se han marcado para eliminarse en un ciclo de recogida de elementos no utilizados próximo. Para evitar leer datos caducados, usa un filtro en la solicitud de lectura. Para obtener más información, consulta el resumen de la recogida de elementos no utilizados.
- No se pueden consultar versiones de familias de columnas dentro de un intervalo de marcas de tiempo. No puedes llamar a los siguientes métodos:
org.apache.hadoop.hbase.client.Query#setColumnFamilyTimeRange(byte[] cf, long minStamp, long maxStamp)
org.apache.hadoop.hbase.client.Get#setColumnFamilyTimeRange(byte[] cf, long minStamp, long maxStamp)
org.apache.hadoop.hbase.client.Scan#setColumnFamilyTimeRange(byte[] cf, long minStamp, long maxStamp)
- No se puede limitar el número de valores por fila y familia de columnas. No puedes llamar al método
org.apache.hadoop.hbase.client.Scan#setMaxResultsPerColumnFamily(int limit)
. - No se admite la opción de definir el número máximo de celdas que se devuelven en cada llamada a
next()
. Se ignoran las llamadas al métodoorg.apache.hadoop.hbase.client.Scan#setBatch(int batch)
. - No se puede definir el número de filas que se almacenarán en caché. Se ignoran las llamadas al método
org.apache.hadoop.hbase.client.Scan#setCaching(int caching)
.
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 |
---|---|---|
|
||
ColumnPrefixFilter FamilyFilter FilterList FuzzyRowFilter MultipleColumnPrefixFilter MultiRowRangeFilter PrefixFilter 6RandomRowFilter TimestampsFilter
|
ColumnCountGetFilter 1ColumnPaginationFilter 1ColumnRangeFilter 1FirstKeyOnlyFilter 1KeyOnlyFilter 2PageFilter 5QualifierFilter 3RowFilter 1, 4SingleColumnValueExcludeFilter 1, 4, 7SingleColumnValueFilter 4, 7ValueFilter 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)