Vodič za HDFS: Architekstura, Čitaj i piši Operakorištenje Java API
Što je HDFS?
HDFS je distribuirani datotečni sustav za pohranu vrlo velikih podatkovnih datoteka, koji radi na klasterima standardnog hardvera. Tolerantan je na pogreške, skalabilan je i iznimno jednostavan za proširenje. Hadoop dolazi u paketu sa HDFS (Hadoop distribuirani datotečni sustavi).
Kada podaci premašuju kapacitet pohrane na jednom fizičkom stroju, postaje neophodno podijeliti ih na više zasebnih strojeva. Datotečni sustav koji upravlja specifičnim operacijama pohranjivanja preko mreže strojeva naziva se distribuirani datotečni sustav. HDFS je jedan takav softver.
HDFS Architektura
HDFS klaster prvenstveno se sastoji od a NameNode koji upravlja datotečnim sustavom Metadata a DataNodes koji pohranjuje stvarni podaci.
- NameNode: NameNode se može smatrati gospodarom sustava. Održava stablo datotečnog sustava i metapodatke za sve datoteke i direktorije prisutne u sustavu. Dvije datoteke 'Slika prostora imena' i 'uređivanje dnevnika' koriste se za pohranu metapodataka. Namenode ima saznanja o svim podatkovnim čvorovima koji sadrže podatkovne blokove za određenu datoteku, međutim, ne pohranjuje trajno lokacije blokova. Ove informacije se rekonstruiraju svaki put iz podatkovnih čvorova kada se sustav pokrene.
- DataNode: DataNodes su podređeni uređaji koji se nalaze na svakom računalu u klasteru i pružaju stvarnu pohranu. Odgovoran je za posluživanje, čitanje i pisanje zahtjeva za klijente.
Operacije čitanja/pisanja u HDFS-u rade na razini bloka. Podatkovne datoteke u HDFS-u podijeljene su u dijelove veličine bloka koji se pohranjuju kao neovisne jedinice. Zadana veličina bloka je 64 MB.
HDFS radi na konceptu replikacije podataka pri čemu se stvaraju više replika blokova podataka koji se distribuiraju na čvorove kroz klaster kako bi se omogućila visoka dostupnost podataka u slučaju kvara čvora.
Znate li? Datoteka u HDFS-u, koja je manja od jednog bloka, ne zauzima punu pohranu bloka.
Čitaj Operacija u HDFS-u
Zahtjev za čitanje podataka poslužuje HDFS, NameNode i DataNode. Nazovimo čitatelja 'klijentom'. Donji dijagram prikazuje operaciju čitanja datoteke Hadoop.
- Klijent pozivom inicira zahtjev za čitanje 'otvoren()' metoda FileSystem objekta; to je objekt tipa Distribuirani datotečni sustav.
- Ovaj se objekt povezuje s namenode pomoću RPC-a i dobiva informacije o metapodacima kao što su lokacije blokova datoteke. Imajte na umu da su ove adrese prvih nekoliko blokova datoteke.
- Kao odgovor na ovaj zahtjev za metapodatke, vraćaju se adrese čvorova podataka koji imaju kopiju tog bloka.
-
Nakon što su primljene adrese čvorova podataka, objekt tipa FSDataInputStream se vraća klijentu. FSDataInputStream sadrži DFSInputStream koji se brine za interakcije s DataNode i NameNode. U koraku 4 prikazanom na gornjem dijagramu, klijent poziva 'čitati()' metoda koja uzrokuje DFSInputStream uspostaviti vezu s prvim DataNodeom s prvim blokom datoteke.
-
Podaci se čitaju u obliku tokova koje klijent poziva 'čitati()' metoda više puta. Ovaj proces od čitati() operacija se nastavlja dok ne dođe do kraja bloka.
- Kada se dosegne kraj bloka, DFSInputStream zatvara vezu i nastavlja locirati sljedeći DataNode za sljedeći blok
- Nakon što je klijent završio s očitavanjem, on zove zatvoriti () metoda.
Pisati Operacija u HDFS-u
U ovom odjeljku ćemo 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 povezuje se s NameNode pomoću RPC poziva i pokreće stvaranje nove datoteke. Međutim, ova operacija stvaranja datoteke ne pridružuje nikakve blokove datoteci. Odgovornost je NameNode provjeriti da datoteka (koja se stvara) već ne postoji i da klijent ima ispravna dopuštenja za stvaranje nove datoteke. Ako datoteka već postoji ili klijent nema dovoljno dopuštenja za stvaranje nove datoteke, onda IOException baca se klijentu. U suprotnom, operacija uspijeva i NameNode stvara novi zapis za datoteku.
- Nakon što se stvori novi zapis u NameNode, objekt tipa FSDataOutputStream vraća se klijentu. Klijent ga koristi za upisivanje podataka u HDFS. Poziva se metoda upisa podataka (korak 3 u dijagramu).
- FSDataOutputStream sadrži DFSOutputStream objekt koji brine o komunikaciji s DataNodes i NameNode. Dok klijent nastavlja pisati podatke, DFSOutputStream nastavlja kreirati pakete s ovim podacima. Ovi paketi se stavljaju u red čekanja koji se naziva as DataQueue.
- Postoji još jedna komponenta tzv DataStreamer koja ovo troši DataQueue. DataStreamer također traži od NameNode dodjelu novih blokova odabirući na taj način željene DataNode koji će se koristiti za replikaciju.
- Sada, proces replikacije počinje stvaranjem cjevovoda pomoću DataNodes. U našem slučaju, odabrali smo razinu replikacije 3 i stoga postoje 3 podatkovna čvora u cjevovodu.
- DataStreamer ubacuje pakete u prvi DataNode u cjevovodu.
- Svaki DataNode u cjevovodu pohranjuje paket koji je primio i prosljeđuje ga drugom DataNodeu u cjevovodu.
- Još jedan red čekanja, 'Ack Queue' održava DFSOutputStream za pohranu paketa koji čekaju potvrdu od DataNodes.
- Nakon što je primljena potvrda za paket u redu čekanja od svih DataNodes u cjevovodu, on se uklanja iz 'Ack Queuea'. U slučaju bilo kakvog kvara DataNode, paketi iz ovog reda čekanja koriste se za ponovno pokretanje operacije.
- Nakon što klijent završi s pisanjem podataka, poziva metodu close() (korak 9 u dijagramu). Poziv za close(), rezultira ispiranjem preostalih paketa podataka u cjevovod nakon čega slijedi čekanje potvrde.
- Nakon što se primi konačna potvrda, kontaktira se NameNode da mu se kaže da je operacija pisanja datoteke dovršena.
Pristupite HDFS-u koristeći JAVA API
U ovom odjeljku pokušavamo razumjeti Java sučelje koje se koristi za pristup Hadoop-ovom datotečnom sustavu.
Za programsku interakciju s Hadoopovim datotečnim sustavom, Hadoop nudi više klasa JAVA. Paket pod nazivom org.apache.hadoop.fs sadrži klase korisne u manipuliranju datotekom u Hadoop datotečnom sustavu. Ove operacije uključuju otvaranje, čitanje, pisanje i zatvaranje. Zapravo, datotečni API za Hadoop je generički i može se proširiti za interakciju s drugim datotečnim sustavima osim HDFS-a.
Čitanje datoteke iz HDFS-a, programski
Objekt java.net.URL koristi se za čitanje sadržaja datoteke. Za početak, moramo napraviti Java prepoznati Hadoopove HDF-ove URL shema. To se radi pozivom postavitiURLTvornica rukovatelja streamom metoda na URL objekt i njemu se prosljeđuje instanca FsUrlStreamHandlerFactory. Ovu metodu treba izvršiti samo jednom po JVM, stoga je zatvoren 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 kod otvara i čita sadržaj datoteke. Put ove datoteke na HDFS-u prosljeđuje se programu kao argument naredbenog retka.
Pristup HDFS-u pomoću COMMAND-LINE SUČELJE
Ovo je jedan od najjednostavnijih načina interakcije s HDFS-om. Sučelje naredbenog retka ima podršku za operacije datotečnog sustava kao što su čitanje datoteke, stvaranje direktorija, premještanje datoteka, brisanje podataka i popis direktorija.
Možemo trčati '$HADOOP_HOME/bin/hdfs dfs -pomoć' kako biste dobili detaljnu pomoć za svaku naredbu. Ovdje, 'dfs' je shell naredba HDFS-a koja podržava više podnaredbi.
Neke od široko korištenih naredbi navedene su u nastavku zajedno s nekim detaljima 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 u HDFS.
2. Možemo ispisati datoteke prisutne u direktoriju pomoću -ls
$HADOOP_HOME/bin/hdfs dfs -ls /
Možemo vidjeti datoteku 'temp.txt' (kopirano ranije) navedeno pod '/' katalog.
3. Naredba za kopiranje datoteke u lokalni datotečni sustav iz HDFS-a
$HADOOP_HOME/bin/hdfs dfs -copyToLocal /temp.txt
Možemo vidjeti temp.txt kopirati u lokalni datotečni sustav.
4. Naredba za stvaranje novog imenika
$HADOOP_HOME/bin/hdfs dfs -mkdir /mydirectory
Provjerite je li imenik kreiran ili ne. Sada biste trebali znati kako to učiniti 😉




