HDFS handledning: Archilära, läsa & skriva Operaanvända Java API

Vad är HDFS?

HDFS är ett distribuerat filsystem för lagring av mycket stora datafiler, som körs på kluster av råvaruhårdvara. Den är feltålig, skalbar och extremt enkel att bygga ut. Hadoop levereras med HDFS (Hadoop distribuerade filsystem).

När data överstiger lagringskapaciteten på en enda fysisk maskin, blir det viktigt att dela upp det ö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.

HDFS Architecture

HDFS-kluster består huvudsakligen av en NameNode som hanterar filsystemet metadata och en DataNoder som lagrar faktiska data.

  • NameNode: NameNode kan betraktas som en mästare på systemet. Den upprätthåller filsystemträdet och metadata för alla filer och kataloger som finns i systemet. Två filer "Namnområdesbild" och 'redigera logg' används för att lagra metadatainformation. Namenode har kunskap om alla datanoder som innehåller datablock för en given fil, men den lagrar inte blockplatser permanent. 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 tillhandahåller den faktiska lagringen. Den ansvarar för att servera, läsa och skriva förfrågningar till kunderna.

Läs-/skrivoperationer i HDFS fungerar på blocknivå. Datafiler i HDFS är uppdelade i blockstorlekar, som lagras som oberoende enheter. Standard blockstorlek är 64 MB.

HDFS arbetar på ett koncept av datareplikering där flera repliker av datablock skapas och distribueras på noder i 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 enda block, upptar inte ett blocks fulla lagringsutrymme.

Läsa Operation i HDFS

Begäran om dataläsning betjänas av HDFS, NameNode och DataNode. Låt oss kalla läsaren som en "klient". Nedanstående diagram visar filläsoperation i Hadoop.

Läsa Operation i HDFS

  1. En klient initierar läsbegäran genom att ringa 'öppen()' metod för FileSystem-objekt; det är ett objekt av typ Distribuerat filsystem.
  2. Det här objektet ansluter till namenode med hjälp av RPC och får metadatainformation såsom placeringen av filens block. Observera att dessa adresser är de första blocken av en fil.
  3. Som svar på denna metadatabegäran returneras adresserna till de DataNodes som har en kopia av det blocket.
  4. När adresser till DataNodes har tagits emot, ett objekt av typen FSDataInputStream återlämnas till kunden. FSDataInputStream innehåller DFSInputStream som tar hand om interaktioner med DataNode och NameNode. I steg 4 som visas i diagrammet ovan anropar en klient 'läsa()' metod som orsakar DFSInputStream för att upprätta en anslutning till den första DataNoden med det första blocket i en fil.
  5. Data läses i form av strömmar där klienten anropar 'läsa()' metod upprepade gånger. Denna process av läsa() operationen fortsätter tills den når slutet av blocket.
  6. När slutet av ett block har nåtts stänger DFSInputStream anslutningen och går vidare för att hitta nästa DataNode för nästa block
  7. När en klient har gjort avläsningen ringer den en nära() metod.

Skriva Operation i HDFS

I det här avsnittet kommer vi att förstå hur data skrivs in i HDFS genom filer.

