Vad är HDFS?
HDFS är ett distribuerat filsystem för lagring av mycket stora datafiler som körs på kluster av råvaruhårdvara. Det är feltolerant, skalbart och extremt enkelt att expandera. Hadoop levereras med HDFS ( Hadoop Distribuerade filsystem ).
När data överskrider lagringskapaciteten på en enda fysisk maskin blir det viktigt att dela upp dem över ett antal separata maskiner. Ett filsystem som hanterar lagringsspecifika operationer över ett nätverk av maskiner kallas ett distribuerat filsystem. HDFS är en sådan programvara.
I den här handledningen lär vi oss,
- Vad är HDFS?
- HDFS-arkitektur
- Läs operation
- Skriv operation
- Åtkomst till HDFS med JAVA API
- Åtkomst till HDFS med COMMAND-LINE INTERFACE
HDFS-arkitektur
HDFS-kluster består främst av en NameNode som hanterar filsystemets metadata och en DataNodes som lagrar den faktiska informationen .
- NameNode: NameNode kan betraktas som en master i systemet. Det underhåller filsystemsträdet och metadata för alla filer och kataloger som finns i systemet. Två filer 'Namnrymdsbild' och 'redigera logg' används för att lagra metadatainformation. Namenode har kunskap om alla datanoder som innehåller datablock för en viss fil, men den lagrar inte blockeringsplatser kontinuerligt. Denna information rekonstrueras varje gång från datanoder när systemet startar.
- DataNode: DataNodes är slavar som finns på varje maskin i ett kluster och ger den faktiska lagringen. Det ansvarar för att betjäna, läsa och skriva förfrågningar för kunderna.
Läs / skriv-operationer i HDFS fungerar på blocknivå. Datafiler i HDFS delas upp i bitar av blockstorlek, som lagras som oberoende enheter. Standardblockstorlek är 64 MB.
HDFS arbetar med ett koncept för datareplikering, där flera repliker av datablock skapas och distribueras på noder genom ett kluster för att möjliggöra hög tillgänglighet av data i händelse av nodfel.
Vet du? En fil i HDFS, som är mindre än ett enskilt block, upptar inte ett blockets fullständiga lagring.
Läs operation i HDFS
Dataläsningsbegäran serveras av HDFS, NameNode och DataNode. Låt oss kalla läsaren som en "klient". Nedanstående diagram visar filläsning i Hadoop.
- En klient initierar läsförfrågan genom att anropa "open ()" -metoden för FileSystem-objekt; det är ett objekt av typen DistributedFileSystem .
- Det här objektet ansluter till namnen med RPC och får metadatainformation, t.ex. platserna för filens block. Observera att dessa adresser är av de första blocken i en fil.
- Som svar på denna metadataförfrågan returneras adresserna till DataNodes som har en kopia av det blocket.
- När adresserna till DataNodes har mottagits returneras ett objekt av typen FSDataInputStream till klienten. FSDataInputStream innehåller DFSInputStream som tar hand om interaktioner med DataNode och NameNode. I steg 4 som visas i ovanstående diagram åberopar en klient 'read ()' -metod som får DFSInputStream att upprätta en anslutning med den första DataNode med det första blocket i en fil.
- Data läses i form av strömmar där klienten åberopar 'read ()' -metoden upprepade gånger. Denna process med läs () operation fortsätter tills den når slutet av blocket.
- När slutet på ett block har nåtts stänger DFSInputStream anslutningen och fortsätter för att hitta nästa DataNode för nästa block
- När en klient har gjort läsningen kallar den en close () -metod.
Skriv operation i HDFS
I det här avsnittet kommer vi att förstå hur data skrivs in i HDFS genom filer.
- En klient initierar skrivoperationen genom att anropa "create ()" -metoden för DistributedFileSystem-objektet som skapar en ny fil - Steg nr. 1 i ovanstående diagram.
- DistribueratFileSystem-objekt ansluter till NameNode med RPC-anrop och initierar ny filskapande. Den här filen skapar dock en operation som inte associerar några block med filen. Det är Namnodes ansvar att verifiera att filen (som skapas) inte redan finns och att en klient har rätt behörighet att skapa en ny fil. Om det redan finns en fil eller om klienten inte har tillräcklig behörighet att skapa en ny fil kastas IOException till klienten. Annars lyckas åtgärden och en ny post för filen skapas av NameNode.
- När en ny post i NameNode har skapats returneras ett objekt av typen FSDataOutputStream till klienten. En klient använder den för att skriva data till HDFS. Dataskrivningsmetoden anropas (steg 3 i diagrammet).
- FSDataOutputStream innehåller DFSOutputStream-objekt som ser efter kommunikation med DataNodes och NameNode. Medan klienten fortsätter att skriva data fortsätter DFSOutputStream att skapa paket med dessa data. Dessa paket sätts in i en kö som kallas DataQueue .
- Det finns ytterligare en komponent som heter DataStreamer som förbrukar denna DataQueue . DataStreamer frågar också NameNode för tilldelning av nya block och väljer därmed önskvärda DataNodes som ska användas för replikering.
- Nu börjar replikeringsprocessen med att skapa en pipeline med hjälp av DataNodes. I vårt fall har vi valt en replikeringsnivå på 3 och därmed finns det 3 DataNodes i rörledningen.
- DataStreamer häller paket i den första DataNode i rörledningen.
- Varje DataNode i en pipeline lagrar paket som tas emot av den och vidarebefordrar detsamma till den andra DataNode i en pipeline.
- En annan kö, 'Ack Queue', upprätthålls av DFSOutputStream för att lagra paket som väntar på bekräftelse från DataNodes.
- När bekräftelse för ett paket i kön tas emot från alla DataNodes i rörledningen tas den bort från 'Ack Queue'. I händelse av DataNode-fel används paket från den här kön för att återuppta operationen.
- När en klient är klar med skrivdata, anropar den en close () -metod (steg 9 i diagrammet) Call to close (), vilket resulterar i att de återstående datapaket spolas till rörledningen följt av att vänta på bekräftelse.
- När en slutlig bekräftelse mottagits kontaktas NameNode för att meddela att filskrivningen är klar.
Åtkomst till HDFS med JAVA API
I det här avsnittet försöker vi förstå Java-gränssnittet som används för åtkomst till Hadoops filsystem.
För att interagera med Hadoops filsystem programmatiskt tillhandahåller Hadoop flera JAVA-klasser. Paketet heter org.apache.hadoop.fs innehåller klasser som är användbara för att manipulera en fil i Hadoops filsystem. Dessa operationer inkluderar, öppna, läsa, skriva och stänga. Egentligen är fil-API för Hadoop generiskt och kan utökas för att interagera med andra filsystem än HDFS.
Läser en fil från HDFS, programmatiskt
Objekt java.net.URL används för att läsa innehållet i en fil. Till att börja med måste vi få Java att känna igen Hadoop's hdfs URL-schema. Detta görs genom att anropa setURLStreamHandlerFactory- metoden på URL-objekt och en instans av FsUrlStreamHandlerFactory skickas till den. Denna metod behöver endast köras en gång per JVM, därför är den innesluten i ett statiskt block.
Ett exempel på kod är-
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);}}}
Den här koden öppnar och läser innehållet i en fil. Sökvägen för den här filen på HDFS skickas till programmet som ett kommandoradsargument.
Åtkomst till HDFS med COMMAND-LINE INTERFACE
Detta är ett av de enklaste sätten att interagera med HDFS. Kommandoradsgränssnittet har stöd för filsystemoperationer som att läsa filen, skapa kataloger, flytta filer, ta bort data och lista kataloger.
Vi kan köra '$ HADOOP_HOME / bin / hdfs dfs -help' för att få detaljerad hjälp med varje kommando. Här är 'dfs' ett skalkommando för HDFS som stöder flera underkommandon.
Några av de allmänt använda kommandona listas nedan tillsammans med några detaljer om var och en.
1. Kopiera en fil från det lokala filsystemet till HDFS
$HADOOP_HOME/bin/hdfs dfs -copyFromLocal temp.txt /
Detta kommando kopierar fil temp.txt från det lokala filsystemet till HDFS.
2. Vi kan lista filer som finns i en katalog med -ls
$HADOOP_HOME/bin/hdfs dfs -ls /
Vi kan se en fil 'temp.txt' (kopieras tidigare) listas under '/' katalogen.
3. Kommando att kopiera en fil till det lokala filsystemet från HDFS
$HADOOP_HOME/bin/hdfs dfs -copyToLocal /temp.txt
Vi kan se temp.txt kopieras till ett lokalt filsystem.
4. Kommando för att skapa en ny katalog
$HADOOP_HOME/bin/hdfs dfs -mkdir /mydirectory
Kontrollera om en katalog skapas eller inte. Nu borde du veta hur du gör det ;-)