Migrer des données de HBase vers Cloud Bigtable

Cet article décrit différents processus et points importants pour la migration des données d'un cluster Apache HBase vers un cluster Cloud Bigtable sur Google Cloud.

Avant de commencer cette migration, vous devez prendre en compte les implications en termes de performances, la conception de schéma Cloud Bigtable, les conséquences pour votre approche en matière d'authentification et d'autorisation, et les fonctionnalités de Cloud Bigtable.

Implications en termes de performance

Avec une charge de travail type, Cloud Bigtable offre des performances hautement prévisibles. Lorsque tout fonctionne correctement, vous pouvez vous attendre aux performances suivantes pour chaque nœud de votre cluster Cloud Bigtable, en fonction du type de stockage utilisé par votre cluster.

Type de stockage Lecture   Écriture Analyses
SSD 10 000 lignes par seconde à 6 ms ou 10 000 lignes par seconde à 6 ms 220 Mo/s
HDD 500 lignes par seconde à 200 ms ou 10 000 lignes par seconde à 50 ms 180 Mo/s

Les estimations figurant dans la liste sont basées sur des lignes contenant 1 Ko de données. Elles reflètent également une charge de travail de lecture seule ou d'écriture seule. Les performances pour une charge de travail mixte de lectures et d'écritures varient.

Ces chiffres relatifs aux performances sont des indications et non des règles absolues. Les performances par nœud peuvent varier en fonction de la charge de travail et de la taille de la valeur standard d'une requête ou d'une réponse. Pour plus d'informations, consultez Comprendre les performances de Cloud Bigtable.

Conception de schéma Cloud Bigtable

La conception d'un schéma Cloud Bigtable est différente de celle d'un schéma pour une base de données relationnelle. Avant de concevoir votre schéma, passez en revue les concepts exposés à la page Concevoir votre schéma.

Vous devez également concevoir le schéma de sorte que la taille des données reste inférieure aux limites recommandées. En règle générale, une ligne doit être inférieure à 100 Mo et les valeurs uniques ne doivent pas dépasser 10 Mo. Dans certains scénarios, il est possible que vous deviez stocker de grandes valeurs. Le stockage de grandes valeurs peut avoir un impact sur les performances, car leur extraction nécessite du temps et de la mémoire. Évaluez ces scénarios au cas par cas.

Authentification et autorisation

Avant de concevoir le contrôle des accès pour Cloud Bigtable, passez en revue les processus d'authentification et d'autorisation HBase existants.

Cloud Bigtable utilise les mécanismes d'authentification standards de Google Cloud, ainsi qu'une gestion de l'authentification et des accès (IAM) pour assurer le contrôle des accès. Vous pouvez donc convertir votre autorisation existante sur HBase en IAM. et mapper les groupes Hadoop existants qui fournissent des mécanismes de contrôle des accès pour HBase à différents comptes de service.

Cloud Bigtable vous permet de contrôler les accès au niveau du projet, de l'instance et de la table. Pour plus d'informations, consultez la section Contrôle des accès.

Migrer des données de HBase vers Cloud Bigtable

Pour migrer vos données de HBase vers Cloud Bigtable, vous devez les exporter sous la forme d'une série de fichiers séquentiels Hadoop. Il s'agit d'un format de fichier utilisé par HBase et constitué de paires clé/valeur binaires.

Pour migrer une table HBase vers Cloud Bigtable, procédez comme suit :

  1. Recueillez des informations à partir de HBase.
  2. Exportez les tables HBase vers des fichiers séquentiels.
  3. Déplacez les fichiers séquentiels vers Cloud Storage.
  4. Importez les fichiers séquentiels dans Cloud Bigtable à l'aide de Dataflow.
  5. Validez le déplacement.

Planifier la migration : recueillir des informations à partir de HBase

