Š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.
- Klijent pokreće zahtjev za čitanjem pozivanjem metode 'open ()' objekta FileSystem; to je objekt tipa DistributedFileSystem .
- 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.
- Kao odgovor na ovaj zahtjev za metapodacima, adrese DataNodes-a koje imaju kopiju tog bloka vraćaju se natrag.
- 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.
- 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.
- Jednom kada se dosegne kraj bloka, DFSInputStream zatvara vezu i kreće prema pronalaženju sljedećeg DataNode za sljedeći blok
- 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.
- Klijent započinje operaciju pisanja pozivanjem metode 'create ()' objekta DistributedFileSystem koji stvara novu datoteku - korak br. 1 u gornjem dijagramu.
- 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.
- 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).
- 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 .
- 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.
- 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.
- DataStreamer ulijeva pakete u prvi DataNode u cjevovodu.
- Svaki DataNode u cjevovodu pohranjuje primljeni paket i prosljeđuje ga na drugi DataNode u cjevovodu.
- Drugi red čekanja, 'Ack Queue' održava DFSOutputStream za spremanje paketa koji čekaju potvrdu od DataNodes.
- 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.
- 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.
- 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 ;-)