HDFS výukový program: Architecture, Read & Write Operavání

⚡ Chytré shrnutí

HDFS je distribuovaná úložná vrstva Hadoopu, která rozděluje velmi velké soubory do replikovaných bloků napříč běžnými počítači, takže jeden NameNode... tracks metadata, zatímco mnoho datových uzlů spolehlivě obsluhuje požadavky na čtení a zápis.

  • 🔘 Archistruktura: NameNode uchovává obraz jmenného prostoru a protokol úprav, zatímco DataNodes ukládá skutečné repliky bloků.
  • ☑️ Velikost bloku: Hadoop 1.x měl standardně bloky o velikosti 64 MB; Hadoop 2.x a 3.x místo toho standardně používaly bloky o velikosti 128 MB.
  • (Tj. replikace: Výchozí nastavení je tři repliky na blok, rozložené po raccích, takže selhání hardwaru nikdy neztratí data.
  • 🧪 Cesta čtení: FSDataInputStream a DFSInputStream načítají umístění bloků z NameNode a poté streamují bajty přímo z DataNodes.
  • 🛠️ Cesta k zápisu: DFSOutputStream řadí pakety do fronty, DataStreamer vytváří kanál DataNode a fronta Ack chrání před ztrátou paketů.
  • 🧭 Možnosti přístupu: Soubor org.apache.hadoop.fs Java API i shell hdfs dfs pokrývají otevírání, čtení, zápis a zavírání.

HDFS výukový program

Co je HDFS?

HDFS je distribuovaný souborový systém pro ukládání velmi velkých datových souborů, který běží na klastrech běžného hardwaru. Je odolný vůči chybám, škálovatelný a extrémně snadno se rozšiřuje. Hadoop je dodáván s HDFS (Hadoop Distributed File System).

Když data překročí kapacitu úložiště na jediném fyzickém stroji, je nezbytné je rozdělit na několik samostatných strojů. Systém souborů, který spravuje operace specifické pro úložiště v síti počítačů, se nazývá distribuovaný systém souborů. HDFS je jeden takový software.

HDFS Architecture

Cluster HDFS se skládá především z NameNode který spravuje metadata souborového systému a DataNodes které ukládají skutečná data.

  • NameNode: NameNode lze považovat za hlavního uzlu systému. Udržuje strom souborového systému a metadata pro všechny soubory a adresáře přítomné v systému. Dva soubory, „obraz jmenného prostoru“ a „protokol úprav“, se používají k ukládání informací o metadatech. NameNode má znalosti o všech datových uzlech obsahujících datové bloky pro daný soubor, nicméně neukládá umístění bloků trvale. Tyto informace se rekonstruují z datových uzlů při každém spuštění systému.
  • DataNode: Datové uzly (DataNode) jsou podřízené uzly (slave), které se nacházejí na každém počítači v clusteru a poskytují skutečné úložiště. Jsou zodpovědné za obsluhu požadavků na čtení a zápis od klientů.

Protože osamělý NameNode by byl jediným bodem selhání, aktuální clustery provozují aktivní NameNode vedle záložního NameNode, který sdílí protokol úprav prostřednictvím kvora JournalNodes s automatickým přepnutím mezi nimi.

Operace čtení a zápisu v HDFS probíhají na úrovni bloků. Datové soubory v HDFS jsou rozděleny do blokových částí, které jsou uloženy jako nezávislé jednotky. Výchozí velikost bloku v Hadoopu 1.x je 64 MB. Od Hadoopu 2.x dále je výchozí... dfs.blocksize je 128 MB.

HDFS funguje na konceptu replikace dat, kde se vytváří více replik datových bloků a distribuují se na uzly v clusteru, aby se zajistila vysoká dostupnost dat v případě selhání uzlu. Výchozí replikační faktor je tři (replikace dfs) a když DataNode přestane odesílat prezenční signály, NameNode automaticky znovu replikuje své bloky jinam.

Víte, že? Soubor v HDFS, který je menší než jeden blok, nezabírá celé úložiště bloku.

číst Operav HDFS

Požadavek na čtení dat je obsluhován HDFS, NameNode a DataNode. Čtenářský modul budeme nazývat „klient“. Následující diagram znázorňuje operaci čtení souboru v Hadoopu.

Tok dat operace čtení HDFS mezi klientem, NameNode a DataNodes

  1. Klient inicializuje požadavek na čtení voláním metody 'open()' objektu FileSystem; jedná se o objekt typu DistributedFileSystem.
  2. Tento objekt se připojuje k NameNode pomocí RPC a získává informace o metadatech, jako například umístění bloků souboru. Upozorňujeme, že se jedná o adresy prvních několika bloků souboru.
  3. V reakci na tento požadavek na metadata jsou vráceny adresy datových uzlů (DataNodes), které mají kopii daného bloku.
  4. Jakmile jsou přijaty adresy datových uzlů (DataNode), je klientovi vrácen objekt typu FSDataInputStream. FSDataInputStream obsahuje DFSInputStream, který se stará o interakce s datovým uzlem (DataNode) a uzlem NameNode. V kroku 4, jak je znázorněno na výše uvedeném diagramu, klient zavolá metodu 'read()', která způsobí, že DFSInputStream naváže spojení s prvním datovým uzlem (DataNode), který obsahuje první blok souboru.
  5. Data jsou čtena ve formě streamů, kde klient opakovaně volá metodu 'read()'. Tento proces operace read() pokračuje, dokud se nedosáhne konce bloku.
  6. Jakmile je dosaženo konce bloku, DFSInputStream ukončí spojení a přesune se k nalezení dalšího datového uzlu pro další blok.
  7. Jakmile klient dokončí čtení, zavolá metodu close().

Napsat Operav HDFS

V této části si ukážeme, jak se data zapisují do HDFS pomocí souborů. Níže uvedený diagram traces, které zapisují cestu.

Kanál zápisu HDFS s DataQueue, DataStreamer a Ack Queue

  1. Klient zahájí operaci zápisu voláním metody 'create()' objektu DistributedFileSystem, která vytvoří nový soubor – krok č. 1 ve výše uvedeném diagramu.
  2. Objekt DistributedFileSystem se připojuje k NameNode pomocí volání RPC a zahájí vytváření nového souboru. Tato operace vytváření souboru však nespojuje žádné bloky se souborem. Je odpovědností NameNode ověřit, zda soubor (který je vytvářen) již neexistuje a zda má klient správná oprávnění k vytvoření nového souboru. Pokud soubor již existuje nebo klient nemá dostatečná oprávnění k vytvoření nového souboru, je klientovi vyvolána výjimka IOException. V opačném případě je operace úspěšná a NameNode vytvoří nový záznam pro soubor.
  3. Jakmile je v NameNode vytvořen nový záznam, klientovi je vrácen objekt typu FSDataOutputStream. Klient jej použije k zápisu dat do HDFS. Je vyvolána metoda zápisu dat (krok 3 v diagramu).
  4. FSDataOutputStream obsahuje objekt DFSOutputStream, který se stará o komunikaci s uzly DataNode a NameNode. Zatímco klient pokračuje v zápisu dat, DFSOutputStream pokračuje ve vytváření paketů s těmito daty. Tyto pakety jsou zařazeny do fronty nazývané DataQueue.
  5. Existuje ještě jedna komponenta s názvem DataStreamer, která tuto DataQueue spotřebovává. DataStreamer také požádá NameNode o alokaci nových bloků, a tím vybere požadované DataNode, které se mají použít pro replikaci.
  6. Nyní proces replikace začíná vytvořením kanálu pomocí DataNodes. V našem případě jsme zvolili úroveň replikace 3, a proto jsou v procesu 3 DataNody.
  7. DataStreamer nalévá pakety do prvního DataNode v kanálu.
  8. Každý datový uzel v pipelině ukládá přijatý paket a přeposílá ho druhému datovému uzlu v pipelině.
  9. Další fronta, „Ack Queue“, je udržována DFSOutputStream pro ukládání paketů, které čekají na potvrzení od datových uzlů.
  10. Jakmile je přijato potvrzení o paketu ve frontě od všech DataNodes v kanálu, je odstraněn z 'Ack Queue'. V případě jakéhokoli selhání DataNode se pakety z této fronty použijí k opětovnému zahájení operace.
  11. Poté, co klient dokončí zápis dat, zavolá metodu close() (krok 9 v diagramu). Volání metody close() má za následek vyprázdnění zbývajících datových paketů do kanálu a následné čekání na potvrzení.
  12. Jakmile je přijato konečné potvrzení, je kontaktován NameNode, aby mu bylo sděleno, že operace zápisu do souboru je dokončena.

Přístup k HDFS pomocí Java API

V této části se snažíme pochopit Java rozhraní používané pro přístup k systému souborů Hadoop.

Aby Hadoop mohl programově interagovat se souborovým systémem, poskytuje několik Java třídy. Balíček s názvem org.apache.hadoop.fs obsahuje třídy užitečné pro manipulaci se soubory v souborovém systému Hadoop. Mezi tyto operace patří otevírání, čtení, zápis a zavírání. Souborové API Hadoop je generické a lze jej rozšířit pro interakci s jinými souborovými systémy než HDFS.

Čtení souboru z HDFS, programově

Objekt java.net.URL se používá pro čtení obsahu souboru. Pro začátek musíme udělat Java rozpozná Hadoopovy HDF URL schéma. To se provede voláním množinyURLMetoda StreamHandlerFactory na URL objekt a předáním instance FsUrlStreamHandlerFactory do něj. Tuto metodu je třeba spustit pouze jednou za JVM, proto je uzavřena ve statickém bloku.

Příklad kódu je -

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);
        }
    }
}

