Différences entre HBase et Bigtable
Une manière d'accéder à Bigtable consiste à utiliser une version personnalisée du client Apache HBase pour Java. En général, le client personnalisé expose la même API qu'une installation HBase standard. Cette page décrit les différences entre le client Cloud Bigtable HBase pour Java et une installation HBase standard. Bon nombre de ces différences sont liées à des tâches de gestion que Bigtable gère automatiquement.
Familles de colonnes
Lorsque vous créez une famille de colonnes, vous ne pouvez pas configurer la taille de bloc ou la méthode de compression, que ce soit par l'interface système HBase ou via l'API HBase. Bigtable gère ces deux éléments pour vous.
De plus, si vous utilisez l'interface système HBase pour obtenir des informations sur une table, celle-ci indiquera toujours que chaque famille de colonnes n'utilise pas la compression. En réalité, Bigtable utilise des méthodes de compression propriétaires pour l'ensemble de vos données.
Bigtable exige que les noms de famille de colonnes suivent l'expression régulière [_a-zA-Z0-9][-_.a-zA-Z0-9]*
. Si vous importez des données dans Bigtable à partir de HBase, vous devrez peut-être d'abord modifier les noms des familles pour suivre ce modèle.
Lignes et cellules
- Vous ne pouvez pas définir une LCA pour une ligne individuelle.
- Vous ne pouvez pas définir la visibilité de cellules individuelles.
- Les tags ne sont pas acceptés. Vous ne pouvez pas utiliser la classe
org.apache.hadoop.hbase.Tag
pour ajouter des métadonnées à des cellules individuelles.
Mutations et suppressions
- Les opérations
Append
dans Bigtable sont totalement atomiques pour les lecteurs et les rédacteurs. Les lecteurs ne seront jamais en mesure de lire une opérationAppend
partiellement appliquée. - Il est possible de supprimer une version spécifique d'une colonne spécifique en fonction de son horodatage, mais il n'est pas possible de supprimer toutes les valeurs ayant un horodatage spécifique dans une famille de colonnes ou une ligne donnée. Les méthodes suivantes de la classe
org.apache.hadoop.hbase.client.Delete
ne sont pas acceptées :new Delete(byte[] row, long timestamp)
addColumn(byte[] family, byte[] qualifier)
addFamily(byte[] family, long timestamp)
addFamilyVersion(byte[] family, long timestamp)
- Dans HBase, les suppressions masquent les insertions. En revanche, Bigtable ne masque pas les insertions après les suppressions si les requêtes d'insertion sont envoyées après les requêtes de suppression. Cela signifie que dans Bigtable, une requête d'écriture envoyée à une cellule n'est pas affectée par une requête de suppression envoyée précédemment à la même cellule.
Obtentions et analyses
- Les analyses inverses vous permettent de lire une plage de lignes à l'envers. Pour en savoir plus, consultez Analyses inverses.
- Contrairement à HBase, lorsque vous envoyez une requête de lecture, Bigtable ne filtre pas automatiquement les données expirées marquées pour suppression lors d'un prochain cycle de récupération de mémoire. Pour éviter de lire des données expirées, utilisez un filtre dans la requête de lecture. Pour en savoir plus, consultez la présentation de la récupération de mémoire.
- Il n'est pas possible d'interroger les versions de familles de colonnes dans une plage d'horodatage. Vous ne pouvez pas appeler les méthodes suivantes :
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)
- Il n'est pas possible de limiter le nombre de valeurs par ligne et par famille de colonnes. Vous ne pouvez pas appeler la méthode
org.apache.hadoop.hbase.client.Scan#setMaxResultsPerColumnFamily(int limit)
. - Il n'est pas possible de définir le nombre maximal de cellules à afficher pour chaque appel de
next()
. Les appels de la méthodeorg.apache.hadoop.hbase.client.Scan#setBatch(int batch)
sont ignorés. - Il n'est pas possible de définir le nombre de lignes pour la mise en cache. Les appels de la méthode
org.apache.hadoop.hbase.client.Scan#setCaching(int caching)
sont ignorés.
Coprocesseurs
Les coprocesseurs ne sont pas acceptés. Vous ne pouvez pas créer de classes mettant en œuvre l'interface org.apache.hadoop.hbase.coprocessor
.
Filtres
Le tableau suivant indique les filtres compatibles. Tous ces filtres sont compris dans le package org.apache.hadoop.hbase.filter
.
Compatible | Compatible, avec des limitations | Non 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 |
Les différences suivantes affectent également les filtres Bigtable :
- Dans les filtres qui utilisent le comparateur d'expressions régulières (
org.apache.hadoop.hbase.filter.RegexStringComparator
), les expressions régulières utilisent la syntaxe RE2 plutôt que la syntaxe Java. - Les filtres personnalisés ne sont pas acceptés. Vous ne pouvez pas créer de classes qui héritent de
org.apache.hadoop.hbase.filter.Filter
. - La taille des expressions de filtre est limitée à 20 Ko. Pour réduire la taille d'une expression de filtre, utilisez une colonne supplémentaire qui stocke la valeur de hachage des critères de filtre.
Horodatages
Bigtable stocke les horodatages en microsecondes, tandis que HBase les stocke en millisecondes. Cette distinction a des conséquences lorsque vous utilisez la bibliothèque cliente HBase pour Bigtable et que vos données présentent des horodatages inversés.
La bibliothèque cliente effectue les conversions entre microsecondes et millisecondes, mais comme la plus grande valeur d'horodatage HBase stockable par Bigtable est Long.MAX_VALUE/1000, toute valeur supérieure à ce nombre sera convertie en Long.MAX_VALUE/1000. Par conséquent, il est possible que les grandes valeurs d'horodatage inversées ne soient pas converties correctement.
Administration
Cette section décrit les méthodes de l'interface org.apache.hadoop.hbase.client.Admin
qui ne sont pas disponibles sur Bigtable ou qui se comportent différemment sur Bigtable et sur HBase. Ces listes ne sont pas exhaustives. Elles peuvent ne pas refléter les méthodes d'API HBase les plus récentes.
La plupart de ces méthodes sont inutiles sur Bigtable, car les tâches de gestion sont gérées automatiquement. Certaines méthodes ne sont pas disponibles car elles concernent des fonctionnalités non compatibles avec Bigtable.
Tâches de maintenance générale
Bigtable gère automatiquement la plupart des tâches de maintenance. Par conséquent, les méthodes suivantes ne sont pas 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)
Groupes de localités
Bigtable ne vous permet pas de spécifier de groupes de localités pour les familles de colonnes. Par conséquent, vous ne pouvez pas appeler les méthodes HBase renvoyant un groupe de localités.
Espaces de noms
Bigtable n'utilise pas d'espaces de noms. Vous pouvez utiliser les préfixes de clé de ligne pour simuler des espaces de noms. Les méthodes suivantes ne sont pas disponibles :
createNamespace(NamespaceDescriptor descriptor)
deleteNamespace(String name)
getNamespaceDescriptor(String name)
listNamespaceDescriptors()
listTableDescriptorsByNamespace(String name)
listTableNamesByNamespace(String name)
modifyNamespace(NamespaceDescriptor descriptor)
Gestion de la région
Bigtable utilise des tablets, qui sont similaires aux régions. Bigtable gère automatiquement vos tablets. Par conséquent, les méthodes suivantes ne sont pas 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)
Instantanés
Les méthodes suivantes ne sont pas 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)
Gestion des tables
Les tâches telles que le compactage de tables sont traitées automatiquement. Par conséquent, les méthodes suivantes ne sont pas 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)
Coprocesseurs
Bigtable n'est pas compatible avec les coprocesseurs. Par conséquent, les méthodes suivantes ne sont pas disponibles :
coprocessorService()
coprocessorService(ServerName serverName)
getMasterCoprocessors()
Procédures distribuées
Bigtable n'est pas compatible avec les procédures distribuées. Par conséquent, les méthodes suivantes ne sont pas 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)