Vodič za HDFS: Arhitektura, čitanje i pojačalo; Pisanje operacija pomoću Java API-ja

Sadržaj:

Anonim

Što je HDFS?

HDFS je distribuirani datotečni sustav za pohranu vrlo velikih podatkovnih datoteka, pokrenut na klasterima robnog hardvera. Otporan je na kvarove, skalabilan je i izuzetno jednostavan za proširivanje. Hadoop dolazi u paketu s HDFS-om ( Hadoop Distributed File Systems ).

Kada podaci premaše kapacitet pohrane na jednom fizičkom stroju, postaje neophodno podijeliti ih na više zasebnih strojeva. Datotečni sustav koji upravlja operacijama specifičnim za pohranu u mreži strojeva naziva se distribuirani sustav datoteka. HDFS je jedan od takvih softvera.

U ovom uputstvu ćemo naučiti,

  • Što je HDFS?
  • HDFS arhitektura
  • Pročitajte operaciju
  • Napišite operaciju
  • Pristupite HDFS-u pomoću JAVA API-ja
  • Pristupite HDFS-u pomoću SUKLJUČENJA LINE

HDFS arhitektura

HDFS klaster prvenstveno se sastoji od NameNode koji upravlja datotečnim sustavom Metapodaci i DataNodes koji pohranjuju stvarne podatke .

  • NameNode: NameNode se može smatrati glavnim sustavom. Održava stablo datotečnog sustava i metapodatke za sve datoteke i direktorije prisutne u sustavu. Dvije datoteke 'Slika prostora imena' i 'zapisnik uređivanja' koriste se za pohranu podataka o metapodacima. Namenode ima znanje o svim čvorovima podataka koji sadrže blokove podataka za određenu datoteku, međutim, ne pohranjuje lokacije blokova uporno. Te se informacije obnavljaju svaki put iz čvorova podataka kada se sustav pokrene.
  • Čvor podataka: Čvorovi podataka su podređeni uređaji koji se nalaze na svakom stroju u klasteru i pružaju stvarnu pohranu. Odgovorna je za usluživanje, čitanje i pisanje zahtjeva za klijente.

Operacije čitanja / pisanja u HDFS-u rade na razini bloka. Datoteke u HDFS-u razlomljene su na dijelove veličine bloka, koji su pohranjeni kao neovisne jedinice. Zadana veličina bloka je 64 MB.

HDFS djeluje na konceptu replikacije podataka u kojem se stvara više replika podatkovnih blokova koji se distribuiraju na čvorovima kroz klaster kako bi se omogućila velika dostupnost podataka u slučaju kvara čvora.

Znaš li? Datoteka u HDFS-u, koja je manja od pojedinog bloka, ne zauzima punu pohranu bloka.

Pročitajte rad u HDFS-u

Zahtjev za čitanje podataka poslužuju HDFS, NameNode i DataNode. Nazovimo čitatelja kao 'klijenta'. Ispod dijagrama prikazan je postupak čitanja datoteka u Hadoopu.

  1. Klijent pokreće zahtjev za čitanjem pozivanjem metode 'open ()' objekta FileSystem; to je objekt tipa DistributedFileSystem .
  2. Ovaj se objekt povezuje s namenode pomoću RPC-a i dobiva podatke o metapodacima kao što su mjesta blokova datoteke. Napominjemo da su ove adrese prvih nekoliko blokova datoteke.
  3. Kao odgovor na ovaj zahtjev za metapodacima, adrese DataNodes-a koje imaju kopiju tog bloka vraćaju se natrag.
  4. Jednom kada se prime adrese DataNodes-a, objekt tipa FSDataInputStream vraća se klijentu. FSDataInputStream sadrži DFSInputStream koji se brine o interakcijama s DataNode i NameNode. U koraku 4 prikazanom u gornjem dijagramu, klijent poziva metodu 'read ()' zbog čega DFSInputStream uspostavlja vezu s prvim DataNodeom s prvim blokom datoteke.
  5. Podaci se čitaju u obliku streamova u kojima klijent više puta poziva metodu 'read ()' . Ovaj postupak rada read () nastavlja se dok ne dosegne kraj bloka.
  6. Jednom kada se dosegne kraj bloka, DFSInputStream zatvara vezu i kreće prema pronalaženju sljedećeg DataNode za sljedeći blok
  7. Kad klijent završi s čitanjem, poziva metodu close () .

Zapiši operaciju u HDFS-u

