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ónAppend
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
- Los análisis inversos te permiten leer un rango de filas al revés. Para obtener más información, consulta Análisis inversos.
- A diferencia de HBase, cuando envías una solicitud de lectura, Bigtable no filtra automáticamente los datos vencidos que están marcados para su eliminación en un próximo ciclo de recolección de elementos no utilizados. Para evitar leer datos vencidos, usa un filtro en la solicitud de lectura. Para obtener más información, consulta la descripción general de la recolección de elementos no utilizados.
- No se admite la consulta de versiones de familias de columnas dentro de un rango de marca 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 la cantidad de valores por fila por familia de columnas. No puedes llamar al método
org.apache.hadoop.hbase.client.Scan#setMaxResultsPerColumnFamily(int limit)
. - No se admite la configuración de la cantidad máxima de celdas que se muestran para cada llamada a
next()
. Las llamadas al métodoorg.apache.hadoop.hbase.client.Scan#setBatch(int batch)
se ignoran. - No se puede configurar la cantidad de filas para el almacenamiento de caché. Las llamadas al método
org.apache.hadoop.hbase.client.Scan#setCaching(int caching)
se ignoran.
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 |
---|---|---|
|
||
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 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)