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.
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.
- Klient inicializuje požadavek na čtení voláním metody 'open()' objektu FileSystem; jedná se o objekt typu DistributedFileSystem.
- 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.
- V reakci na tento požadavek na metadata jsou vráceny adresy datových uzlů (DataNodes), které mají kopii daného bloku.
- 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.
- Data jsou čtena ve formě streamů, kde klient opakovaně volá metodu 'read()'. Tento proces operace read() pokračuje, dokud se nedosáhne konce bloku.
- Jakmile je dosaženo konce bloku, DFSInputStream ukončí spojení a přesune se k nalezení dalšího datového uzlu pro další blok.
- 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.
- 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.
- 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.
- 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).
- 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.
- 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.
- 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.
- DataStreamer nalévá pakety do prvního DataNode v kanálu.
- Každý datový uzel v pipelině ukládá přijatý paket a přeposílá ho druhému datovému uzlu v pipelině.
- Další fronta, „Ack Queue“, je udržována DFSOutputStream pro ukládání paketů, které čekají na potvrzení od datových uzlů.
- 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.
- 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í.
- 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.
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 ' / '.
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.
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.
Zkontrolujte, zda je adresář vytvořen, či nikoli. Teď byste měli vědět, jak na to 😉




