.

Auteurs

  • SAWADOGO Yves Dieudonné
  • DRABO Constantin
  • BOKETONOU Fréderic
  • OUEDRAOGO Arnaud

Agenda

Introduction à Apache HBase

Architecture et fonctionnement

Intégration avec l’écosystème Hadoop

Agenda

Limites et défis

Conclusion et Perspectives

Exemples d’applications pratiques

Installation, déploiement et démo pratiques

Introduction à Apache HBase

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.

Source : Wizlab

Introduction à Apache HBase

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.

Architecture et fonctionnement

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)

Source : Wikipedia

Architecture et fonctionnement

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

Architecture et fonctionnement

  • Tables : Composées de lignes et de colonnes.
  • Familles de colonnes : Les colonnes sont regroupées en familles qui sont définies à la création de la table.
  • Clé de ligne : Chaque ligne est identifiée de manière unique par une clé de ligne.
  • Colonnes : Regroupées en familles de colonnes définies lors de la création de la table. Les colonnes au sein d’une même famille partagent des caractéristiques communes.
  • Horodatage : Chaque cellule peut contenir plusieurs versions de données, chacune associée à un horodatage, permettant ainsi de conserver un historique des valeurs.

Architecture et fonctionnement

Architecture et fonctionnement

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.

Architecture et fonctionnement

Architecture et fonctionnement

Consistence et la tolerance du partitionnement : Le mécanisme de l’écriture

  1. Chaque fois que le client a une demande d’écriture, il écrit les données dans le WAL (Write Ahead Log).
  • Les modifications sont ensuite ajoutées à la fin du fichier WAL.
  • Il est conservé dans chaque serveur de région et le serveur de région l’utilise pour récupérer les données qui ne sont pas validées sur le disque.
  1. Une fois les données écrites dans le WAL, elles sont copiées dans le MemStore.
  1. Une fois les données placées dans MemStore, le client reçoit l’accusé de réception.
  1. Lorsque le MemStore atteint le seuil, il sauvegarde ou valide les données dans un HFile.

Architecture et fonctionnement

Consistence et la tolerance du partitionnement : Le mécanisme de la lecture

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.

Architecture et fonctionnement

Consistence et la tolerance du partitionnement : Le compactage

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

Architecture et fonctionnement

Consistence et la tolerance du partitionnement : Le compactage

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é.

Architecture et fonctionnement

Consistence et la tolerance du partitionnement : Crash de HBase et récupération de données

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.

Architecture et fonctionnement

Intéraction avec Apache HBase

Il existe plusieurs manière d’interagir avec la base de données Apache HBase :

  • HBase Shell : Grâce au shell terminal on peut interargir avec Apache HBase
  • API REST : des appels de endpoints
  • API java: des interface Java pour manipuler les tables de HBase

Apache HBase et Hadoop

HDFS comme système de stockage : HBase utilise HDFS pour stocker ses données de façon distribuée et résistante aux pannes.

Apache HBase et Hadoop

Interaction avec MapReduce : Permet d’exécuter des traitements massifs parallèles sur les données stockées dans HBase.

Apache HBase et Hadoop

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.)

Limites et défis

Les limites et les défis

  • Gestion des transactions complexes :

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.

  • Langage de requête limité :

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.

  • Maintenance complexe :

La configuration, l’optimisation et la maintenance d’un cluster HBase peuvent être complexes et nécessitent une expertise approfondie.

Limites et défis

Les limites et les défis

  • Latence élevée pour les petites requêtes:

HBase est conçu pour des lectures/écritures massives et peut avoir une latence élevée pour les requêtes de faible volume.

  • Garbage Collection et Java Heap Size:

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).

  • Fragmentation des données :

Le stockage déséquilibré des données peut entraîner une surcharge de certains nœuds du cluster (hotspotting).

Limites et défis

Les limites et les défis

  • Requêtes analytiques limitées :

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.

Conclusion et perspectives

Conclusion

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.

Perspectives

  • Optimisation de la latence des lectures.
  • Intégration accrue avec les clouds (cloud hybride et multi cloud)
  • Support pour de nouveaux modèles de traitement temps réel.

Exemples d’applications pratiques

Les cas d’utilisation de Apache HBase :

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.

Installation et déploiement

Les prérequis

Avant de faire une installation et déploiement de Apache HBase, le data Engineer doit faire une évaluation et choisir entre :

  1. Déploiement en mode Standalone (Mode autonome)
  • Caractéristiques:
    • Pas besoin de configuration complexe.
    • Fonctionne sans Hadoop Distributed File System (HDFS).
    • Toutes les composantes (HBase Master, RegionServers, Zookeeper) s’exécutent sur une seule machine.
    • Les données sont stockées dans le système de fichiers local.
  • Avantages :
    • Simple à configurer et rapide à exécuter
    • Consommation minimale des ressources
  • Limites : il n’est pas adapté à la production, et ne tire pas parti de la distribution des données

