Tutoriel HDFS : Architecture, opération de lecture et d'écriture à l'aide de l'API Java

Qu’est-ce que HDFS ?

HDFS est un système de fichiers distribué permettant de stocker des fichiers de données très volumineux, fonctionnant sur des clusters de matériel standard. Il est tolérant aux pannes, évolutif et extrêmement simple à développer. Hadoop est fourni avec HDFS (Systèmes de fichiers distribués Hadoop).

Lorsque les données dépassent la capacité de stockage sur une seule machine physique, il devient essentiel de les répartir sur plusieurs machines distinctes. Un système de fichiers qui gère des opérations spécifiques au stockage sur un réseau de machines est appelé système de fichiers distribué. HDFS est l'un de ces logiciels.

HDFS Architecture

Le cluster HDFS se compose principalement d'un NomNœud qui gère le système de fichiers Métadonnées et Nœuds de données qui stocke le les données réelles.

  • NomNœud: NameNode peut être considéré comme un maître du système. Il maintient l'arborescence du système de fichiers et les métadonnées de tous les fichiers et répertoires présents dans le système. Deux fichiers 'Image d'espace de noms' les nouveautés 'modifier le journal' sont utilisés pour stocker les informations de métadonnées. Namenode connaît tous les nœuds de données contenant des blocs de données pour un fichier donné, cependant, il ne stocke pas les emplacements des blocs de manière persistante. Ces informations sont reconstruites à chaque fois à partir des datanodes au démarrage du système.
  • Noeud de données : Les DataNodes sont des esclaves qui résident sur chaque machine d'un cluster et fournissent le stockage réel. Il est responsable du traitement, des demandes de lecture et d’écriture des clients.

Les opérations de lecture/écriture dans HDFS fonctionnent au niveau du bloc. Les fichiers de données dans HDFS sont divisés en morceaux de la taille d'un bloc, qui sont stockés en tant qu'unités indépendantes. La taille de bloc par défaut est de 64 Mo.

HDFS fonctionne sur un concept de réplication de données dans lequel plusieurs répliques de blocs de données sont créées et distribuées sur les nœuds d'un cluster pour permettre une haute disponibilité des données en cas de panne de nœud.

Savez-vous? Un fichier dans HDFS, qui est plus petit qu’un seul bloc, n’occupe pas la totalité du stockage d’un bloc.

Opération de lecture dans HDFS

La demande de lecture de données est servie par HDFS, NameNode et DataNode. Appelons le lecteur « client ». Le diagramme ci-dessous représente l'opération de lecture de fichier dans Hadoop.

Opération de lecture dans HDFS

  1. Un client lance une demande de lecture en appelant 'ouvrir()' méthode de l'objet FileSystem ; c'est un objet de type DistributedFileSystemDistributedFileSystem.
  2. Cet objet se connecte au namenode à l'aide de RPC et obtient des informations de métadonnées telles que les emplacements des blocs du fichier. Veuillez noter que ces adresses correspondent aux premiers blocs d'un fichier.
  3. En réponse à cette demande de métadonnées, les adresses des DataNodes ayant une copie de ce bloc sont renvoyées.
  4. Une fois les adresses des DataNodes reçues, un objet de type FSDataInputStream est restitué au client. FSDataInputStream contient DFSInputStream qui s'occupe des interactions avec DataNode et NameNode. À l'étape 4 illustrée dans le diagramme ci-dessus, un client appelle 'lire()' méthode qui provoque DFSInputStream pour établir une connexion avec le premier DataNode avec le premier bloc d'un fichier.
  5. Les données sont lues sous forme de flux dans lesquels le client invoque 'lire()' méthode à plusieurs reprises. Ce processus de lis() l'opération continue jusqu'à ce qu'elle atteigne la fin du bloc.
  6. Une fois la fin d'un bloc atteinte, DFSInputStream ferme la connexion et continue à localiser le DataNode suivant pour le bloc suivant.
  7. Une fois qu'un client a terminé la lecture, il appelle une fermeture() méthode.

Opération d'écriture dans HDFS

Dans cette section, nous comprendrons comment les données sont écrites dans HDFS via des fichiers.

