Java Big Data Road - Explication détaillée HDFS (5) - Processus d'exécution et fonctionnement de l'API

HDFS (Distributed File Storage System) - processus d'exécution et fonctionnement de l'API

Table des matières

HDFS (Distributed File Storage System) - processus d'exécution et fonctionnement de l'API

processus

1. Processus de lecture/téléchargement

2. Processus d'écriture/téléchargement

3. Processus de suppression

Fonctionnement de l'API

1. Étapes de préparation

2. Fonctionnement de l'API


processus

1. Processus de lecture/téléchargement

  1. Le client initie une requête RPC au NameNode
  2. NameNode vérifiera après avoir reçu la demande :
    1. Vérifier si le chemin spécifié existe
    2. Vérifier si le fichier existe
  3. Si le fichier existe, le NameNode lit les métadonnées et envoie un signal au client
  4. Le client demandera au NameNode l'adresse du premier Block
  5. NameNode lira les métadonnées après avoir reçu la demande, puis mettra l'adresse du premier bloc dans la file d'attente pour le client
  6. Par défaut, un bloc a trois adresses (3 copies). Après avoir reçu la file d'attente, le client sélectionne un nœud plus proche pour lire le premier bloc. Une fois la lecture terminée, le bloc sera vérifié par somme de contrôle ; si la vérification échoue, le le client envoie un signal au NameNode, puis resélectionne l'adresse à relire ; si la vérification réussit, le client demandera au NameNode l'adresse du deuxième bloc, et répétera les trois processus de 4, 5, et 6.
  7. Une fois que le client a lu tous les blocs, il enverra un signal de fin au NameNode, et le NameNode fermera le fichier après avoir reçu le signal

2. Processus d'écriture/téléchargement

  1. Le client initie une requête RPC au NameNode
  2. NameNode vérifiera après avoir reçu la demande :
    1. Vérifier si le chemin spécifié existe
    2. Vérifiez que le chemin d'écriture est autorisé
    3. Vérifiez s'il existe un fichier portant le même nom dans le chemin spécifié
  3. Si la vérification échoue, une exception est levée. Si la vérification réussit, les métadonnées sont enregistrées et le NameNode enverra un signal au client.
  4. Après avoir reçu le signal, le client demandera au NameNode l'emplacement de stockage du premier bloc.
  5. Une fois que le NameNode a reçu la requête, il attend le battement de cœur du DataNode, sélectionne l'adresse du DataNode, le place dans la file d'attente et le renvoie au client. Par défaut, le NameNode choisira 3 adresses.
  6. Le client reçoit 3 adresses dans la file d'attente et sélectionne un nœud plus proche (distance de la topologie du réseau) à partir de ces adresses pour écrire dans la première copie du premier bloc.
  7. Le nœud où se trouve la première copie écrira la deuxième copie sur d'autres nœuds via le pipeline (pipeline, en fait Channel dans NIO), et le nœud où se trouve la deuxième copie écrit sur la troisième copie.
  8. Après l'écriture, le nœud où se trouve la troisième copie renverra un accusé de réception au nœud où se trouve la deuxième copie. Après avoir reçu l'accusé de réception, le nœud où se trouve la deuxième copie renverra un accusé de réception au nœud où se trouve la première copie. La première copie Le nœud où il se trouve revient au client
  9. Après avoir écrit le premier bloc, le client demandera au NameNode l'emplacement de stockage du deuxième bloc, puis répétera le processus de 5, 6, 7 et 8.
  10. Lorsque tous les blocs sont écrits, le client enverra un signal de fin au NameNode, et le NameNode fermera le fichier/flux. Une fois le flux fermé, le fichier ne peut plus être modifié.

3. Processus de suppression

  1. Le client initie une requête RPC au NameNode.

  2. Une fois que le NameNode reçoit la requête , il enregistre la requête dans le fichier d'édition , puis met à jour les métadonnées dans la mémoire . Une fois la mise à jour de la mémoire réussie, le client renvoie un signal d'accusé de réception . À ce moment, le bloc correspondant au le fichier est toujours stocké dans le DataNode .

  3. Lorsque le NameNode reçoit la pulsation du DataNode , le NameNode vérifiera les informations de bloc et enverra une réponse de pulsation au DataNode , demandant de supprimer le bloc correspondant. Le DataNode ne supprimera pas réellement le bloc tant qu'il n'aura pas reçu la réponse de pulsation .