Tento kód otevře a načte obsah souboru. Cesta k tomuto souboru na HDFS je programu předána jako argument příkazového řádku.

Přístup k HDFS pomocí rozhraní příkazového řádku

Toto je jeden z nejjednodušších způsobů interakce s HDFS. Rozhraní příkazového řádku podporuje operace se souborovým systémem, jako je čtení souboru, vytváření adresářů, přesouvání souborů, mazání dat a výpis adresářů.

Můžeme běžet '$HADOOP_HOME/bin/hdfs dfs -help' získat podrobnou nápovědu ke každému příkazu. Zde je „dfs“ příkaz shellu HDFS, který podporuje více dílčích příkazů. V aktuálních verzích Hadoopu HDFS DFS je preferovaná forma, zatímco starší Hadoop FS Příkaz provede stejnou práci pro jakýkoli podporovaný souborový systém.

Některé z široce používaných příkazů jsou uvedeny níže spolu s některými podrobnostmi o každém z nich.

1. Zkopírujte soubor z místního souborového systému do HDFS

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

Tento příkaz zkopíruje soubor temp.txt z lokálního souborového systému do HDFS, jak ukazuje výstup níže.

Příkaz hdfs dfs -copyFromLocal kopíruje soubor temp.txt do HDFS

2. Seznam souborů v adresáři můžeme zobrazit pomocí -ls