Opération d'écriture dans HDFS

  1. Un client lance l'opération d'écriture en appelant la méthode 'create()' de l'objet DistributedFileSystem qui crée un nouveau fichier – Étape no. 1 dans le diagramme ci-dessus.
  2. L'objet DistributedFileSystem se connecte au NameNode à l'aide de l'appel RPC et lance la création d'un nouveau fichier. Cependant, ce fichier crée une opération qui n'associe aucun bloc au fichier. Il est de la responsabilité de NameNode de vérifier que le fichier (en cours de création) n'existe pas déjà et qu'un client dispose des autorisations appropriées pour créer un nouveau fichier. Si un fichier existe déjà ou si le client ne dispose pas des autorisations suffisantes pour créer un nouveau fichier, alors IOException est jeté au client. Autrewise, l'opération réussit et un nouvel enregistrement pour le fichier est créé par le NameNode.
  3. Une fois qu'un nouvel enregistrement dans NameNode est créé, un objet de type FSDataOutputStream est renvoyé au client. Un client l'utilise pour écrire des données dans le HDFS. La méthode d'écriture de données est invoquée (étape 3 du diagramme).
  4. FSDataOutputStream contient l'objet DFSOutputStream qui gère la communication avec DataNodes et NameNode. Pendant que le client continue d'écrire des données, DFSOutputStream continue de créer des paquets avec ces données. Ces paquets sont mis en file d'attente dans une file d'attente appelée File d'attente de données.
  5. Il existe un autre composant appelé Streamer de données qui consomme ça File d'attente de données. DataStreamer demande également à NameNode l'allocation de nouveaux blocs, sélectionnant ainsi les DataNodes souhaitables à utiliser pour la réplication.
  6. Désormais, le processus de réplication commence par la création d'un pipeline à l'aide de DataNodes. Dans notre cas, nous avons choisi un niveau de réplication de 3 et il y a donc 3 DataNodes dans le pipeline.
  7. Le DataStreamer déverse les paquets dans le premier DataNode du pipeline.
  8. Chaque DataNode d'un pipeline stocke le paquet qu'il reçoit et le transmet au deuxième DataNode d'un pipeline.
  9. Une autre file d'attente, « Ack Queue », est maintenue par DFSOutputStream pour stocker les paquets qui attendent un accusé de réception de DataNodes.
  10. Une fois que l'accusé de réception d'un paquet dans la file d'attente est reçu de tous les DataNodes du pipeline, il est supprimé de la « file d'attente d'accusés de réception ». En cas de panne de DataNode, les paquets de cette file d'attente sont utilisés pour relancer l'opération.
  11. Une fois qu'un client a terminé l'écriture des données, il appelle une méthode close() (étape 9 dans le diagramme). L'appel à close() entraîne le vidage des paquets de données restants dans le pipeline, suivi de l'attente d'un accusé de réception.
  12. Une fois l'accusé de réception final reçu, NameNode est contacté pour lui indiquer que l'opération d'écriture du fichier est terminée.

Accédez à HDFS à l'aide de l'API JAVA

Dans cette section, nous essayons de comprendre Java interface utilisée pour accéder au système de fichiers de Hadoop.

Afin d'interagir par programmation avec le système de fichiers Hadoop, Hadoop fournit plusieurs classes JAVA. Le package nommé org.apache.hadoop.fs contient des classes utiles pour manipuler un fichier dans le système de fichiers Hadoop. Ces opérations incluent l’ouverture, la lecture, l’écriture et la fermeture. En fait, l'API de fichiers pour Hadoop est générique et peut être étendue pour interagir avec d'autres systèmes de fichiers autres que HDFS.

Lire un fichier depuis HDFS, par programme

Objet java.net.URL est utilisé pour lire le contenu d'un fichier. Pour commencer, nous devons faire en sorte que Java reconnaisse le schéma d'URL hdfs de Hadoop. Cela se fait en appelant setURLStreamHandlerFactory méthode sur l'objet URL et une instance de FsUrlStreamHandlerFactory lui est transmise. Cette méthode ne doit être exécutée qu'une seule fois par JVM, il est donc enfermé dans un bloc statique.

Un exemple de code est-

public class URLCat {
    static {
        URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
    }
    public static void main(String[] args) throws Exception {
        InputStream in = null;
        try {
            in = new URL(args[0]).openStream();
            IOUtils.copyBytes(in, System.out, 4096, false);
        } finally {
            IOUtils.closeStream(in);
        }
    }
}

Ce code ouvre et lit le contenu d'un fichier. Le chemin de ce fichier sur HDFS est transmis au programme en tant qu'argument de ligne de commande.

Accéder à HDFS à l'aide de l'INTERFACE DE LIGNE DE COMMANDE

C'est l'un des moyens les plus simples d'interagir avec HDFS. L'interface de ligne de commande prend en charge les opérations du système de fichiers telles que la lecture du fichier, la création de répertoires, le déplacement de fichiers, la suppression de données et la liste des répertoires.

Nous pouvons courir '$HADOOP_HOME/bin/hdfs dfs -aide' pour obtenir une aide détaillée sur chaque commande. Ici, 'dfs' est une commande shell de HDFS qui prend en charge plusieurs sous-commandes.

Certaines des commandes largement utilisées sont répertoriées ci-dessous, ainsi que quelques-unes des commandes les plus utilisées.tails de chacun.

1. Copiez un fichier du système de fichiers local vers HDFS

$HADOOP_HOME/bin/hdfs dfs -copyFromLocal temp.txt /

Accéder à HDFS à l'aide de l'INTERFACE DE LIGNE DE COMMANDE

Cette commande copie le fichier temp.txt du système de fichiers local vers HDFS.

2. On peut lister les fichiers présents dans un répertoire en utilisant -ls

$HADOOP_HOME/bin/hdfs dfs -ls /

Accéder à HDFS à l'aide de l'INTERFACE DE LIGNE DE COMMANDE

Nous pouvons voir un fichier 'temp.txt' (copié plus tôt) étant répertorié sous '/' répertoire.

3. Commande pour copier un fichier sur le système de fichiers local depuis HDFS

$HADOOP_HOME/bin/hdfs dfs -copyToLocal /temp.txt

Accéder à HDFS à l'aide de l'INTERFACE DE LIGNE DE COMMANDE

Nous pouvons voir temp.txt copié sur un système de fichiers local.

4. Commande pour créer un nouveau répertoire

$HADOOP_HOME/bin/hdfs dfs -mkdir /mydirectory

Accéder à HDFS à l'aide de l'INTERFACE DE LIGNE DE COMMANDE

Vérifiez si un répertoire est créé ou non. Maintenant, il faut savoir comment faire 😉