Installation et déploiement

  1. Déploiement en mode pseudo-distribué (Single-Node Cluster)

Ce mode est une configuration intermédiaire qui simule un environnement distribué sur une seule machine.

  • Caractéristiques:
    • Hadoop et HBase sont configurés pour fonctionner en mode distribué sur une seule machine.
    • Utilisation de HDFS pour le stockage des données.
    • Zookeeper fonctionne également sur la même machine.
  • Avantages :
    • Approximativement similaire à une configuration distribuée complète.
    • Utile pour tester la configuration distribuée sur une seule machine.
  • Limites :
    • Limitations de performance et de mémoire, car tout s’exécute sur un seul nœud.
    • Inadapté pour un déploiement en production.

Installation et déploiement

  1. Déploiement en Mode Complètement Distribué (Fully Distributed Cluster)

Ce mode est utilisé pour les environnements de production à grande échelle.

  • Caractéristiques:
    • Chaque composant (HBase Master, RegionServers, Zookeeper) fonctionne sur des nœuds distincts du cluster.
    • HDFS est utilisé pour le stockage distribué des données.
    • Supporte un grand nombre de clients simultanés et un volume massif de données.
  • Avantages :
    • Haute disponibilité, évolutivité et performance.
    • Capacité à traiter des volumes massifs de données en temps réel.
  • Limites :
    • Complexité de configuration et de maintenance.
    • Exige des ressources matérielles importantes.

Installation et déploiement

Installation pour un déploiement en mode pseudo-distribué

  1. Démarrer Hadoop

Installation et déploiement

Installation pour un déploiement en mode pseudo-distribué

  1. Télécharger et Dezipper

Installation et déploiement

Installation pour un déploiement en mode pseudo-distribué

  1. Configurer les fichier essentiels

le fichier .bashrc

export HBASE_HOME=/data/projects/COURS-MASTER/CoursBigData/hbase/hbase
export PATH=$PATH:$HBASE_HOME/bin

Ajouter les variables d’environnements suivants dans le fichier $HBASE_HOME/conf/hbase-env.sh

export JAVA_HOME=/home/constantindrabo/.sdkman/candidates/java/8.0.432-tem
export  HBASE_REGIONSERVERS=/data/projects/COURS-MASTER/CoursBigData/hbase/hbase/conf/regionservers
export HBASE_MANAGES_ZK=true

Installation et déploiement

Installation pour un déploiement en mode pseudo-distribué

Modifier la valeur de la propriété hbase.cluster.distributed à true dans le fichier $HBASE_HOME/conf/hbase-site.xml

<property>
    <name>hbase.cluster.distributed</name>
    <value>true</value>
  </property>
  <property>
    <name>hbase.tmp.dir</name>
    <value>./tmp</value>
  </property>
  <property>
    <name>hbase.unsafe.stream.capability.enforce</name>
    <value>false</value>
  </property>

Installation et déploiement

Installation pour un déploiement en mode pseudo-distribué

  1. Démarrer le service hbase
start-hbase.sh

Accéder à la page d’accueil par le lien :

http://localhost:16010

Demo - interaction avec HBase

Interaction avec HBase shell

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'

Demo - interaction avec HBase

Interaction avec HBase shell

# 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'

Demo - interaction avec HBase

Interaction avec HBase shell


#Désactiver la table 
disable 'personne'

#Avant de la supprimer
drop 'personne'

Demo - interaction avec HBase

Interaction avec l’API Java

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>

Demo - Interaction avec HBase

Interaction avec l’API Java

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));
}

Demo - Interaction avec HBase

Interaction en utilisant des endpoints REST

Démarrer le service REST en exécutant la commande : hbase rest start.

Ensuit faire un call sur les endpoints dont un exemple :


curl -X GET -H "Accept: application/json" http://localhost:8080/personne/1

Demo - Interaction avec HBase

Interaction en utilisant des endpoints REST

Qui donne le résultat suivant :

{
    "Row": [
        {
            "key": "MQ==",
            "Cell": [
                {
                    "column": "aWRlbnRpdGU6bm9t",
                    "timestamp": 1737160819125,
                    "$": "RHVwb250"
                },
                {
                    "column": "aWRlbnRpdGU6cHJlbm9t",
                    "timestamp": 1737160819125,
                    "$": "SmVhbg=="
                }
            ]
        }
    ]
}

Questions