Tutoriel HDFS: architecture, lecture & Opération d'écriture à l'aide de l'API Java

Table des matières:

Anonim

Qu'est-ce que HDFS?

HDFS est un système de fichiers distribué pour stocker de très gros fichiers de données, fonctionnant sur des grappes de matériel de base. Il est tolérant aux pannes, évolutif et extrêmement simple à développer. Hadoop est fourni avec HDFS ( Hadoop Distributed File Systems ).

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é un système de fichiers distribué. HDFS est l'un de ces logiciels.

Dans ce tutoriel, nous allons apprendre,

  • Qu'est-ce que HDFS?
  • Architecture HDFS
  • Lire l'opération
  • Opération d'écriture
  • Accéder à HDFS à l'aide de l'API JAVA
  • Accéder à HDFS à l'aide de l'INTERFACE DE COMMAND-LINE

Architecture HDFS

Le cluster HDFS se compose principalement d'un NameNode qui gère les métadonnées du système de fichiers et d'un DataNodes qui stocke les données réelles .

  • NameNode: NameNode peut être considéré comme un maître du système. Il gère 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 nom» et «journal d'édition» sont utilisés pour stocker les informations de métadonnées. Namenode a connaissance de tous les datanodes contenant des blocs de données pour un fichier donné, cependant, il ne stocke pas les emplacements de bloc de manière persistante. Ces informations sont reconstituées à chaque fois à partir des datanodes au démarrage du système.
  • DataNode: les DataNodes sont des esclaves qui résident sur chaque machine d'un cluster et fournissent le stockage réel. Il est responsable du service, de la lecture et de l'écriture des demandes 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 sont distribuées sur des nœuds à travers un cluster pour permettre une haute disponibilité des données en cas de défaillance du nœud.

Savez-vous? Un fichier en HDFS, qui est plus petit qu'un seul bloc, n'occupe pas le stockage complet d'un bloc.

Lire l'opération dans HDFS

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

  1. Un client lance une demande de lecture en appelant la méthode 'open ()' de l'objet FileSystem; c'est un objet de type DistributedFileSystem .
  2. Cet objet se connecte à 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 sont des 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 renvoyé au client. FSDataInputStream contient DFSInputStream qui prend en charge les interactions avec DataNode et NameNode. À l'étape 4 illustrée dans le diagramme ci-dessus, un client appelle la méthode 'read ()' qui oblige DFSInputStream à établir une connexion avec le premier DataNode avec le premier bloc d'un fichier.
  5. Les données sont lues sous la forme de flux dans lesquels le client appelle à plusieurs reprises la méthode 'read ()' . Ce processus d'opération read () continue jusqu'à ce qu'il atteigne la fin du bloc.
  6. Une fois la fin d'un bloc atteinte, DFSInputStream ferme la connexion et passe à localiser le prochain DataNode pour le bloc suivant
  7. Une fois qu'un client a terminé la lecture, il appelle une méthode close () .

Opération d'écriture dans HDFS

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

  1. Un client lance une 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 d'un appel RPC et lance la création d'un nouveau fichier. Cependant, ce fichier crée l'opération n'associe aucun bloc au fichier. Il est de la responsabilité de NameNode de vérifier que le fichier (qui est 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, IOException est renvoyée au client. Sinon, 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 des données est appelée (étape 3 dans le diagramme).
  4. FSDataOutputStream contient un objet DFSOutputStream qui s'occupe de 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 DataQueue .
  5. Il existe un autre composant appelé DataStreamer qui consomme ce DataQueue . 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 verse des 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 Ack». En cas d'échec 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) Appel à close (), qui entraîne le vidage des paquets de données restants vers le pipeline, suivi par 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 de fichier est terminée.

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

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

Afin d'interagir avec le système de fichiers de Hadoop par programmation, Hadoop fournit plusieurs classes JAVA. Le package nommé org.apache.hadoop.fs contient des classes utiles dans la manipulation d'un fichier dans le système de fichiers de Hadoop. Ces opérations incluent, ouvrir, lire, écrire et fermer. 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.

Lecture d'un fichier à partir de HDFS, par programmation

L'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 la méthode setURLStreamHandlerFactory 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, elle est donc incluse 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 s'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 COMMAND-LINE

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 exécuter '$ HADOOP_HOME / bin / hdfs dfs -help' 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 avec quelques détails sur chacune d'elles.

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

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

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

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

$HADOOP_HOME/bin/hdfs dfs -ls /

Nous pouvons voir un fichier 'temp.txt' (copié précédemment) répertorié sous le répertoire '/' .

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

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

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

Vérifiez si un répertoire est créé ou non. Maintenant, vous devriez savoir comment faire ;-)