HDFS-vejledning: Arkitektur, Læs & Skriv operation ved hjælp af Java API

Indholdsfortegnelse:

Anonim

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 enkelt at udvide. Hadoop leveres med HDFS ( Hadoop Distribuerede Filsystemer ).

Når data overstiger lagringskapaciteten på en enkelt fysisk maskine, bliver det vigtigt at opdele dem på et antal 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.

I denne vejledning lærer vi,

  • Hvad er HDFS?
  • HDFS-arkitektur
  • Læs operation
  • Skriv operation
  • Få adgang til HDFS ved hjælp af JAVA API
  • Få adgang til HDFS ved hjælp af COMMAND-LINE INTERFACE

HDFS-arkitektur

HDFS-klynge består primært af en NameNode, der administrerer filsystemets metadata og en DataNodes, der gemmer de faktiske data .

  • NameNode: NameNode kan betragtes som en master i systemet. Det vedligeholder filsystemtræet og metadataene for alle de filer og mapper, der findes i systemet. To filer 'Navneområdet billede' og 'rediger log' bruges til at gemme metadataoplysninger. Namenode har kendskab til alle 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, der er bosat på hver maskine i en klynge og giver den faktiske opbevaring. Det er ansvarligt for at betjene, læse og skrive anmodninger til klienterne.

Læs / skriv-operationer i HDFS fungerer på blokniveau. Datafiler i HDFS er opdelt i klodser i blokstørrelse, som lagres som uafhængige enheder. Standard blokstørrelse er 64 MB.

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

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

Læs operation i HDFS

Datalæsningsanmodning serveres af HDFS, NameNode og DataNode. Lad os kalde læseren som en 'klient'. Nedenstående diagram viser fillæsning i Hadoop.

  1. En klient initierer læseanmodning ved at kalde 'open ()' - metoden til FileSystem-objekt; det er et objekt af typen DistributedFileSystem .
  2. Dette objekt forbinder til namenode ved hjælp af RPC og får metadatainformation, såsom placeringen af ​​filens blokke. Bemærk, at disse adresser er af de første par blokke af en fil.
  3. Som svar på denne metadataforespørgsel returneres adresser til DataNodes, der har en kopi af denne blok.
  4. Når adresser på DataNodes er modtaget, returneres et objekt af typen FSDataInputStream til klienten. FSDataInputStream indeholder DFSInputStream, som tager sig af interaktioner med DataNode og NameNode. I trin 4 vist i ovenstående diagram påkalder en klient 'read ()' -metoden, der får DFSInputStream til at oprette forbindelse til den første DataNode med den første blok i en fil.
  5. Data læses i form af streams, hvor klienten gentagne gange påberåber sig 'read ()' - metoden. Denne proces med læsning () operation 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 til den næste blok
  7. Når en klient er færdig med læsningen, kalder den en tæt () metode.

Skriv operation i HDFS

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

  1. En klient initierer skriveoperation ved at kalde 'create ()' - metoden for DistributedFileSystem-objekt, som opretter en ny fil - Trin nr. 1 i ovenstående diagram.
  2. DistribueretFileSystem-objekt opretter forbindelse til NameNode ved hjælp af RPC-opkald og initierer oprettelse af ny fil. Denne fil opretter operation, men knytter ikke nogen blokke til filen. Det er NameNodes ansvar at kontrollere, at filen (som oprettes) ikke allerede findes, og at en klient har de korrekte tilladelser til at oprette en ny fil. Hvis en fil allerede findes, eller klienten ikke har tilstrækkelig tilladelse til at oprette en ny fil, kastes IOException til klienten. Ellers lykkes operationen, 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 den til at skrive data i HDFS. Metoden til dataskrivning påkræves (trin 3 i diagrammet).
  4. FSDataOutputStream indeholder DFSOutputStream-objekt, der passer på kommunikation med DataNodes og NameNode. Mens klienten fortsætter med at skrive data, fortsætter DFSOutputStream med at oprette pakker med disse data. Disse pakker indkapsles i en kø, der kaldes DataQueue .
  5. Der er endnu en komponent kaldet DataStreamer, som bruger denne DataQueue . DataStreamer beder også NameNode om tildeling af nye blokke og vælger derved ønskelige DataNodes, der skal bruges til replikering.
  6. Nu starter replikationsprocessen med at oprette en pipeline ved hjælp af DataNodes. I vores tilfælde har vi valgt et replikationsniveau på 3, og derfor er der 3 DataNodes i pipeline.
  7. DataStreamer hælder pakker i den første DataNode i pipelinen.
  8. Hver DataNode i en pipeline gemmer den pakke, den modtager, og videresender den samme til den anden DataNode i en pipeline.
  9. En anden kø, 'Ack Queue', opretholdes af DFSOutputStream til at gemme pakker, der venter på bekræftelse fra DataNodes.
  10. Når kvittering for en pakke i køen er modtaget fra alle DataNodes i pipelinen, fjernes den fra 'Ack-køen'. I tilfælde af DataNode-fejl bruges pakker fra denne kø til at genoptage handlingen.
  11. Når en klient er færdig med skrivedataene, kalder den en close () -metode (trin 9 i diagrammet) Call to close (), hvilket resulterer i at skylle de resterende datapakker til rørledningen efterfulgt af at vente på bekræftelse.
  12. Når en endelig bekræftelse er modtaget, kontaktes NameNode for at fortælle det, at filskrivningsoperationen er fuldført.

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

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

For at 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 operationer inkluderer, åbner, læser, skriver og lukker. Faktisk er fil-API til Hadoop generisk og kan udvides til at interagere med andre filsystemer end HDFS.

Læsning af en fil fra HDFS, programmatisk

Objekt java.net.URL bruges til at læse indholdet af en fil. Til at begynde med er vi nødt til at få Java til at genkende Hadoop's hdfs URL-skema. Dette gøres ved at kalde setURLStreamHandlerFactory- metoden på URL-objektet, og en instans af FsUrlStreamHandlerFactory sendes til den. Denne metode skal kun udføres en gang pr. JVM, derfor er den lukket 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ænseflade understøtter filsystemhandlinger som at læse filen, oprette mapper, flytte filer, slette data og liste mapper.

Vi kan køre '$ HADOOP_HOME / bin / hdfs dfs -help' for at få detaljeret hjælp til hver kommando. Her er 'dfs' 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 /

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

2. Vi kan liste filer til stede i et bibliotek ved hjælp af -ls

$HADOOP_HOME/bin/hdfs dfs -ls /

Vi kan se en fil 'temp.txt' (kopieret tidligere) vises under '/' biblioteket.

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

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

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

4. Kommando til at oprette en ny mappe

$HADOOP_HOME/bin/hdfs dfs -mkdir /mydirectory

Kontroller, om der oprettes en mappe eller ej. Nu skal du vide, hvordan du gør det ;-)