Pour préparer la migration, rassemblez les informations suivantes à partir du cluster HBase existant, car vous en aurez besoin pour créer la table de destination :

  • Liste des tables
  • Nombre de lignes
  • Nombre de cellules
  • Détails de la famille de colonnes (y compris la durée de vie et le nombre maximal de versions)

Un moyen simple de collecter ces informations dans une table source consiste à utiliser le script suivant, qui enregistre le résultat sur HDFS :

#!/usr/bin/env bash
# Table Name is the Source HBase Table Name
TABLENAME="$1"
# Export Directory will be located on HDFS
EXPORTDIR="$2"
hadoop fs -mkdir -p ${EXPORTDIR}
hbase shell << EOQ
describe ${TABLENAME}
EOQ | hadoop fs -put - ${EXPORTDIR}/${TABLENAME}-schema.json
hbase shell << EOQ
get_splits ${TABLENAME}
EOQ | hadoop fs -put - ${EXPORTDIR}/${TABLENAME}-splits.txt

Exporter la table HBase vers Cloud Storage

Lorsque vous connaissez les bases des tables HBase à migrer, vous devez exporter la table vers des fichiers séquentiels et déplacer ceux-ci vers Cloud Storage. Avant de migrer des données en ligne, exécutez les étapes suivantes pour vous assurer que votre cluster remplit les conditions préalables d'accès à Google Cloud :

  • Installez le connecteur Cloud Storage.

    Si vous souhaitez migrer des données en ligne à l'aide de distcp, vous devez installer et configurer le connecteur Cloud Storage. Commencez par identifier le système de fichiers HDFS qui gère les données que vous souhaitez migrer. Ensuite, déterminez quel nœud client de votre cluster Hadoop a accès à ce système de fichiers. Enfin, installez le connecteur sur le nœud client. Pour accéder à la procédure d'installation détaillée, consultez la page Installer le connecteur Cloud Storage.

  • Installer le SDK Cloud

    Pour migrer des données avec distcp ou gsutil, installez le SDK Cloud sur le nœud client du cluster Hadoop où la migration sera lancée. Pour obtenir la procédure d'installation détaillée, consultez la documentation du SDK Cloud.

Exporter la table HBase vers HDFS

Exportez ensuite la table HBase que vous souhaitez migrer vers votre cluster Hadoop. Supposons que le nom de la table HBase soit [MY_NEW_TABLE]. Le répertoire cible se trouve sous votre répertoire utilisateur dans HDFS. Exportez la table HBase en tant que fichiers séquentiels à l'aide des commandes suivantes :

TABLENAME="my-new-table"
EXPORTDIR=/usr/[USERNAME]/hbase-${TABLENAME}-export
hadoop fs -mkdir -p ${EXPORTDIR}
MAXVERSIONS=2147483647
cd ${HBASE_HOME}
bin/hbase org.apache.hadoop.hbase.mapreduce.Export my-new-table \
    /user/hbase-${TABLENAME} \
    -export ${MAXVERSIONS}
bin/hbase org.apache.hadoop.hbase.mapreduce.Export \
    -Dmapred.output.compress=true \
    -Dmapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec \
    -DRAW_SCAN=true \
    -Dhbase.client.scanner.caching=100 \
    -Dmapred.map.tasks.speculative.execution=false \
    -Dmapred.reduce.tasks.speculative.execution=false \
    ${TABLENAME} ${EXPORTDIR} ${MAXVERSIONS}

Migrer les fichiers séquentiels de HDFS vers Cloud Storage

L'étape suivante consiste à déplacer les fichiers séquentiels dans un bucket Cloud Storage. En fonction de la taille des données, du nombre de fichiers, de la source des données et de la bande passante disponible, vous pouvez choisir l'option appropriée pour déplacer les fichiers séquentiels vers Cloud Storage : Transfer Appliance, distcp, gsutil ou le service de transfert de stockage.

Utiliser Transfer Appliance

