Kaj je HDFS?
HDFS je porazdeljeni datotečni sistem za shranjevanje zelo velikih podatkovnih datotek, ki deluje na grozdih blagovne strojne opreme. Je odporen na napake, razširljiv in zelo preprost za razširitev. Hadoop je priložen HDFS ( Hadoop Distributed File Systems ).
Ko podatki presežejo kapaciteto shranjevanja na enem fizičnem računalniku, je nujno, da jih razdelimo na več ločenih strojev. Datotečni sistem, ki upravlja specifične operacije shranjevanja v omrežju strojev, se imenuje porazdeljeni datotečni sistem. HDFS je ena takih programov.
V tej vadnici se bomo naučili,
- Kaj je HDFS?
- Arhitektura HDFS
- Preberite Operation
- Napiši operacijo
- Dostop do HDFS z uporabo API-ja JAVA
- Dostopajte do HDFS z uporabo UKAZOVALNEGA VMESNIKA
Arhitektura HDFS
Skupina HDFS je v glavnem sestavljena iz NameNode, ki upravlja metapodatke datotečnega sistema, in DataNodes, ki hrani dejanske podatke .
- NameNode: NameNode se lahko šteje za nadrejenega sistema. Vzdržuje drevo datotečnega sistema in metapodatke za vse datoteke in imenike, ki so v sistemu. Dve datoteki 'Slika imenskega prostora' in 'dnevnik urejanja' se uporabljata za shranjevanje informacij o metapodatkih. Namenode pozna vsa podatkovna vozlišča, ki vsebujejo podatkovne bloke za določeno datoteko, vendar lokacij blokov ne shranjuje trajno. Te informacije se ob zagonu sistema obnovijo vsakič iz podatkovnih vozlišč.
- DataNode: DataNode so podrejeni, ki se nahajajo na vsaki napravi v gruči in zagotavljajo dejansko shrambo. Odgovoren je za vročanje, branje in pisanje zahtev za stranke.
Operacije branja / pisanja v HDFS delujejo na ravni blokov. Podatkovne datoteke v HDFS so razdeljene na koščke velikosti bloka, ki so shranjeni kot neodvisne enote. Privzeta velikost bloka je 64 MB.
HDFS deluje na konceptu podvajanja podatkov, pri katerem se ustvari več kopij podatkovnih blokov in se razdeli na vozlišča po celotni gruči, da se omogoči visoka razpoložljivost podatkov v primeru okvare vozlišča.
Ali veš? Datoteka v HDFS, ki je manjša od posameznega bloka, ne zaseda celotnega prostora v bloku.
Preberite delovanje v HDFS
Zahtevo za branje podatkov strežejo HDFS, NameNode in DataNode. Pokličimo bralca kot 'stranko'. Spodnji diagram prikazuje operacijo branja datotek v Hadoopu.
- Odjemalec sproži zahtevo za branje s klicem metode 'open ()' predmeta FileSystem; gre za objekt tipa DistributedFileSystem .
- Ta objekt se poveže z namenode z uporabo RPC in dobi informacije o metapodatkih, kot so lokacije blokov datoteke. Upoštevajte, da so ti naslovi prvih nekaj blokov datoteke.
- V odgovor na to zahtevo za metapodatke se naslovi DataNodes, ki imajo kopijo tega bloka, vrnejo nazaj.
- Ko prejmejo naslove DataNodes, se odjemalcu vrne objekt tipa FSDataInputStream . FSDataInputStream vsebuje DFSInputStream, ki skrbi za interakcije z DataNode in NameNode. V koraku 4, prikazanem v zgornjem diagramu, odjemalec prikliče metodo 'read ()', zaradi katere DFSInputStream vzpostavi povezavo s prvim DataNode s prvim blokom datoteke.
- Podatki se berejo v obliki tokov, pri čemer odjemalec večkrat prikliče metodo 'read ()' . Ta postopek branja () se nadaljuje, dokler ne doseže konca bloka.
- Ko je konec bloka dosežen, DFSInputStream zapre povezavo in nadaljuje, da poišče naslednje DataNode za naslednji blok
- Ko stranka konča z branjem, pokliče metodo close () .
Zapiši operacijo v HDFS
V tem poglavju bomo razumeli, kako se podatki zapisujejo v HDFS prek datotek.
- Odjemalec začne postopek pisanja s klicanjem metode 'create ()' predmeta DistributedFileSystem, ki ustvari novo datoteko - korak št. 1 v zgornjem diagramu.
- Objekt DistributedFileSystem se s klicem RPC poveže z NameNode in sproži ustvarjanje nove datoteke. Vendar ta datoteka ustvarja operacijo in z datoteko ne poveže nobenega bloka. NameNode je odgovoren, da preveri, ali datoteka (ki se ustvarja) že ne obstaja in ima odjemalec pravilna dovoljenja za ustvarjanje nove datoteke. Če datoteka že obstaja ali odjemalec nima zadostnega dovoljenja za ustvarjanje nove datoteke, se IOException vrne na odjemalca. V nasprotnem primeru operacija uspe in NameNode ustvari nov zapis za datoteko.
- Ko se ustvari nov zapis v NameNode, se odjemalcu vrne objekt tipa FSDataOutputStream. Naročnik ga uporablja za zapisovanje podatkov v HDFS. Prikliče se metoda zapisovanja podatkov (korak 3 v diagramu).
- FSDataOutputStream vsebuje objekt DFSOutputStream, ki skrbi za komunikacijo z DataNodes in NameNode. Medtem ko odjemalec nadaljuje s pisanjem podatkov, DFSOutputStream še naprej ustvarja pakete s temi podatki. Ti paketi so v čakalni vrsti, ki se imenuje DataQueue .
- Obstaja še ena komponenta, imenovana DataStreamer, ki porabi to DataQueue . DataStreamer prosi tudi NameNode za dodelitev novih blokov, s čimer izbere zaželena DataNodes, ki se uporabljajo za replikacijo.
- Zdaj se postopek replikacije začne z ustvarjanjem cevovoda z uporabo DataNodes. V našem primeru smo izbrali stopnjo replikacije 3, zato so v pripravi 3 podatkovna vozlišča.
- DataStreamer vlije pakete v prvo DataNode v cevovodu.
- Vsako DataNode v cevovodu shrani paket, ki ga je prejel, in ga posreduje drugemu DataNode v cevovodu.
- DFSOutputStream vzdržuje še eno vrsto, »Ack Queue«, da shrani pakete, ki čakajo na potrditev iz DataNodes.
- Ko je potrdilo za paket v čakalni vrsti prejeto iz vseh DataNodes v cevovodu, se odstrani iz "Čakalne vrste". V primeru okvare DataNode se paketi iz te čakalne vrste uporabijo za ponovno uvedbo operacije.
- Ko konča s pisanjem podatkov, odjemalec pokliče metodo close () (korak 9 v diagramu) Call to close (), povzroči splakovanje preostalih podatkovnih paketov v cevovod, ki mu sledi čakanje na potrditev.
- Ko prejmete končno potrdilo, se obrnete na NameNode in mu sporočite, da je operacija pisanja datoteke končana.
Dostop do HDFS z uporabo API-ja JAVA
V tem razdelku skušamo razumeti vmesnik Java, ki se uporablja za dostop do datotečnega sistema Hadoop.
Za programsko interakcijo z datotečnim sistemom Hadoop Hadoop ponuja več razredov JAVA. Paket z imenom org.apache.hadoop.fs vsebuje razrede, uporabne pri manipulaciji z datoteko v datotečnem sistemu Hadoop. Te operacije vključujejo odpiranje, branje, pisanje in zapiranje. Pravzaprav je datotečni API za Hadoop generičen in ga je mogoče razširiti tako, da komunicira z drugimi datotečnimi sistemi, ki niso HDFS.
Programsko branje datoteke iz HDFS
Objekt java.net.URL se uporablja za branje vsebine datoteke. Za začetek moramo omogočiti, da Java prepozna Hadoopovo shemo URL-jev hdfs. To se naredi s klicem metode setURLStreamHandlerFactory na objektu URL in se ji posreduje primerek FsUrlStreamHandlerFactory. To metodo je treba izvesti samo enkrat na JVM, zato je zaprta v statični blok.
Primer kode 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);}}}
Ta koda odpre in prebere vsebino datoteke. Pot te datoteke na HDFS se programu posreduje kot argument ukazne vrstice.
Dostopajte do HDFS z uporabo UKAZOVALNEGA VMESNIKA
To je eden najpreprostejših načinov interakcije s HDFS. Vmesnik ukazne vrstice ima podporo za operacije datotečnega sistema, kot je branje datoteke, ustvarjanje imenikov, premikanje datotek, brisanje podatkov in seznam imenikov.
Zaženemo lahko '$ HADOOP_HOME / bin / hdfs dfs -help', da dobimo podrobno pomoč za vsak ukaz. Tu je 'dfs' ukaz lupine HDFS, ki podpira več podkomand.
Nekateri pogosto uporabljeni ukazi so navedeni spodaj, skupaj z nekaterimi podrobnostmi o vsakem od njih.
1. Kopirajte datoteko iz lokalnega datotečnega sistema v HDFS
$HADOOP_HOME/bin/hdfs dfs -copyFromLocal temp.txt /
Ta ukaz kopira datoteko temp.txt iz lokalnega datotečnega sistema v HDFS.
2. Datoteke, ki so prisotne v imeniku, lahko navedemo s pomočjo -ls
$HADOOP_HOME/bin/hdfs dfs -ls /
Vidimo, da je datoteka 'temp.txt' (prej kopirana) navedena v imeniku '/' .
3. Ukaz za kopiranje datoteke v lokalni datotečni sistem iz HDFS
$HADOOP_HOME/bin/hdfs dfs -copyToLocal /temp.txt
Vidimo, da je temp.txt kopiran v lokalni datotečni sistem.
4. Ukaz za ustvarjanje novega imenika
$HADOOP_HOME/bin/hdfs dfs -mkdir /mydirectory
Preverite, ali je imenik ustvarjen ali ne. Zdaj bi morali vedeti, kako to storiti ;-)