U ovom ćemo odjeljku razumjeti kako se podaci zapisuju u HDFS putem datoteka.

  1. Klijent započinje operaciju pisanja pozivanjem metode 'create ()' objekta DistributedFileSystem koji stvara novu datoteku - korak br. 1 u gornjem dijagramu.
  2. Objekt DistributedFileSystem spaja se na NameNode pomoću RPC poziva i pokreće stvaranje nove datoteke. Međutim, ova datoteka stvara operaciju koja ne povezuje nijedan blok s datotekom. Odgovornost NameNode-a je provjeriti da datoteka (koja se kreira) već ne postoji i da klijent ima ispravna dopuštenja za stvaranje nove datoteke. Ako datoteka već postoji ili klijent nema dovoljno odobrenja za stvaranje nove datoteke, tada se IOException prebacuje na klijenta. Inače, operacija uspije i NameNode kreira novi zapis za datoteku.
  3. Jednom kada se stvori novi zapis u NameNodeu, objekt tipa FSDataOutputStream vraća se klijentu. Klijent ga koristi za upisivanje podataka u HDFS. Poziva se metoda pisanja podataka (korak 3 na dijagramu).
  4. FSDataOutputStream sadrži objekt DFSOutputStream koji brine o komunikaciji s DataNodes i NameNode. Dok klijent nastavlja s upisivanjem podataka, DFSOutputStream nastavlja s kreiranjem paketa s tim podacima. Ti se paketi stavljaju u red čekanja koji se naziva DataQueue .
  5. Postoji još jedna komponenta nazvana DataStreamer koja troši ovaj DataQueue . DataStreamer također traži NameNode za dodjelu novih blokova, birajući tako poželjne DataNodes koji će se koristiti za replikaciju.
  6. Sada proces replikacije započinje stvaranjem cjevovoda pomoću DataNodes. U našem smo slučaju odabrali razinu replikacije 3 i stoga postoje 3 podatkovna čvora u cjevovodu.
  7. DataStreamer ulijeva pakete u prvi DataNode u cjevovodu.
  8. Svaki DataNode u cjevovodu pohranjuje primljeni paket i prosljeđuje ga na drugi DataNode u cjevovodu.
  9. Drugi red čekanja, 'Ack Queue' održava DFSOutputStream za spremanje paketa koji čekaju potvrdu od DataNodes.
  10. Jednom kada je potvrda za paket u redu čekanja primljena od svih DataNodes u cjevovodu, ona se uklanja iz 'Reda čekanja'. U slučaju neuspjeha bilo kojeg DataNode, paketi iz ovog reda koriste se za ponovno pokretanje operacije.
  11. Nakon što klijent završi s upisivanjem podataka, poziva metodu close () (korak 9 na dijagramu) Poziv za zatvaranje (), rezultira pražnjenjem preostalih paketa podataka na cjevovod nakon čega slijedi čekanje potvrde.
  12. Jednom kad se primi konačno potvrđivanje, kontaktira se NameNode kako bi se obavijestilo da je operacija pisanja datoteke završena.

Pristupite HDFS-u pomoću JAVA API-ja

U ovom odjeljku pokušavamo razumjeti sučelje Java koje se koristi za pristup sustavu datoteka Hadoop.

Kako bi programski komunicirao s datotečnim sustavom Hadoop-a, Hadoop nudi više JAVA klasa. Paket nazvan org.apache.hadoop.fs sadrži klase korisne u manipulaciji datotekom u datotečnom sustavu Hadoopa. Te operacije uključuju, otvaranje, čitanje, pisanje i zatvaranje. Zapravo, API datoteke za Hadoop je generički i može se proširiti tako da komunicira s drugim datotečnim sustavima koji nisu HDFS.

Programsko čitanje datoteke s HDFS-a

Objekt java.net.URL koristi se za čitanje sadržaja datoteke. Za početak moramo natjerati Javu da prepozna Hadoopovu hdfs URL shemu. To se postiže pozivanjem metode setURLStreamHandlerFactory na URL objektu i na njega se prosljeđuje instanca FsUrlStreamHandlerFactory. Ovu metodu treba izvršiti samo jednom po JVM-u, stoga je zatvorena u statički blok.

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

Ovaj se kôd otvara i čita sadržaj datoteke. Put ove datoteke na HDFS-u prenosi se programu kao argument naredbenog retka.

Pristupite HDFS-u pomoću SUKLJUČENJA LINE

Ovo je jedan od najjednostavnijih načina interakcije s HDFS-om. Sučelje naredbenog retka ima podršku za rad datotečnog sustava kao što je čitanje datoteke, stvaranje direktorija, premještanje datoteka, brisanje podataka i popis direktorija.

Možemo pokrenuti '$ HADOOP_HOME / bin / hdfs dfs -help' da bismo dobili detaljnu pomoć za svaku naredbu. Ovdje je 'dfs' naredba ljuske HDFS-a koja podržava više podnaredbi.

Neke od široko korištenih naredbi navedene su u nastavku, zajedno s nekim pojedinostima svake od njih.

1. Kopirajte datoteku iz lokalnog datotečnog sustava u HDFS

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

Ova naredba kopira datoteku temp.txt iz lokalnog datotečnog sustava na HDFS.

2. Datoteke prisutne u direktoriju možemo popisati pomoću -ls

$HADOOP_HOME/bin/hdfs dfs -ls /

Vidimo da je datoteka 'temp.txt' (ranije kopirana) navedena u direktoriju '/' .

3. Naredba za kopiranje datoteke u lokalni datotečni sustav s HDFS-a

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

Vidimo da je temp.txt kopiran u lokalni datotečni sustav.

4. Naredba za stvaranje novog direktorija

$HADOOP_HOME/bin/hdfs dfs -mkdir /mydirectory

Provjerite je li kreiran direktorij ili nije. Sada biste trebali znati kako to učiniti ;-)