Skriva Operation i HDFS

  1. En klient initierar skrivoperation genom att anropa 'create()'-metoden för DistributedFileSystem-objektet som skapar en ny fil – Steg nr. 1 i diagrammet ovan.
  2. DistributedFileSystem-objekt ansluter till NameNode med RPC-anrop och initierar ny filskapande. Men den här filen skapar operation associerar inte några block med filen. Det är NameNodes ansvar att verifiera att filen (som skapas) inte redan existerar och att en klient har rätt behörighet att skapa en ny fil. Om en fil redan finns eller om klienten inte har tillräcklig behörighet för att skapa en ny fil, då IO-undantag kastas till klienten. Annars lyckas operationen och en ny post för filen skapas av NameNode.
  3. 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. Dataskrivmetoden anropas (steg 3 i diagrammet).
  4. FSDataOutputStream innehåller DFSOutputStream-objekt som sköter kommunikationen med DataNodes och NameNode. Medan klienten fortsätter skriva data, DFSOutputStream fortsätter att skapa paket med denna data. Dessa paket köas in i en kö som kallas som Datakö.
  5. Det finns ytterligare en komponent som heter DataStreamer som förbrukar detta Datakö. DataStreamer ber också NameNode om allokering av nya block och väljer därigenom önskvärda DataNodes som ska användas för replikering.
  6. Nu börjar replikeringsprocessen genom att skapa en pipeline med hjälp av DataNodes. I vårt fall har vi valt en replikeringsnivå på 3 och därför finns det 3 DataNoder i pipelinen.
  7. DataStreamern häller paket i den första DataNoden i pipelinen.
  8. Varje DataNode i en pipeline lagrar paket som tas emot av den och vidarebefordrar detsamma till den andra DataNode i en pipeline.
  9. En annan kö, 'Ack Queue' underhålls av DFSOutputStream för att lagra paket som väntar på bekräftelse från DataNodes.
  10. När bekräftelse för ett paket i kön har tagits emot från alla DataNoder i pipelinen tas det bort från "Ack Queue". I händelse av något DataNode-fel, används paket från denna kö för att återinitiera operationen.
  11. Efter att en klient är klar med att skriva data anropar den en close()-metod (steg 9 i diagrammet) Call to close(), vilket resulterar i att återstående datapaket spolas till pipelinen följt av väntan på bekräftelse.
  12. När en slutgiltig bekräftelse har tagits emot, kontaktas NameNode för att berätta att filskrivningsoperationen är klar.

Få åtkomst till HDFS med JAVA API

I det här avsnittet försöker vi förstå Java gränssnitt som används för att komma åt Hadoops filsystem.

För att interagera med Hadoops filsystem programmatiskt tillhandahåller Hadoop flera JAVA-klasser. Paketet med namnet org.apache.hadoop.fs innehåller klasser som är användbara vid manipulering av en fil i Hadoops filsystem. Dessa operationer inkluderar, öppna, läsa, skriva och stänga. Egentligen är fil-API för Hadoop generisk 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 göra Java känna igen Hadoops hdfs URL-schema. Detta görs genom att ringa setURLSreamHandlerFactory metod på URL-objekt och en instans av FsUrlStreamHandlerFactory skickas till den. Denna metod behöver endast utföras en gång per JVM, därför är den innesluten i ett statiskt block.

En exempelkod ä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);
        }
    }
}

Denna kod öppnar och läser innehållet i en fil. Sökvägen till denna fil på HDFS skickas till programmet som ett kommandoradsargument.

Få åtkomst till HDFS med COMMAND-LINE GRÄNSSNITT

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 springa '$HADOOP_HOME/bin/hdfs dfs -help' för att få detaljerad hjälp med varje kommando. Här, 'dfs' är ett skalkommando för HDFS som stöder flera underkommandon.

Några av de ofta 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 /

Få åtkomst till HDFS med COMMAND-LINE GRÄNSSNITT

Detta kommando kopierar filen temp.txt från det lokala filsystemet till HDFS.

2. Vi kan lista filer som finns i en katalog med hjälp av -Är

$HADOOP_HOME/bin/hdfs dfs -ls /

Få åtkomst till HDFS med COMMAND-LINE GRÄNSSNITT

Vi kan se en fil "temp.txt" (kopierat tidigare) listas under '/' katalog.

3. Kommando för att kopiera en fil till det lokala filsystemet från HDFS

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

Få åtkomst till HDFS med COMMAND-LINE GRÄNSSNITT

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

Få åtkomst till HDFS med COMMAND-LINE GRÄNSSNITT

Kontrollera om en katalog har skapats eller inte. Nu borde du veta hur du gör 😉