Utilisez Transfer Appliance pour migrer vos données lorsque :

  • vous souhaitez contrôler la bande passante sortante selon un calendrier ;
  • la taille des données est supérieure à 20 To.

Avec cette option, vous n'avez pas besoin d'acheter ou de configurer un réseau supplémentaire avec Google. Le temps de transfert de bout en bout (temps d'expédition de l'appareil, réhydratation, etc.) est en moyenne de 100 Mbit/s.

Pour transférer des données avec Transfer Appliance, copiez-y les fichiers séquentiels, puis renvoyez l'appareil à Google. Google charge ensuite les données sur Google Cloud. Pour en savoir plus, consultez la documentation sur Transfer Appliance.

Utiliser distcp

Utilisez distcp pour migrer vos données lorsque :

  • une bande passante supérieure à 100 Mbit/s est disponible pour la migration ;
  • le connecteur Cloud Storage et le SDK Cloud peuvent être installés sur l'environnement Hadoop source ;
  • la gestion d'une nouvelle tâche Hadoop pour effectuer la migration des données est acceptable ;
  • la taille des données est inférieure à 20 To.

Pour déplacer des données avec distcp, utilisez le nœud client du cluster Hadoop configuré avec le connecteur Cloud Storage pour soumettre une tâche MapReduce afin de copier les fichiers séquentiels sur Cloud Storage :

hadoop distcp hdfs://[NAMENODE]:[NAMENODE_PORT]/[SOURCE_DIRECTORY] \
gs://[BUCKET]/DESTINATION_DIRECTORY]

Utiliser gsutil

Utilisez gsutil pour migrer vos données lorsque :

  • une bande passante supérieure à 100 Mbit/s est disponible pour la migration ;
  • le SDK Cloud peut être installé sur l'environnement Hadoop source ;
  • la gestion d'une nouvelle tâche Hadoop pour exécuter la migration de données n'est pas autorisée ;
  • la taille des données est inférieure à 10 To.

Pour déplacer des données avec gsutil, utilisez le nœud client du cluster Hadoop pour lancer la migration des données :

TABLENAME="my-new-table"
EXPORTDIR=/usr/[USERNAME]/hbase-${TABLENAME}-export
gsutil -m cp -r  ${EXPORTDIR} gs://[BUCKET]

Utiliser le service de transfert de stockage

Utilisez le service de transfert de stockage pour migrer vos données lorsque :

  • votre source de données est un bucket Amazon S3, un emplacement HTTP/HTTPS, ou un bucket Cloud Storage ;
  • la taille des données est inférieure à 10 To.

Le service de transfert de stockage propose des options facilitant les transferts de données, ainsi que la synchronisation entre les sources et les récepteurs de données. Par exemple, vous pouvez :

  • planifier des opérations de transfert ponctuelles ou récurrentes ;
  • supprimer des objets existants du bucket de destination s'ils ne possèdent pas d'objets correspondant dans la source ;
  • supprimer les objets sources une fois leur transfert terminé ;
  • planifier la synchronisation périodique depuis la source de données vers le récepteur de données à l'aide de filtres avancés basés sur les dates de création des fichiers, les noms de fichiers et les heures de la journée pendant lesquelles vous préférez importer des données.

Pour plus d'informations, consultez la documentation sur le service de transfert de stockage.

Créer la table de destination

L'étape suivante consiste à créer la table de destination dans Cloud Bigtable.

Tout d'abord, utilisez l'outil de ligne de commande gcloud pour installer l'outil client Cloud Bigtable cbt.

gcloud components update
gcloud components install cbt

Ensuite, créez une table dans Cloud Bigtable qui comporte les familles de colonnes appropriées selon vos recherches précédentes.

En utilisant les divisions existantes, prédivisez la table de destination lors de sa création. Cela permet d'améliorer les performances de chargement groupé.

Par exemple, si les divisions existantes sont les suivantes :

