Dans l’article précédent j’ai brièvement présenté le concept de HDFS (Hadoop Distributed Filesystem). Dans cet article nous allons le présenter un peu plus en détail.
Dans ce deuxième article de la série, nous reviendrons sur le concept déjà introduit des namenode et datanode. Puis nous introduirons un élément important, le secondary namenode.
HDFS :
HDFS ou Hadoop Distributed File System est un système de fichier écrit en Java, structuré en blocs où chaque fichier est divisé en blocs de taille prédéterminée. Ces blocs sont stockés dans un cluster (grappe) d’une ou de plusieurs machines. L’architecture HDFS est basée sur un modèle Maître/Esclave, dans lequel un cluster se compose d’un seul NameNode (nœud Maître) et un certain nombre de DataNodes (nœuds esclaves). Bien que l’on puisse exécuter plusieurs datanodes sur une seule machine, dans un environnement de production, ces datanodes sont le plus souvent répartis sur différentes machines.
Qu’est-ce qu’un NameNode ?
Un NameNode agit comme le maître du système et peut être considéré comme son organisateur. Il entretient et gère les blocs présents sur les DataNodes, maintient l’ordre dans les méta-données, distribue les tâches et stocke l’emplacement de tous les fichiers présents dans le système local de fichiers. L’architecture HDFS est construite de telle manière que les données d’un utilisateur ne sont jamais stockées dans le NameNode. A chaque fois qu’un client doit lire ou écrire une donnée, il communique avec le NameNode lequel répond à la demande en retournant la cartographie des blocs de données ainsi que les informations du DataNode.
Fonctions principales d’un NameNode :
- Le NameNode maintient le système de fichiers et garde une trace de toutes modifications de ses propriétés.
- Il contrôle l’exécution des opérations d’E/S de bas niveau des Datanodes.
- Il gère la configuration du cluster et maintient une cartographie de l’emplacement et du découpage des blocs de données stockés dans le système de fichiers.
- Il trace l’emplacement d’un bloc de données dans un DataNode et affecte la cartographie d’un ensemble de blocs dans un fichier.
- Il enregistre les métadonnées de tous les fichiers enregistrés dans le cluster, comme par exemple l’emplacement, la taille des fichiers, les permissions, l’hiérarchie, etc.
- A l’aide d’un journal de transactions, nommé EditLog, le NameNode enregistre le moindre changement des métadonnées du système de fichiers. Si par exemple, un fichier est supprimé de HDFS, le NameNode consigne ceci immédiatement dans ce journal.
- Le NameNode est également responsable de gérer le « facteur de réplication » de tous les blocs. Tout changement du facteur de réplication de l’un des blocs sera consigné par le NameNode dans le journal des transactions.
- NameNode reçoit régulièrement un « battement de cœur » et un BlockReport de tous les DataNodes dans le cluster afin de s’assurer que les datanodes fonctionnent correctement. Un BlockReport (ou rapport de bloc) contient une liste de tous les blocs d’un DataNode.
- En cas de défaillance du datanode, le NameNode choisit de nouveaux datanodes pour de nouvelles réplications de blocs de données, équilibre la charge d’utilisation des disques et gère également le trafic de communication des datanodes.
Qu’est-ce qu’un DataNode ?
Les Datanodes sont les nœuds Clients (ou slave, aussi appellé worker) dans HDFS et peut être considéré comme un serveur de blocs de données. Il exécute les opérations demandées par le NameNode et représente la partie ‘stockage’ de HDFS. Contrairement au NameNode, un datanode est installé sur un matériel de base, peu cher et qui n’offre aucune haute disponibilité.
Comme évoqué dans la section précédente, les datanodes communiquent avec le NameNode périodiquement (sous forme “de battements de cœurs”) et fournissent au namenode un état sur les blocs de données qu’ils contiennent. Ceci permet au NameNode de maintenir l’état des datanodes et de savoir si un datanode en particulier est hors d’usage ou hors service. Egalement, Les datanodes communiquent entre eux directement pour les besoins de réplication.
Fonctions principales d’un DataNode :
- Un Datanode effectue les opérations de lecture et d’écriture de bas-niveau émanant du NameNode.
- Il est responsable de la création de blocs, en les supprimant et/ou les répliquant en fonctions des décisions prises par le NameNode.
- Envoyer régulièrement un rapport sur tous les blocs présents dans le cluster au NameNode.
- Créer un canal de communication et transmet des blocs de données à d’autres DataNodes.
- Envoyer périodiquement des pulsations au NameNode (en moyenne une fois toutes les 3 secondes), pour signaler l’état de santé global de HDFS.
- Stocker chaque bloc de données HDFS dans des fichiers séparés dans son système de fichiers local.
- Effectuer un scan au démarrage pour cartographier les blocs de données HDFS et envoyer un BlockReport au NameNode.
Un répertoire d’un DataNode, contient un fichier VERSION et deux autres fichiers. Le fichier VERSION contient un champ storageID lequel est un identifiant qui permet au namenode d’identifier le datanode. Les fichiers de blocs de données qui sont stockés au sein du datanode sont constitués d’un préfixe blk_ et d’un suffixe sous forme d’identifiant du bloc. Le premier fichier qu’on trouve est un fichier sans extensions qui représente le bloc en lui-même (par exemple : blk_1) et le second fichier est un fichier des métadonnées du bloc.
Qu’est-ce qu’un Secondary NameNode ?
Il s’agit ici d’un abus de langage! Dans l’architecture HDFS, le nom – Secondary NameNode donne l’impression que c’est un substitut du NameNode. Hélas! Ce n’est pas le cas..
Maintenant que vous savez qu’un NameNode est un conteneur d’informations vitales liées aux métadonnées de tous les blocs stockés dans HDFS. Ces données sont stockées non seulement dans la mémoire principale, mais également sur disque. Les deux fichiers associés sont les suivants :
- Fsimage: Une image du système de fichiers au démarrage du NameNode.
- EditLogs: Une journalisation des modifications effectuées sur le système de fichiers après le démarrage du NameNode.
Le Secondary NameNode lit en permanence tous les fichiers et métadonnées à partir de la RAM du NameNode et les écrit sur disque. Il est chargé d’appliquer les modifications consignées dans Editlogs aux blocs de données référencés dans Fsimage. Il télécharge les EditLogs du NameNode à intervalles régulières et applique les modifications à Fsimage. Le nouveau Fsimage est copié vers le NameNode et est utilisé chaque fois que le NameNode est lancé.
Cependant, comme le Secondary NameNode est incapable de traiter les métadonnées il ne peut pas être considéré comme un substitut du NameNode. Donc, si le NameNode vient à tomber, l’ensemble Hadoop HDFS tombe 5° la version é de Hadoop élimine cette faille) et vous perdrez l’ensemble des fichiers présents dans la RAM. Ceci étant, il reste un élément important dans le processus de récupération du système en cas de plantage du NameNode principal. Il vérifie périodiquement l’état du NameNode principal et copie à chaque vérification les fichiers editLogs et fsimage.