HDFS-opplæring: Archilære, lese og skrive Operasjon ved hjelp av Java API
Hva er HDFS?
HDFS er et distribuert filsystem for lagring av svært store datafiler, som kjører på klynger av råvaremaskinvare. Den er feiltolerant, skalerbar og ekstremt enkel å utvide. Hadoop følger med HDFS (Hadoop distribuerte filsystemer).
Når data overskrider lagringskapasiteten på en enkelt fysisk maskin, blir det viktig å dele dem på flere separate maskiner. Et filsystem som administrerer lagringsspesifikke operasjoner på tvers av et nettverk av maskiner kalles et distribuert filsystem. HDFS er en slik programvare.
HDFS Architecture
HDFS-klyngen består primært av en NavnNode som administrerer filsystemet metadata og en DataNoder som lagrer faktiske data.
- NameNode: NameNode kan betraktes som en master av systemet. Den opprettholder filsystemtreet og metadataene for alle filene og katalogene som finnes i systemet. To filer 'Navneområdebilde' og 'rediger logg' brukes til å lagre metadatainformasjon. Namenode har kunnskap om alle datanoder som inneholder datablokker for en gitt fil, men lagrer ikke blokkplasseringer vedvarende. Denne informasjonen rekonstrueres hver gang fra datanoder når systemet starter.
- DataNode: DataNoder er slaver som ligger på hver maskin i en klynge og gir den faktiske lagringen. Det er ansvarlig for å betjene, lese og skrive forespørsler til klientene.
Lese-/skriveoperasjoner i HDFS opererer på blokknivå. Datafiler i HDFS er delt opp i blokkstørrelser, som lagres som uavhengige enheter. Standard blokkstørrelse er 64 MB.
HDFS opererer på et konsept for datareplikering der flere replikaer av datablokker opprettes og distribueres på noder gjennom en klynge for å muliggjøre høy tilgjengelighet av data i tilfelle nodefeil.
Vet du? En fil i HDFS, som er mindre enn en enkelt blokk, opptar ikke en blokks fulle lagringsplass.
Lese Operasjon i HDFS
Dataleseforespørsel betjenes av HDFS, NameNode og DataNode. La oss kalle leseren som en 'klient'. Diagrammet nedenfor viser fillesoperasjon i Hadoop.
- En klient starter leseforespørsel ved å ringe 'åpne()' metode for FileSystem-objekt; det er et objekt av typen Distribuert filsystem.
- Dette objektet kobles til namenode ved hjelp av RPC og får metadatainformasjon som plasseringen av blokkene til filen. Vær oppmerksom på at disse adressene er av de første blokkene av en fil.
- Som svar på denne metadataforespørselen, returneres adressene til DataNodene som har en kopi av blokken.
-
Når adressene til DataNodes er mottatt, et objekt av typen FSDataInputStream returneres til klienten. FSDataInputStream inneholder DFSInputStream som tar seg av interaksjoner med DataNode og NameNode. I trinn 4 vist i diagrammet ovenfor, påkaller en klient 'lese()' metode som forårsaker DFSInputStream for å etablere en forbindelse med den første DataNode med den første blokken av en fil.
-
Data leses i form av strømmer der klienten påkaller 'lese()' metode gjentatte ganger. Denne prosessen av lese() operasjonen fortsetter til den når slutten av blokken.
- Når slutten av en blokk er nådd, lukker DFSInputStream forbindelsen og går videre for å finne neste DataNode for neste blokk
- Når en klient er ferdig med lesingen, ringer den en nær() metoden.
Skriv Operasjon i HDFS
I denne delen vil vi forstå hvordan data skrives inn i HDFS gjennom filer.
- En klient starter skriveoperasjonen ved å kalle 'create()'-metoden til DistributedFileSystem-objektet som oppretter en ny fil – Trinn nr. 1 i diagrammet ovenfor.
- DistributedFileSystem-objektet kobler til NameNode ved hjelp av RPC-kall og starter ny filoppretting. Men denne filen oppretter operasjonen knytter ingen blokker til filen. Det er NameNodes ansvar å verifisere at filen (som blir opprettet) ikke eksisterer allerede og at en klient har riktige tillatelser til å opprette en ny fil. Hvis en fil allerede eksisterer eller klienten ikke har tilstrekkelig tillatelse til å opprette en ny fil, da IO Unntak kastes til klienten. Ellers lykkes operasjonen og en ny post for filen opprettes av NameNode.
- Når en ny post i NameNode er opprettet, returneres et objekt av typen FSDataOutputStream til klienten. En klient bruker den til å skrive data inn i HDFS. Dataskrivemetoden påkalles (trinn 3 i diagrammet).
- FSDataOutputStream inneholder DFSOutputStream-objekt som ivaretar kommunikasjon med DataNodes og NameNode. Mens klienten fortsetter å skrive data, DFSOutputStream fortsetter å lage pakker med disse dataene. Disse pakkene settes i kø i en kø som kalles som Datakø.
- Det er en komponent til som heter DataStreamer som forbruker dette Datakø. DataStreamer ber også NameNode om allokering av nye blokker, og velger dermed ønskede DataNode som skal brukes til replikering.
- Nå starter replikeringsprosessen ved å lage en pipeline ved hjelp av DataNodes. I vårt tilfelle har vi valgt et replikeringsnivå på 3, og derfor er det 3 DataNoder i pipelinen.
- DataStreamer strømmer pakker inn i den første DataNode i pipelinen.
- Hver DataNode i en pipeline lagrer pakker mottatt av den og videresender den samme til den andre DataNode i en pipeline.
- En annen kø, 'Ack Queue' vedlikeholdes av DFSOutputStream for å lagre pakker som venter på bekreftelse fra DataNodes.
- Når bekreftelse for en pakke i køen er mottatt fra alle DataNoder i pipelinen, fjernes den fra 'Ack Queue'. I tilfelle DataNode-feil, brukes pakker fra denne køen til å starte operasjonen på nytt.
- Etter at en klient er ferdig med å skrive data, kaller den en close()-metode (trinn 9 i diagrammet) Call to close(), resulterer i at gjenværende datapakker tømmes til rørledningen etterfulgt av å vente på bekreftelse.
- Når en endelig bekreftelse er mottatt, kontaktes NameNode for å fortelle at filskrivingsoperasjonen er fullført.
Få tilgang til HDFS ved å bruke JAVA API
I denne delen prøver vi å forstå Java grensesnitt som brukes for å få tilgang til Hadoops filsystem.
For å samhandle med Hadoops filsystem programmatisk, tilbyr Hadoop flere JAVA-klasser. Pakke kalt org.apache.hadoop.fs inneholder klasser som er nyttige for manipulering av en fil i Hadoops filsystem. Disse operasjonene inkluderer åpne, lese, skrive og lukke. Faktisk er fil-API for Hadoop generisk og kan utvides til å samhandle med andre filsystemer enn HDFS.
Leser en fil fra HDFS, programmatisk
Objekt java.net.URL brukes til å lese innholdet i en fil. Til å begynne med må vi lage Java gjenkjenne Hadoops hdfs URL-skjema. Dette gjøres ved å ringe setURLSreamHandlerFactory metode på URL-objekt og en forekomst av FsUrlStreamHandlerFactory sendes til den. Denne metoden må kun utføres én gang pr JVM, derfor er den innelukket i en statisk blokk.
Et eksempelkode 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 koden åpner og leser innholdet i en fil. Banen til denne filen på HDFS sendes til programmet som et kommandolinjeargument.
Få tilgang til HDFS ved å bruke COMMAND-LINE GRENSESNITT
Dette er en av de enkleste måtene å samhandle med HDFS. Kommandolinjegrensesnittet har støtte for filsystemoperasjoner som å lese filen, lage kataloger, flytte filer, slette data og liste opp kataloger.
Vi kan løpe '$HADOOP_HOME/bin/hdfs dfs -help' for å få detaljert hjelp på hver kommando. Her, 'dfs' er en shell-kommando av HDFS som støtter flere underkommandoer.
Noen av de mye brukte kommandoene er listet opp nedenfor sammen med noen detaljer om hver enkelt.
1. Kopier en fil fra det lokale filsystemet til HDFS
$HADOOP_HOME/bin/hdfs dfs -copyFromLocal temp.txt /
Denne kommandoen kopierer filen temp.txt fra det lokale filsystemet til HDFS.
2. Vi kan liste filer som finnes i en katalog ved hjelp av -ls
$HADOOP_HOME/bin/hdfs dfs -ls /
Vi kan se en fil «temp.txt» (kopiert tidligere) er oppført under '/' katalogen.
3. Kommando for å kopiere en fil til det lokale filsystemet fra HDFS
$HADOOP_HOME/bin/hdfs dfs -copyToLocal /temp.txt
Vi kan se temp.txt kopiert til et lokalt filsystem.
4. Kommando for å opprette en ny katalog
$HADOOP_HOME/bin/hdfs dfs -mkdir /mydirectory
Sjekk om en katalog er opprettet eller ikke. Nå bør du vite hvordan du gjør det 😉