Hva er HDFS?
HDFS er et distribuert filsystem for lagring av veldig store datafiler, som kjører på klynger av råvare. Det er feiltolerant, skalerbart og ekstremt enkelt å utvide. Hadoop leveres med HDFS ( Hadoop Distributed File Systems ).
Når data overstiger lagringskapasiteten på en enkelt fysisk maskin, blir det viktig å dele dem over et antall separate maskiner. Et filsystem som administrerer lagringsspesifikke operasjoner over et nettverk av maskiner kalles et distribuert filsystem. HDFS er en slik programvare.
I denne veiledningen vil vi lære,
- Hva er HDFS?
- HDFS-arkitektur
- Les Operasjon
- Skriv operasjon
- Få tilgang til HDFS ved hjelp av JAVA API
- Få tilgang til HDFS ved å bruke COMMAND-LINE INTERFACE
HDFS-arkitektur
HDFS-klyngen består hovedsakelig av en NameNode som administrerer filsystemet Metadata og en DataNodes som lagrer de faktiske dataene .
- NameNode: NameNode kan betraktes som en master i systemet. Det vedlikeholder filsystemtreet og metadataene for alle filene og katalogene som er tilstede i systemet. To filer 'Navneområdebilde' og 'rediger logg' brukes til å lagre metadatainformasjon. Namenode har kunnskap om alle datanodene som inneholder datablokker for en gitt fil, men den lagrer ikke blokkeringssteder kontinuerlig. Denne informasjonen rekonstrueres hver gang fra datanoder når systemet starter.
- DataNode: DataNodes 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.
Les / skriv-operasjoner i HDFS fungerer på blokknivå. Datafiler i HDFS er delt inn i klumper i blokkstørrelse, som lagres som uavhengige enheter. Standard blokkstørrelse er 64 MB.
HDFS opererer på et konsept for datareplikering hvor flere replikaer av datablokker blir opprettet og distribueres på noder gjennom en klynge for å muliggjøre høy tilgjengelighet av data i tilfelle nodfeil.
Vet du? En fil i HDFS, som er mindre enn en enkelt blokk, har ikke fullstendig lagring i en blokk.
Les Operasjon i HDFS
Dataleseforespørsel serveres av HDFS, NameNode og DataNode. La oss kalle leseren som en 'klient'. Diagrammet nedenfor viser filavlesningsoperasjonen i Hadoop.
- En klient starter leseforespørsel ved å ringe 'open ()' - metoden for FileSystem-objektet; det er et objekt av typen DistributedFileSystem .
- Dette objektet kobles til navnekoden ved hjelp av RPC og får metadatainformasjon, for eksempel plassering av blokkene i filen. Vær oppmerksom på at disse adressene er fra de første blokkene i en fil.
- Som svar på denne metadataforespørselen returneres adressene til DataNodene som har en kopi av den blokken.
- Når adressene til DataNodes er mottatt, returneres et objekt av typen FSDataInputStream 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 'read ()' -metoden som får DFSInputStream til å etablere en forbindelse med den første DataNode med den første blokken av en fil.
- Data blir lest i form av strømmer der klienten påberoper 'read ()' -metoden gjentatte ganger. Denne prosessen med lese () -operasjon 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, kaller den en close () -metode.
Skriv operasjon i HDFS
I denne delen vil vi forstå hvordan data skrives inn i HDFS gjennom filer.
- En klient starter skrivoperasjonen ved å ringe 'create ()' - metoden for DistributedFileSystem-objektet som oppretter en ny fil - trinn nr. 1 i diagrammet ovenfor.
- DistribuertFileSystem-objekt kobles til NameNode ved hjelp av RPC-anrop og starter ny filoppretting. Imidlertid, denne filen oppretter operasjon knytter ikke noen blokker til filen. Det er NameNodes ansvar å kontrollere at filen (som blir opprettet) ikke allerede eksisterer, 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, blir IOException kastet 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 ser etter kommunikasjon med DataNodes og NameNode. Mens klienten fortsetter å skrive data, fortsetter DFSOutputStream med å lage pakker med disse dataene. Disse pakkene er innhyllet i en kø som kalles DataQueue .
- Det er en komponent til som heter DataStreamer som bruker denne DataQueue . DataStreamer ber også NameNode om tildeling av nye blokker og velger dermed ønskelige DataNodes som skal brukes til replikering.
- Nå starter replikasjonsprosessen med å lage en rørledning ved hjelp av DataNodes. I vårt tilfelle har vi valgt et replikeringsnivå på 3, og det er derfor 3 DataNodes i rørledningen.
- DataStreamer helter pakker i den første DataNode i rørledningen.
- Hver DataNode i en rørledning lagrer pakken som den mottas av den, og videresender den samme til den andre DataNode i en rørledning.
- En annen kø, 'Ack Queue', opprettholdes av DFSOutputStream for å lagre pakker som venter på bekreftelse fra DataNodes.
- Når bekreftelse for en pakke i køen er mottatt fra alle DataNodes i rørledningen, blir den fjernet 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 skrivedataene, kaller den en close () -metode (trinn 9 i diagrammet) Call to close (), og resulterer i å skylle gjenværende datapakker til rørledningen etterfulgt av å vente på bekreftelse.
- Når en endelig bekreftelse er mottatt, blir NameNode kontaktet for å fortelle det at filskrivingsoperasjonen er fullført.
Få tilgang til HDFS ved hjelp av JAVA API
I denne delen prøver vi å forstå Java-grensesnittet som brukes til å få tilgang til Hadoops filsystem.
For å samhandle med Hadoops filsystem programmatisk, gir Hadoop flere JAVA-klasser. Pakke med navnet 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.
Lese en fil fra HDFS, programmatisk
Objekt java.net.URL brukes til å lese innholdet i en fil. Til å begynne med må vi få Java til å gjenkjenne Hadoops HDFS URL-ordning. Dette gjøres ved å ringe setURLStreamHandlerFactory- metoden på URL-objektet, og en forekomst av FsUrlStreamHandlerFactory blir sendt til den. Denne metoden trenger bare å utføres en gang per JVM, derfor er den lukket i en statisk blokk.
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 koden åpner og leser innholdet i en fil. Stien til denne filen på HDFS sendes til programmet som et kommandolinjeargument.
Få tilgang til HDFS ved å bruke COMMAND-LINE INTERFACE
Dette er en av de enkleste måtene å samhandle med HDFS. Kommandolinjegrensesnittet har støtte for filsystemoperasjoner som å lese filen, opprette kataloger, flytte filer, slette data og oppføre kataloger.
Vi kan kjøre '$ HADOOP_HOME / bin / hdfs dfs -help' for å få detaljert hjelp til hver kommando. Her er 'dfs' en skallkommando av HDFS som støtter flere underkommandoer.
Noen av de mye brukte kommandoene er oppført 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 fil temp.txt fra det lokale filsystemet til HDFS.
2. Vi kan liste opp filer som er tilstede i en katalog ved hjelp av -ls
$HADOOP_HOME/bin/hdfs dfs -ls /
Vi kan se en fil 'temp.txt' (kopiert tidligere) blir oppført under '/' katalogen.
3. Kommando om å 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 om å opprette en ny katalog
$HADOOP_HOME/bin/hdfs dfs -mkdir /mydirectory
Sjekk om det er opprettet en katalog eller ikke. Nå bør du vite hvordan du gjør det ;-)