Introduction à Apache HBase
Architecture et fonctionnement
Intégration avec l’écosystème Hadoop
Limites et défis
Conclusion et Perspectives
Exemples d’applications pratiques
Installation, déploiement et démo pratiques
Définition
Apache HBase est une base de données distribuée orientée colonnes qui fonctionne au-dessus du système de fichiers distribué Hadoop (HDFS). Elle est conçue pour gérer de grandes tables avec des milliards de lignes et des millions de colonnes. Il est opensource, non-relationnel, et écrit en Java.
HBase est à l’origine un projet de la compagnie PowerSet (acquise en 2008 par Microsoft) spécialisée dans le développement de moteur de recherche en langage naturel. Elle a été initié en 2006 par Chad Walters et Jim Kellerman en s’inspirant de BigTable de Google.
En octobre 2007, HBase rejoint l’écosystème de Hadoop.
En 2008, HBase a été intégré à l’Apache Software Foundation en tant que projet incubé. Il devient un projet de premier niveau en juin 2010.
Un système distribué ne peut garantir simultanénement les trois propriétés suivantes : Cohérence (C) , Disponibilité (A pour Availability), Tolérance au partitionnement (P pour Partition Tolerance)
(Théorème de Brewer)
Un système distribué ne peut garantir simultanénement les trois propriétés suivantes : Cohérence (C) , Disponibilité (A pour Availability), Tolérance au partitionnement (P pour Partition Tolerance)
(Théorème de Brewer)
HBase sacrifie la disponibilité en faveur de la cohérence
HBase repose sur une architecture distribuée comprenant trois(3) composants essentiels :
HMaster : Il sert de point de contrôle central pour gérer et coordonner les noeuds de données (RegionServers). Il est responsable de la répartition des régions et du suivi de l’état des RegionServers. Il gère également les métadonnées de la table.
RegionServers : Ils hébergent et gèrent les régions contenant les données utilisateur. Ils s’occupent des requêtes de lecture et d’écriture envoyées par les clients. Ils utilisent des mémoires tampons (MemStore) pour optimiser les écritures avant de les sauvegarder sur disque dans des fichiers HFiles.
Zookeeper : Il assure la coordination entre les composants de HBase et garantit une haute disponibilité. Il joue un rôle clé dans la gestion des sessions et la détection des défaillances des RegionServers.
Pour lire les données, le scanner recherche d’abord la donnée dans le Block Cache. Ici, toutes les paires clé-valeur récemment lues sont stockées.
Si le scanner ne parvient pas à trouver le résultat requis, il se déplace vers le MemStore, car nous savons qu’il s’agit de la mémoire cache d’écriture. Là, il recherche les fichiers les plus récemment écrits, qui n’ont pas encore été vidés dans HFile.
Compactage mineur:
Le compactage mineur est un processus automatique qui s’exécute en arrière-plan. Il fusionne un petit nombre de HFiles de petite taille en un fichier plus grand. Cette opération réduit le nombre de fichiers et, par conséquent, le nombre de recherches sur disque nécessaires lors des lectures, améliorant ainsi les performances. Cependant, le compactage mineur ne traite pas les marqueurs de suppression
Compactage majeur:
Le compactage majeur est une opération plus exhaustive qui fusionne tous les HFiles d’une région en un seul fichier. Contrairement au compactage mineur, il supprime physiquement les données marquées pour suppression et élimine les cellules dont la durée de vie (TTL) a expiré. Cette opération libère de l’espace disque et améliore significativement les performances de lecture en réduisant la quantité de données obsolètes. Toutefois, le compactage majeur est une tâche gourmande en ressources et peut impacter les performances globales du cluster pendant son exécution. Il est donc recommandé de le planifier durant les périodes de faible activité.
Chaque fois qu’un serveur de région échoue, ZooKeeper informe le HMaster de l’échec.
Ensuite, HMaster distribue et alloue les régions du serveur de région en panne à de nombreux serveurs de région actifs. Pour récupérer les données du MemStore du serveur de région défaillant, le HMaster distribue le WAL à tous les serveurs de région.
Chaque serveur de région réexécute le WAL pour créer le MemStore pour la famille de colonnes de cette région défaillante.
Les données sont écrites par ordre chronologique (dans un ordre opportun) dans WAL. Par conséquent, réexécuter ce WAL signifie effectuer toutes les modifications apportées et stockées dans le fichier MemStore.
Ainsi, une fois que tous les serveurs régionaux ont exécuté le WAL, les données MemStore de toutes les familles de colonnes sont récupérées.
Il existe plusieurs manière d’interagir avec la base de données Apache HBase :
HDFS comme système de stockage : HBase utilise HDFS pour stocker ses données de façon distribuée et résistante aux pannes.
Interaction avec MapReduce : Permet d’exécuter des traitements massifs parallèles sur les données stockées dans HBase.
Intégration avec d’autres outils : Hive(Exécution de requêtes SQL sur les données), Pig(Scripts pour traiter les données.), Spark (Analyse distribuée en mémoire.)
HBase ne prend pas en charge les transactions ACID complètes comme les bases de données relationnelles. Cela peut être une limitation pour les applications nécessitant une forte cohérence.
HBase utilise une API Java et des commandes de type shell plutôt qu’un langage de requête relationnel comme SQL. Bien que Phoenix ou Hive permettent d’exécuter des requêtes SQL sur HBase, cela ajoute une couche supplémentaire.
La configuration, l’optimisation et la maintenance d’un cluster HBase peuvent être complexes et nécessitent une expertise approfondie.
HBase est conçu pour des lectures/écritures massives et peut avoir une latence élevée pour les requêtes de faible volume.
Les grands volumes de données peuvent entraîner des problèmes de performance liés à la gestion de la mémoire et la collecte des objets inutilisés (Garbage Collection).
Le stockage déséquilibré des données peut entraîner une surcharge de certains nœuds du cluster (hotspotting).
Bien que HBase soit rapide pour les lectures/écritures de rangées spécifiques, il n’est pas optimisé pour des requêtes analytiques complexes sans l’intégration d’outils comme Apache Hive.
HBase est une solution puissante pour les applications qui nécessitent un stockage et un traitement rapides de grands ensembles de données. Grâce à son intégration native avec Hadoop, il offre une plateforme robuste pour les systèmes Big Data. Cependant, les coûts et la complexité de son déploiement peuvent constituer un frein.
HBase est utilisé pour gérér les transactions à grande échelle dans les plateformes de mobile money telles que M-Pesa
Smart Cities et IoT : Les projets de villes intelligentes en Afrique (comme à Kigali ou Nairobi) exploitent HBase pour collecter et analyser des données en temps réel provenant de capteurs urbains, systèmes de gestion de trafic, et infrastructures de surveillance.
Avant de faire une installation et déploiement de Apache HBase, le data Engineer doit faire une évaluation et choisir entre :
Ce mode est une configuration intermédiaire qui simule un environnement distribué sur une seule machine.
Ce mode est utilisé pour les environnements de production à grande échelle.
le fichier .bashrc
export HBASE_HOME=/data/projects/COURS-MASTER/CoursBigData/hbase/hbase
export PATH=$PATH:$HBASE_HOME/binAjouter les variables d’environnements suivants dans le fichier $HBASE_HOME/conf/hbase-env.sh
Modifier la valeur de la propriété hbase.cluster.distributed à true dans le fichier $HBASE_HOME/conf/hbase-site.xml
Accéder à la page d’accueil par le lien :
http://localhost:16010
Créer une table Personne avec les informations suivantes : son identidé avec son nom, prénom et son adresse qui comprend la rue et son numéro de téléphone
Exécuter la commande hbase shell sur le terminal et exécuter les réquêtes suivantes :
# Créer une personne avec les familles de colonnes identite et adresse
create 'personne', 'identite', 'adresse'
## Ajouter des personnes
# Première personne
put 'personne', '1', 'identite:nom', 'Drabo'
put 'personne', '1', 'identite:prenom', 'Constantin'
put 'personne', '1', 'adresse:rue', '90 av. John Kennedy'
put 'personne', '1', 'adresse:telephone', '70157017'
# Seconde personne
put 'personne', '2', 'identite:nom', 'Bessin'
put 'personne', '2', 'identite:prenom', 'Ivan'
put 'personne', '2', 'adresse:rue', '90 av. John Kennedy'
put 'personne', '2', 'adresse:telephone', '75892513'# Obtenir à partir du rowkey
get 'personne', '1'
# Scanne toutes les données de la table
scan 'personne'
# Modifier une personne
put 'personne', '1', 'adresse:telephone', '78524210'
# Supprimer une partie de la donnée
delete 'personne', '2', 'adresse:telephone'
# Supprimer la ligne entière
deleteall 'personne', '2'Créer une application maven avec les dépendances :
<dependencies>
<!-- HBase Dependency -->
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>2.4.9</version> <!-- Remplacez par la version appropriée -->
</dependency>
<!-- ZooKeeper Dependency -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.6.3</version> <!-- Remplacez par la version appropriée -->
</dependency>
<!-- SLF4J for logging (optionnel) -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.32</version>
</dependency>
</dependencies>Configuration config = HBaseConfiguration.create();
/**
* Configuration de Zookeeper.
* Son adresse et son port de communication.
*/
config.set("hbase.zookeeper.quorum", "localhost");
config.set("hbase.zookeeper.property.clientPort", "2181");
try (Connection connection = ConnectionFactory.createConnection(config);
Admin admin = connection.getAdmin()) {
// Vérification si la table existe
TableName tableName = TableName.valueOf("personne");
if (admin.tableExists(tableName)) {
System.out.println("La table existe.");
} else {
System.out.println("La table n'existe pas.");
}
// Accéder à la table
try (Table table = connection.getTable(tableName)) {
// Insérer une donnée
Put put = new Put(Bytes.toBytes("1")); // RowKey
put.addColumn(Bytes.toBytes("identite"), Bytes.toBytes("nom"), Bytes.toBytes("Dupont"));
put.addColumn(Bytes.toBytes("identite"), Bytes.toBytes("prenom"), Bytes.toBytes("Jean"));
table.put(put);
System.out.println("Donnée insérée.");
// Lire une donnée
Get get = new Get(Bytes.toBytes("1"));
Result result = table.get(get);
byte[] value = result.getValue(Bytes.toBytes("identite"), Bytes.toBytes("nom"));
System.out.println("Nom : " + Bytes.toString(value));
}Démarrer le service REST en exécutant la commande : hbase rest start.
Ensuit faire un call sur les endpoints dont un exemple :
Qui donne le résultat suivant :
Base de données distribuée pour les Big Data