$HADOOP_HOME/bin/hdfs dfs -ls /

V níže uvedeném výpisu vidíme soubor 'temp.txt' (zkopírovaný dříve) v adresáři ' / '.

hdfs dfs -ls vypíše soubor temp.txt v kořenovém adresáři HDFS

3. Příkaz pro zkopírování souboru do místního souborového systému z HDFS

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

Tento příkaz zrcadlí volbu -get a jako druhý argument přijímá explicitní lokální cílovou cestu. Výstup níže ukazuje soubor temp.txt zkopírovaný do lokálního souborového systému.

Výstup příkazu hdfs dfs -copyToLocal zobrazující soubor temp.txt zkopírovaný do lokálního souborového systému.

4. Příkaz pro vytvoření nového adresáře

$HADOOP_HOME/bin/hdfs dfs -mkdir /mydirectory

Příkaz se dokončí tiše, jak ukazuje níže uvedený příkaz.

Příkaz hdfs dfs -mkdir pro vytvoření složky /mydirectory v HDFS

Zkontrolujte, zda je adresář vytvořen, či nikoli. Teď byste měli vědět, jak na to 😉

Nejčastější dotazy

Velké bloky udržují metadata NameNode malá a umožňují mapperovi číst dlouhou sekvenční řadu bajtů před dalším vyhledáváním. Doba vyhledávání na disku se tak stává nepatrným zlomkem doby přenosu, což je důvod, proč je skenování celého souboru rychlé.

NameNode přestane přijímat signály heartbeat, označí uzel jako nefunkční a naplánuje opětovnou replikaci každého bloku, který klesne pod svůj replikační faktor, na zdravé DataNode. Zápisy za provozu se obnovují z fronty Ack, takže klient neztrácí pakety.

Není ve správně nakonfigurovaném clusteru. HDFS High Availability spouští aktivní a záložní uzel NameNode, které sdílejí úpravy prostřednictvím uzlů JournalNode, a řadiče failoveru ZooKeeper automaticky přepnou záložní uzel, když aktivní uzel přestane reagovat.

Oba nahrávají data do HDFS. Volba -copyFromLocal omezuje zdroj na lokální souborový systém, zatímco volba -put akceptuje jakýkoli podporovaný zdroj, včetně jiné cesty HDFS nebo stdin. Chování je jinak identické, takže volba -copyFromLocal jednoduše dokumentuje záměr.

Každý soubor, adresář a blok zabírá paměť v NameNode, takže miliony drobných souborů vyčerpají paměť dlouho předtím, než se disky zaplní. Kombinací těchto souborů do sekvenčních souborů, archivů Avro, ORC, Parquet nebo HAR, lze udržet metadata spravovatelná.

Replikace uchovává tři plné kopie, což představuje o 200 procent více úložného prostoru. Kódování pro mazání, přidané v Hadoopu 3, místo toho ukládá buňky parity a dosahuje podobné odolnosti s přibližně 50 procenty režijních nákladů, přičemž levnější úložiště se vyměňuje za vyšší náklady na CPU a síť během obnovy.

Modely strojového učení trénované na protokolech auditu NameNode a metrikách DataNode dokáží předpovídat vyčerpání kapacity, označovat aktivní bloky a detekovat selhávající disky dříve, než vypadnou. Detekce anomálií ve vzorcích přístupu také včas odhaluje nekontrolované úlohy.

Copilot rychle dokončuje známé standardizované operace org.apache.hadoop.fs, jako například smyčky FileSystem.get, FSDataInputStream a volání IOUtils.copyBytes. Vždy ověřte vygenerovaný kód oproti používané verzi Hadoopu, protože názvy API a zastaralé metody se mezi Hadoopem 2.x a 3.x znatelně liší.

Shrňte tento příspěvek takto: