HDFS vejledning: Archilære, læse og skrive Operation ved hjælp af Java API

Hvad er HDFS?

HDFS er et distribueret filsystem til lagring af meget store datafiler, der kører på klynger af råvarehardware. Det er fejltolerant, skalerbart og ekstremt nemt at udvide. Hadoop leveres med HDFS (Hadoop distribuerede filsystemer).

Når data overstiger lagerkapaciteten på en enkelt fysisk maskine, bliver det vigtigt at opdele dem på en række separate maskiner. Et filsystem, der styrer lagringsspecifikke operationer på tværs af et netværk af maskiner, kaldes et distribueret filsystem. HDFS er en sådan software.

HDFS Architecture

HDFS-klyngen består primært af en NavnNode der styrer filsystemet Metadata og en DataNoder der opbevarer faktiske data.

  • NavnNode: NameNode kan betragtes som en mester i systemet. Det vedligeholder filsystemtræet og metadataene for alle de filer og mapper, der findes i systemet. To filer 'Namespace image' og 'rediger log' bruges til at gemme metadataoplysninger. Namenode har kendskab til alle de datanoder, der indeholder datablokke for en given fil, men den gemmer ikke blokplaceringer vedvarende. Denne information rekonstrueres hver gang fra datanoder, når systemet starter.
  • DataNode: DataNodes er slaver, som ligger på hver maskine i en klynge og leverer den faktiske lagring. Den er ansvarlig for at betjene, læse og skrive forespørgsler til kunderne.

Læse/skrive-operationer i HDFS fungerer på blokniveau. Datafiler i HDFS er opdelt i blokstørrelser, som gemmes som uafhængige enheder. Standard blokstørrelse er 64 MB.

HDFS opererer på et koncept for datareplikering, hvor flere replikaer af datablokke oprettes og distribueres på noder i en klynge for at muliggøre høj tilgængelighed af data i tilfælde af knudefejl.

Kender du? En fil i HDFS, som er mindre end en enkelt blok, optager ikke en bloks fulde lagerplads.

Læs Operation i HDFS

Datalæseanmodning betjenes af HDFS, NameNode og DataNode. Lad os kalde læseren for en 'klient'. Nedenstående diagram viser fillæsningsoperation i Hadoop.

Læs Operation i HDFS

  1. En klient starter læseanmodning ved at ringe 'åben()' metode til FileSystem-objekt; det er et objekt af typen Distribueret filsystem.
  2. Dette objekt opretter forbindelse til namenode ved hjælp af RPC og får metadataoplysninger såsom placeringen af ​​blokkene i filen. Bemærk venligst, at disse adresser er af de første par blokke af en fil.
  3. Som svar på denne metadataanmodning returneres adresserne på de DataNodes, der har en kopi af denne blok.
  4. Når adresserne på DataNodes er modtaget, er et objekt af typen FSDataInputStream returneres til klienten. FSDataInputStream indeholder DFSInputStream som tager sig af interaktioner med DataNode og NameNode. I trin 4 vist i ovenstående diagram kalder en klient 'Læs()' metode, der forårsager DFSInputStream at etablere en forbindelse med den første DataNode med den første blok af en fil.
  5. Data læses i form af streams, hvor klienten påberåber sig 'Læs()' metode gentagne gange. Denne proces af Læs() operationen fortsætter, indtil den når slutningen af ​​blokken.
  6. Når slutningen af ​​en blok er nået, lukker DFSInputStream forbindelsen og går videre for at finde den næste DataNode for den næste blok
  7. Når en klient er færdig med læsningen, ringer den en tæt () fremgangsmåde.

Skrive Operation i HDFS

I dette afsnit vil vi forstå, hvordan data skrives ind i HDFS gennem filer.

Skrive Operation i HDFS

  1. En klient starter skriveoperation ved at kalde 'create()'-metoden for DistributedFileSystem-objektet, som opretter en ny fil – Trin nr. 1 i ovenstående diagram.
  2. DistributedFileSystem-objekt forbinder til NameNode ved hjælp af RPC-kald og starter ny filoprettelse. Denne fil opretter operation forbinder dog ingen blokke med filen. Det er NameNodes ansvar at verificere, at filen (som er ved at blive oprettet) ikke allerede eksisterer, og at en klient har korrekte tilladelser til at oprette en ny fil. Hvis en fil allerede eksisterer, eller klienten ikke har tilstrækkelig tilladelse til at oprette en ny fil, så IOUndtagelse kastes til klienten. Ellers lykkes handlingen, og en ny post for filen oprettes af NameNode.
  3. Når en ny post i NameNode er oprettet, returneres et objekt af typen FSDataOutputStream til klienten. En klient bruger det til at skrive data ind i HDFS. Dataskrivemetoden påberåbes (trin 3 i diagrammet).
  4. FSDataOutputStream indeholder DFSOutputStream-objekt, som passer på kommunikation med DataNodes og NameNode. Mens klienten fortsætter med at skrive data, DFSOoutputStream fortsætter med at oprette pakker med disse data. Disse pakker sættes i kø i en kø, der kaldes som Datakø.
  5. Der er endnu en komponent kaldet DataStreamer som forbruger dette Datakø. DataStreamer beder også NameNode om allokering af nye blokke og udvælger derved de ønskede DataNodes, der skal bruges til replikering.
  6. Nu starter replikeringsprocessen ved at oprette en pipeline ved hjælp af DataNodes. I vores tilfælde har vi valgt et replikeringsniveau på 3, og der er derfor 3 DataNoder i pipelinen.
  7. DataStreameren hælder pakker ind i den første DataNode i pipelinen.
  8. Hver DataNode i en pipeline gemmer pakker modtaget af den og videresender den samme til den anden DataNode i en pipeline.
  9. En anden kø, 'Ack Queue' vedligeholdes af DFSOutputStream for at gemme pakker, som venter på bekræftelse fra DataNodes.
  10. Når bekræftelse for en pakke i køen er modtaget fra alle DataNodes i pipelinen, fjernes den fra 'Ack Queue'. I tilfælde af en DataNode-fejl, bruges pakker fra denne kø til at genstarte operationen.
  11. Efter at en klient er færdig med at skrive dataene, kalder den en close()-metode (trin 9 i diagrammet) Call to close(), resulterer i at de resterende datapakker tømmes til pipelinen efterfulgt af at vente på bekræftelse.
  12. Når en endelig bekræftelse er modtaget, kontaktes NameNode for at fortælle den, at filskrivningen er fuldført.

Få adgang til HDFS ved hjælp af JAVA API

I dette afsnit forsøger vi at forstå Java grænseflade, der bruges til at få adgang til Hadoops filsystem.

For at kunne interagere med Hadoops filsystem programmatisk, leverer Hadoop flere JAVA-klasser. Pakke med navnet org.apache.hadoop.fs indeholder klasser, der er nyttige til manipulation af en fil i Hadoops filsystem. Disse handlinger omfatter, åbne, læse, skrive og lukke. Faktisk er fil-API for Hadoop generisk og kan udvides til at interagere med andre filsystemer end HDFS.

Læser en fil fra HDFS, programmatisk

Objekt java.net.URL bruges til at læse indholdet af en fil. Til at begynde med skal vi lave Java genkend Hadoops hdfs URL-skema. Dette gøres ved at ringe setURLSreamHandlerFactory metode på URL-objekt, og en forekomst af FsUrlStreamHandlerFactory sendes til den. Denne metode skal kun udføres én gang pr FMV, derfor er den indesluttet i en statisk blok.

Et eksempel på kode er-

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

Denne kode åbner og læser indholdet af en fil. Stien til denne fil på HDFS sendes til programmet som et kommandolinjeargument.

Få adgang til HDFS ved hjælp af COMMAND-LINE INTERFACE

Dette er en af ​​de enkleste måder at interagere med HDFS på. Kommandolinjegrænsefladen understøtter filsystemoperationer som at læse filen, oprette mapper, flytte filer, slette data og liste mapper.

Vi kan løbe '$HADOOP_HOME/bin/hdfs dfs -help' for at få detaljeret hjælp til hver kommando. Her, 'dfs' er en shell-kommando af HDFS, som understøtter flere underkommandoer.

Nogle af de udbredte kommandoer er anført nedenfor sammen med nogle detaljer om hver enkelt.

1. Kopier en fil fra det lokale filsystem til HDFS

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

Få adgang til HDFS ved hjælp af COMMAND-LINE INTERFACE

Denne kommando kopierer filen temp.txt fra det lokale filsystem til HDFS.

2. Vi kan liste filer til stede i en mappe ved hjælp af -Er

$HADOOP_HOME/bin/hdfs dfs -ls /

Få adgang til HDFS ved hjælp af COMMAND-LINE INTERFACE

Vi kan se en fil 'temp.txt' (kopieret tidligere) er opført under '/' mappe.

3. Kommando til at kopiere en fil til det lokale filsystem fra HDFS

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

Få adgang til HDFS ved hjælp af COMMAND-LINE INTERFACE

Vi kan se temp.txt kopieret til et lokalt filsystem.

4. Kommando for at oprette en ny mappe

$HADOOP_HOME/bin/hdfs dfs -mkdir /mydirectory

Få adgang til HDFS ved hjælp af COMMAND-LINE INTERFACE

Kontroller, om en mappe er oprettet eller ej. Nu burde du vide, hvordan du gør det 😉