HDFS výukový program: Architecture, Read & Write Operapoužití Java API
Co je HDFS?
HDFS je distribuovaný souborový systém pro ukládání velmi velkých datových souborů, který běží na klastrech komoditního hardwaru. Je odolný proti chybám, škálovatelný a extrémně jednoduchý na rozšíření. Hadoop je součástí balení HDFS (Distribuované souborové systémy Hadoop).
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
HDFS cluster se primárně skládá z a NameNode který spravuje souborový systém Metadata a DataNodes která ukládá skutečné údaje.
- NameNode: NameNode lze považovat za master systému. Udržuje strom systému souborů a metadata pro všechny soubory a adresáře přítomné v systému. Dva soubory 'Obrázek jmenného prostoru' a 'edit log' se používají k ukládání informací metadat. Namenode zná všechny datové uzly obsahující datové bloky pro daný soubor, neukládá však umístění bloků trvale. Tyto informace jsou rekonstruovány pokaždé z datových uzlů při spuštění systému.
- DataNode: DataNodes jsou podřízené jednotky, které jsou umístěny na každém počítači v clusteru a poskytují skutečné úložiště. Zodpovídá za obsluhu, čtení a zápis požadavků pro klienty.
Operace čtení/zápisu v HDFS fungují na úrovni bloku. Datové soubory v HDFS jsou rozděleny na bloky o velikosti bloku, které jsou uloženy jako nezávislé jednotky. Výchozí velikost bloku je 64 MB.
HDFS funguje na konceptu replikace dat, kdy je vytvořeno více replik datových bloků a jsou distribuovány na uzlech v rámci clusteru, aby byla umožněna vysoká dostupnost dat v případě selhání uzlu.
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 obsluhují HDFS, NameNode a DataNode. Nazvěme čtenáře jako ‚klienta‘. Níže uvedený diagram znázorňuje operaci čtení souboru v Hadoop.
- Klient vyvolá požadavek na čtení voláním 'OTEVŘENO()' metoda objektu FileSystem; je to objekt typu DistributedFileSystem.
- Tento objekt se připojuje k namenode pomocí RPC a získává informace o metadatech, jako je umístění bloků souboru. Upozorňujeme, že tyto adresy jsou z několika prvních bloků souboru.
- V reakci na tento požadavek na metadata jsou adresy DataNodes, které mají kopii tohoto bloku, vráceny zpět.
-
Jakmile jsou přijaty adresy DataNodes, objekt typu FSDataInputStream se vrací klientovi. FSDataInputStream obsahuje DFSInputStream který se stará o interakce s DataNode a NameNode. V kroku 4 zobrazeném na výše uvedeném diagramu klient zavolá 'číst()' způsob, který způsobuje DFSInputStream k navázání spojení s prvním DataNode s prvním blokem souboru.
-
Data se čtou ve formě proudů, které klient vyvolává 'číst()' metodou opakovaně. Tento proces číst() operace pokračuje, dokud nedosáhne konce bloku.
- Jakmile je dosaženo konce bloku, DFSInputStream uzavře připojení a přejde k nalezení dalšího DataNode pro další blok.
- Jakmile klient dokončí čtení, zavolá zavřít() metoda.
Napsat Operav HDFS
V této části pochopíme, jak se data zapisují do HDFS prostřednictvím souborů.
- 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řipojí k NameNode pomocí volání RPC a zahájí vytváření nového souboru. Operace vytvoření tohoto souboru však k souboru nepřidruží žádné bloky. Je odpovědností NameNode ověřit, že soubor (který se vytváří) již neexistuje a klient má 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, pak IOException je předán klientovi. Jinak bude operace úspěšná a NameNode vytvoří nový záznam pro soubor.
- Jakmile je vytvořen nový záznam v NameNode, je klientovi vrácen objekt typu FSDataOutputStream. Klient jej používá 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 DataNodes 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, která se nazývá as DataQueue.
- Je zde ještě jedna složka tzv DataStreamer která toto konzumuje DataQueue. DataStreamer také požádá NameNode o přidělení nových bloků, čímž vybere požadované DataNodes, 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ý DataNode v potrubí ukládá pakety, které přijal, a předává je do druhého DataNode v potrubí.
- Další fronta, 'Ack Queue', je udržována DFSOutputStream pro ukládání paketů, které čekají na potvrzení od DataNodes.
- 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 je klient se zápisem dat hotový, zavolá metodu close() (krok 9 v diagramu) Volání close(), což má za následek vyprázdnění zbývajících datových paketů do kanálu a následuje čekání na potvrzení.
- Jakmile je přijato konečné potvrzení, NameNode je kontaktován, aby mu oznámil, že operace zápisu souboru je dokončena.
Přístup k HDFS pomocí JAVA API
V této části se snažíme porozumět Java rozhraní používané pro přístup k systému souborů Hadoop.
Aby bylo možné programově interagovat se souborovým systémem Hadoop, poskytuje Hadoop několik tříd JAVA. Balíček s názvem org.apache.hadoop.fs obsahuje třídy užitečné při manipulaci se souborem v souborovém systému Hadoop. Tyto operace zahrnují otevření, čtení, zápis a zavření. Souborové API pro Hadoop je ve skutečnosti obecné a lze jej rozšířit o interakci s jinými systémy souborů 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 rozpoznat schéma adresy URL hdfs společnosti Hadoop. To se provádí zavoláním setURLStreamHandlerFactory metoda na objektu URL a je jí předána instance FsUrlStreamHandlerFactory. Tato metoda musí být provedena 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 přečte obsah souboru. Cesta k tomuto souboru na HDFS je předána programu 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 souborového systému, 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. Tady, 'dfs' je příkaz shellu HDFS, který podporuje více dílčích příkazů.
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 místního souborového systému do HDFS.
2. Můžeme vypsat soubory přítomné v adresáři pomocí -l
$HADOOP_HOME/bin/hdfs dfs -ls /
Můžeme vidět soubor 'temp.txt' (zkopírované dříve) jsou uvedeny pod '/' adresáře.
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
Vidíme temp.txt zkopírován do místního souborového systému.
4. Příkaz pro vytvoření nového adresáře
$HADOOP_HOME/bin/hdfs dfs -mkdir /mydirectory
Zkontrolujte, zda je adresář vytvořen nebo ne. Teď byste měli vědět, jak na to 😉