Fonctionnement de l'API

Débit ----- la quantité totale de données lues et écrites par les nœuds ou les clusters par unité de temps 1s de lecture et d'écriture 100M --- 100M/s

Une simultanéité élevée n'est pas nécessairement un débit élevé, mais un débit élevé est généralement une simultanéité élevée

1. Étapes de préparation

  1. Les packages jar dépendants qui doivent être importés dans HDFS :

hadoop-2.7.1\share\hadoop\common\*.jar

hadoop-2.7.1\share\hadoop\common\lib\*.jar

hadoop-2.7.1\share\hadoop\hdfs\*.jar

hadoop-2.7.1\share\hadoop\hdfs\lib\*.jar

2. Fonctionnement de l'API

lire le fichier

@Test

public void testConnectNamenode() throws Exception{

    Configuration conf=new Configuration();

    FileSystem fs=FileSystem.get(new URI("hdfs://192.168.234.21:9000"), conf);

    InputStream in=fs.open(new Path("/park/1.txt"));

    OutputStream out=new FileOutputStream("1.txt");

    IOUtils.copyBytes(in, out, conf);

}

 

télécharger des fichiers

@Test

public void testPut() throws Exception{

    Configuration conf=new Configuration();

    conf.set("dfs.replication","1");

    FileSystem fs=FileSystem.get(new URI("hdfs://192.168.234.21:9000"),conf,"root");

    ByteArrayInputStream in=new ByteArrayInputStream("hello hdfs".getBytes());

    OutputStream out=fs.create(new Path("/park/2.txt"));

    IOUtils.copyBytes(in, out, conf);

}

 

Supprimer les fichiers

@Test

public void testDelete()throws Exception{

    Configuration conf=new Configuration();

    FileSystem fs=FileSystem.get(new URI("hdfs://192.168.234.21:9000"),conf,"root");

    //true表示无论目录是否为空,都删除掉。可以删除指定的文件

    fs.delete(new Path("/park01"),true);

    //false表示只能删除不为空的目录。

    fs.delete(new Path("/park01"),false);

    fs.close();

}

 

créer un dossier sur hdfs

@Test

public void testMkdir()throws Exception{

    Configuration conf=new Configuration();

    FileSystem fs=FileSystem.get(new URI("hdfs://192.168.234.21:9000"),conf,"root");

    fs.mkdirs(new Path("/park02"));

}

 

Interroger les fichiers dans le répertoire spécifié de hdfs

@Test

public void testLs()throws Exception{

    Configuration conf=new Configuration();

    FileSystem fs=FileSystem.get(new URI("hdfs://192.168.234.21:9000"),conf,"root");

    FileStatus[] ls=fs.listStatus(new Path("/"));

    for(FileStatus status:ls){

        System.out.println(status);

    }

}

 

Afficher récursivement les fichiers dans le répertoire spécifié

@Test

public void testLs()throws Exception{

    Configuration conf=new Configuration();

    FileSystem fs=FileSystem.get(new URI("hdfs://192.168.234.214:9000"),conf,"root");

    RemoteIterator<LocatedFileStatus> rt=fs.listFiles(new Path("/"), true);

    while(rt.hasNext()){

        System.out.println(rt.next());

    }

}

 

double dénomination

@Test

public void testCreateNewFile() throws Exception{

    Configuration conf=new Configuration();

    FileSystem fs=FileSystem.get(new URI("hdfs://192.168.234.176:9000"),conf,"root");

    fs.rename(new Path("/park"), new Path("/park01"));

}

 

Obtenir les informations de bloc d'un fichier

@Test

public void testCopyFromLoaclFileSystem() throws Exception{

    Configuration conf=new Configuration();

    FileSystem fs=FileSystem.get(new URI("hdfs://192.168.234.176:9000"),conf,"root");

    BlockLocation[] data=fs.getFileBlockLocations(new Path("/park01/1.txt"),0,Integer.MaxValue);

    for(BlockLocation bl:data){

        System.out.println(bl);

    }

}

Vous pouvez également utiliser des plug-ins pour faire fonctionner hdfs

Je suppose que tu aimes

Origine blog.csdn.net/a34651714/article/details/102821803
conseillé
Classement