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ération Append 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

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
  1. Accepte une seule famille de colonnes.
  2. L'appel de setLenAsVal(true) n'est pas accepté.
  3. Compatible uniquement avec le comparateur BinaryComparator. Si un opérateur autre que EQUAL est utilisé, une seule famille de colonnes est acceptée.
  4. Accepte uniquement les comparateurs suivants :
    • BinaryComparator
    • RegexStringComparator sans indicateur (les indicateurs sont ignorés) et avec l'opérateur EQUAL
  5. Si un élément PageFilter figure dans une liste FilterList, PageFilter ne fonctionnera de façon semblable à HBase que lorsque FilterList est défini sur MUST_PASS_ALL, ce qui correspond au comportement par défaut. Si FilterList est défini sur MUST_PASS_ONE, Bigtable traitera PageFilter comme un MUST_PASS_ALL et affichera uniquement un nombre de lignes correspondant à la taille de page de PageFilter.
  6. PrefixFilter recherche les lignes dans PrefixFilter dans la plupart des cas. Toutefois, si PrefixFilter figure dans une liste FilterList et dispose de l'opérateur MUST_PASS_ONE, Bigtable ne peut pas déterminer la plage implicite, mais effectue une analyse non filtrée de la ligne de début à la ligne de fin. Dans ce cas, utilisez PrefixFilter avec BigtableExtendedScan ou une association de filtres pour optimiser les performances.
  7. Dépend du filtre de condition de Bigtable, qui peut être lent. Compatible, mais déconseillé.
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

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)