'15861', '29374', '38173', '180922', '203294', '335846', '641111', '746477', '807307', '871053', '931689', '1729462', '1952670', '4356485', '4943705', '5968738', '6917370', '8993145', '10624362', '11309714', '12056747', '12772074', '14370672', '16583264', '18835454', '21194008', '22021148', '23702800', '25532516', '55555555'

Configurez un projet par défaut et une instance Cloud Bigtable destinés à l'outil cbt pour votre compte utilisateur de la manière suivante:

$ cat > ${HOME}/.cbtrc << EOF
project = [YOUR-GCP-PROJECT]
instance = [BIGTABLE-INSTANCE-NAME]
EOF

Créez ces divisions dans la table de destination :

cbt -instance my-instance createtable my-new-table \
splits=15861,29374,38173,180922,203294,335846,641111,746477,807307,871053,931689,\
1729462,1952670,4356485,4943705,5968738,6917370,8993145,10624362,11309714,\
12056747,12772074,14370672,16583264,18835454,21194008,22021148,23702800,\
5532516,55555555

Dans la table de destination, créez des familles de colonnes qui correspondent à celles que vous avez découvertes précédemment. Par exemple, si vous avez découvert qu'il existe deux familles de colonnes, cf1 et cf2, créez la famille de colonnes cf1 sur Cloud Bigtable de la manière suivante:

cbt createfamily my-new-table cf1

Créez la famille de colonnes cf2 de la manière suivante :

cbt createfamily my-new-table cf2

Après avoir créé les familles de colonnes, il est important de mettre à jour la stratégie de récupération de mémoire de chaque famille de colonnes, y compris l'âge maximal et le nombre maximal de versions pour les valeurs de cette famille de colonnes. Vous devez réaliser cette opération même si vous avez utilisé les paramètres par défaut de HBase pour votre table HBase, car les outils natifs de Cloud Bigtable utilisent un paramètre par défaut différent de celui de HBase.

cbt setgcpolicy [TABLE] [FAMILY] ( maxage=[D]| maxversions=[N] )

Importer les données HBase dans Cloud Bigtable à l'aide de Dataflow

Deux options s'offrent à vous pour importer des données dans Cloud Bigtable. Consultez Importer les fichiers séquentiels de la documentation Cloud Bigtable pour plus de détails.

Gardez les conseils suivants à l'esprit :

  • Pour améliorer les performances du chargement des données, veillez à définir maxNumWorkers. Cette valeur permet de garantir que la tâche d'importation dispose de la puissance de calcul nécessaire pour être terminée dans un délai raisonnable, mais pas au point de surcharger le cluster Cloud Bigtable.

  • Pendant l'importation, vous devez surveiller l'utilisation du processeur du cluster Cloud Bigtable. La section Utilisation du processeur de la documentation de surveillance de Cloud Bigtable fournit des informations supplémentaires à ce sujet. Si l'utilisation du processeur sur le cluster Cloud Bigtable est trop élevée, vous devrez peut-être ajouter des nœuds supplémentaires. L'amélioration des performances liée à l'ajout de nœuds supplémentaires peut prendre jusqu'à 20 minutes pour se manifester.

Pour plus d'informations sur la surveillance de l'instance Cloud Bigtable, consultez Surveiller une instance Cloud Bigtable.

Valider les données importées dans Cloud Bigtable

Pour valider les données importées, vous pouvez procéder à plusieurs vérifications différentes :

  • Vérification de la correspondance du nombre de lignes. La tâche Dataflow indique le nombre total de lignes. Cette valeur doit correspondre au nombre total de lignes de la table Hbase source.
  • Vérification ponctuelle avec des requêtes de lignes spécifiques. Vous pouvez sélectionner un ensemble spécifique de clés de ligne dans la table source et les interroger dans la table de destination pour vous assurer qu'elles correspondent :
cbt lookup [destination-table] [rowkey1]
cbt lookup [destination-table] [rowkey2]

Étape suivante