Výukový program HDFS: Architektura, čtení a Zápis operace pomocí Java API

Obsah:

Anonim

Co je HDFS?

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

Když data přesáhnou kapacitu úložiště na jednom fyzickém stroji, je nutné jej rozdělit mezi několik samostatných počítačů. Souborový systém, který spravuje operace specifické pro úložiště v síti počítačů, se nazývá distribuovaný souborový systém. HDFS je jeden takový software.

V tomto tutoriálu se naučíme,

  • Co je HDFS?
  • Architektura HDFS
  • Přečíst operaci
  • Zápis operace
  • Přístup k HDFS pomocí JAVA API
  • Přístup k HDFS pomocí rozhraní COMMAND-LINE

Architektura HDFS

HDFS cluster se primárně skládá z NameNode, který spravuje metadata systému souborů a DataNodes, která ukládá skutečná data .

  • NameNode: NameNode lze považovat za hlavní systém. Udržuje strom systému souborů a metadata pro všechny soubory a adresáře přítomné v systému. K ukládání informací o metadatech se používají dva soubory „Namespace image“ a „edit log“ . Namenode má znalosti o všech datanodech obsahujících datové bloky pro daný soubor, trvale však neukládá umístění bloků. Tyto informace se při spuštění systému pokaždé rekonstruují z datanod.
  • DataNode: DataNodes jsou slave, kteří jsou umístěni na každém počítači v klastru a poskytují skutečné úložiště. Je odpovědný za poskytování, č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 velikosti bloku, které jsou uloženy jako nezávislé jednotky. Výchozí velikost bloku je 64 MB.

HDFS pracuje na konceptu replikace dat, kde je vytvořeno více replik datových bloků a jsou distribuovány na uzlech v klastru, aby byla zajištěna vysoká dostupnost dat v případě selhání uzlu.

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

Přečíst operaci v HDFS

Žádost o přečtení dat obsluhují HDFS, NameNode a DataNode. Říkejme čtenáři jako „klienta“. Níže uvedený diagram zobrazuje operaci čtení souboru v Hadoopu.

  1. Klient iniciuje požadavek na čtení voláním metody 'open ()' objektu FileSystem; je to objekt typu DistributedFileSystem .
  2. Tento objekt se připojuje k namenode pomocí RPC a získává informace o metadatech, jako jsou umístění bloků souboru. Upozorňujeme, že tyto adresy jsou prvními několika bloky souboru.
  3. V reakci na tento požadavek metadat jsou vráceny zpět adresy DataNodes, které mají kopii tohoto bloku.
  4. Po přijetí adres DataNodes se klientovi vrátí objekt typu FSDataInputStream . FSDataInputStream obsahuje DFSInputStream, který se stará o interakce s DataNode a NameNode. V kroku 4 zobrazeném ve výše uvedeném diagramu klient vyvolá metodu 'read ()', která způsobí, že DFSInputStream naváže spojení s prvním DataNode s prvním blokem souboru.
  5. Data jsou čtena ve formě streamů, kde klient opakovaně vyvolává metodu 'read ()' . Tento proces operace read () pokračuje, dokud nedosáhne konce bloku.
  6. Jakmile je dosaženo konce bloku, DFSInputStream uzavře připojení a přejde k vyhledání dalšího DataNode pro další blok
  7. Jakmile klient provede čtení, zavolá metodu close () .

Zápis operace do HDFS

V této části pochopíme, jak se data do souborů HDFS zapisují prostřednictvím souborů.

  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 iniciuje vytvoření nového souboru. Tento soubor vytváří operaci, ale nepřidružuje k němu žádné bloky. Je odpovědností NameNode ověřit, že soubor (který se právě 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, je klientovi vyvolána IOException . V opačném případě bude operace úspěšná a NameNode vytvoří nový záznam pro soubor.
  3. Po vytvoření nového záznamu v NameNode se klientovi vrátí objekt typu FSDataOutputStream. Klient jej používá 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 DataNodes a NameNode. Zatímco klient pokračuje v psaní dat, DFSOutputStream pokračuje ve vytváření paketů s těmito daty. Tyto pakety jsou zařazeny do fronty, která se nazývá DataQueue .
  5. Existuje ještě jedna součást s názvem DataStreamer, která spotřebovává tuto DataQueue . DataStreamer také požádá NameNode o přidělení nových bloků, čímž vybere žádoucí DataNodes, které se mají použít pro replikaci.
  6. Proces replikace nyní začíná vytvořením kanálu pomocí DataNodes. V našem případě jsme vybrali úroveň replikace 3, a proto jsou v kanálu 3 DataNodes.
  7. DataStreamer nalévá pakety do prvního DataNode v potrubí.
  8. Každý DataNode v kanálu ukládá pakety, které přijal, a předá je stejný druhému DataNode v kanálu.
  9. Další fronta „Ack Queue“ je udržována programem DFSOutputStream pro ukládání paketů, které čekají na potvrzení od DataNodes.
  10. Jakmile je přijato potvrzení pro paket ve frontě ze všech DataNodes v potrubí, je odebráno z „Potvrzené fronty“. 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) Call to close (), výsledkem bude 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, který mu sdělí, že operace zápisu do souboru je dokončena.

Přístup k HDFS pomocí JAVA API

V této části se pokusíme porozumět rozhraní Java používanému pro přístup k souborovému systému Hadoop.

Za účelem programové interakce se souborovým systémem Hadoop poskytuje Hadoop více 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. Mezi tyto operace patří otevírání, čtení, zápis a zavírání. Ve skutečnosti je souborové rozhraní API pro Hadoop obecné a lze jej rozšířit o interakci s jinými souborovými systémy než HDFS.

Čtení souboru z HDFS, programově

Objekt java.net.URL se používá ke čtení obsahu souboru. Nejprve je třeba, aby Java rozpoznala schéma URL Hadoop Hdfs URL. To se provádí voláním metody setURLStreamHandlerFactory na objekt URL a předá se jí instance FsUrlStreamHandlerFactory. Tuto metodu je třeba provést pouze jednou za JVM, a 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 tohoto souboru na HDFS je předána programu jako argument příkazového řádku.

Přístup k HDFS pomocí rozhraní COMMAND-LINE

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 vypisování adresářů.

Můžeme spustit '$ HADOOP_HOME / bin / hdfs dfs -help', abychom získali 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ů.

Některé široce používané příkazy 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í -ls

$HADOOP_HOME/bin/hdfs dfs -ls /

Vidíme soubor 'temp.txt' (zkopírovaný dříve), který je uveden v adresáři '/' .

3. Příkaz zkopíruje soubor do místního souborového systému z HDFS

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

Vidíme temp.txt zkopírovaný do lokálního souborového systému.

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

$HADOOP_HOME/bin/hdfs dfs -mkdir /mydirectory

Zkontrolujte, zda je vytvořen adresář. Nyní byste měli vědět, jak na to ;-)