HDFS-i õpetus: Architecture, Read & Write Operakasutamist Java API
Mis on HDFS?
HDFS on hajutatud failisüsteem väga suurte andmefailide salvestamiseks, mis töötab kaubariistvara klastrites. See on veakindel, skaleeritav ja väga lihtsalt laiendatav. Hadoop on komplektis HDFS (Hadoopi hajutatud failisüsteemid).
Kui andmed ületavad ühe füüsilise masina salvestusmahtu, on oluline jagada need mitme erineva masina vahel. Failisüsteemi, mis haldab salvestusspetsiifilisi toiminguid masinate võrgus, nimetatakse hajutatud failisüsteemiks. HDFS on üks selline tarkvara.
HDFS Architektuur
HDFS-klaster koosneb peamiselt a NameNode mis haldab failisüsteemi Metaandmed ja DataNodes mis talletab tegelikud andmed.
- NameNode: NameNode’i võib pidada süsteemi meistriks. See säilitab kõigi süsteemis olevate failide ja kataloogide failisüsteemi puud ja metaandmeid. Kaks faili "Nimeruumi kujutis" ja "redigeeri logi" kasutatakse metaandmete salvestamiseks. Namenode teab kõiki antud faili andmeplokke sisaldavad andmesõlmed, kuid see ei salvesta pidevalt plokkide asukohti. See teave rekonstrueeritakse iga kord andmesõlmedest, kui süsteem käivitub.
- DataNode: DataNodes on alluvad, mis asuvad igas klastri masinas ja pakuvad tegelikku salvestusruumi. Ta vastutab klientide päringute teenindamise, lugemise ja kirjutamise eest.
HDFS-i lugemis-/kirjutustoimingud toimivad ploki tasemel. HDFS-i andmefailid jaotatakse plokisuurusteks tükkideks, mis salvestatakse iseseisvate üksustena. Vaikimisi ploki suurus on 64 MB.
HDFS töötab andmete replikatsiooni kontseptsioonil, mille puhul luuakse mitu andmeplokkide koopiat, mis jaotatakse sõlmedesse üle klastri, et võimaldada andmete kõrget kättesaadavust sõlme rikke korral.
Kas sa tead? HDFS-fail, mis on väiksem kui üks plokk, ei hõivata ploki kogu salvestusruumi.
Lugenud OperaHDFS-is
Andmete lugemise taotlust teenindavad HDFS, NameNode ja DataNode. Nimetagem lugejat "kliendiks". Allolev diagramm kujutab faili lugemise toimingut hadoop.
- Klient algatab lugemistaotluse helistades 'open()' failisüsteemi objekti meetod; see on tüüpi objekt DistributedFileSystem.
- See objekt loob ühenduse nimesõlmega RPC abil ja hangib metaandmete teavet, näiteks faili plokkide asukohad. Pange tähele, et need aadressid koosnevad faili esimestest plokkidest.
- Vastuseks sellele metaandmete päringule tagastatakse selle ploki koopiat omavate DataNode'ide aadressid.
-
Kui DataNodesi aadressid on vastu võetud, on tüüpi objekt FSDataInputStream tagastatakse kliendile. FSDataInputStream sisaldab DFSInputStream mis hoolitseb interaktsioonide eest DataNode'i ja NameNode'iga. Ülaltoodud diagrammil näidatud etapis 4 käivitab klient 'loe()' meetod, mis põhjustab DFSInputStream ühenduse loomiseks esimese DataNode'iga faili esimese plokiga.
-
Andmeid loetakse voogude kujul, kus klient kutsub 'loe()' meetodit korduvalt. See protsess loe () toiming jätkub, kuni jõuab ploki lõpuni.
- Kui ploki lõpp on saavutatud, sulgeb DFSInputStream ühenduse ja liigub järgmise ploki jaoks järgmise DataNode'i leidmiseks
- Kui klient on lugemise lõpetanud, helistab ta sulgemine () meetod.
Kirjutama OperaHDFS-is
Selles jaotises mõistame, kuidas andmeid failide kaudu HDFS-i kirjutatakse.
- Klient alustab kirjutamistoimingut, kutsudes DistributedFileSystem objekti meetodi "create()", mis loob uue faili – samm nr. 1 ülaltoodud diagrammil.
- DistributedFileSystem objekt loob ühenduse NameNode'iga RPC-kõne abil ja algatab uue faili loomise. Kuid see fail loob toiming ei seosta failiga ühtegi plokki. NameNode vastutab selle eest, et faili (mida luuakse) pole juba olemas ja kliendil on uue faili loomiseks õiged õigused. Kui fail on juba olemas või kliendil pole uue faili loomiseks piisavaid õigusi, siis IOE erand visatakse kliendile. Vastasel juhul toiming õnnestub ja NameNode loob faili jaoks uue kirje.
- Kui NameNode'is on loodud uus kirje, tagastatakse kliendile FSDataOutputStream tüüpi objekt. Klient kasutab seda andmete HDFS-i kirjutamiseks. Käivitatakse andmete kirjutamise meetod (skeemi 3. samm).
- FSDataOutputStream sisaldab DFSOutputStream objekti, mis jälgib sidet DataNodesi ja NameNode'iga. Kuni klient jätkab andmete kirjutamist, DFSOutputStream jätkab nende andmetega pakettide loomist. Need paketid pannakse järjekorda, mida nimetatakse DataQueue.
- On veel üks komponent nimega DataStreamer mis seda tarbib DataQueue. DataStreamer küsib ka NameNode'ilt uute plokkide eraldamist, valides seeläbi replikatsiooniks kasutatavad soovitud DataNode'id.
- Nüüd algab replikatsiooniprotsess konveieri loomisega DataNodesi abil. Meie puhul oleme valinud replikatsioonitasemeks 3 ja seetõttu on konveieris 3 DataNode'i.
- DataStreamer valab paketid esimesse konveieri DataNode'i.
- Iga konveieri andmesõlm salvestab selle vastuvõetud paketi ja edastab selle konveieri teisele DataNode'ile.
- Teist järjekorda, 'kinnitusjärjekorda' haldab DFSOutputStream, et salvestada pakette, mis ootavad DataNodes'i kinnitust.
- Kui kõikidelt konveieril olevatelt andmesõlmedelt on saadud kinnitus järjekorras oleva paketi kohta, eemaldatakse see kinnitusjärjekorrast. DataNode'i tõrke korral kasutatakse selle järjekorra pakette toimingu taasalustamiseks.
- Kui klient on andmete kirjutamise lõpetanud, kutsub ta välja meetodi close() (samm 9 diagrammil) Call to close(), mille tulemuseks on järelejäänud andmepakettide konveierisse viimine, millele järgneb kinnituse ootamine.
- Pärast lõpliku kinnituse saamist võetakse NameNode'iga ühendust ja teatatakse, et faili kirjutamise toiming on lõppenud.
Juurdepääs HDFS-ile JAVA API abil
Selles jaotises püüame mõista Java liides, mida kasutatakse Hadoopi failisüsteemile juurdepääsuks.
Hadoopi failisüsteemiga programmiliseks suhtlemiseks pakub Hadoop mitut JAVA klassi. Pakett nimega org.apache.hadoop.fs sisaldab klasse, mis on kasulikud Hadoopi failisüsteemis oleva failiga manipuleerimiseks. Need toimingud hõlmavad avamist, lugemist, kirjutamist ja sulgemist. Tegelikult on Hadoopi faili API üldine ja seda saab laiendada, et suhelda muude failisüsteemidega peale HDFS-i.
Faili lugemine HDFS-ist programmiliselt
Objekt java.net.URL kasutatakse faili sisu lugemiseks. Alustuseks peame tegema Java tunnevad ära Hadoopi hdfs-i URL-i skeemi. Seda tehakse helistades setURLStreamHandlerFactory meetod URL-i objektil ja sellele edastatakse FsUrlStreamHandlerFactory eksemplar. Seda meetodit tuleb kasutada ainult üks kord FMV, seega on see suletud staatilisesse plokki.
Näidiskood on -
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); } } }
See kood avab ja loeb faili sisu. Selle faili tee HDFS-is edastatakse programmile käsurea argumendina.
Juurdepääs HDFS-ile, kasutades KÄSURALIIDES
See on üks lihtsamaid viise HDFS-iga suhtlemiseks. Käsurea liides toetab failisüsteemi toiminguid, nagu faili lugemine, kataloogide loomine, failide teisaldamine, andmete kustutamine ja kataloogide loend.
Me saame joosta '$HADOOP_HOME/bin/hdfs dfs -help' et saada üksikasjalikku abi iga käsu kohta. Siin "dfs" on HDFS-i shellikäsk, mis toetab mitut alamkäsku.
Mõned laialdaselt kasutatavad käsud on loetletud allpool koos nende üksikasjadega.
1. Kopeerige fail kohalikust failisüsteemist HDFS-i
$HADOOP_HOME/bin/hdfs dfs -copyFromLocal temp.txt /
See käsk kopeerib faili temp.txt kohalikust failisüsteemist HDFS-i.
2. Saame kataloogis olevaid faile loetleda kasutades -ls
$HADOOP_HOME/bin/hdfs dfs -ls /
Näeme faili 'temp.txt' (varem kopeeritud) on loetletud all '/' kataloog.
3. Käsk fail HDFS-ist kohalikku failisüsteemi kopeerida
$HADOOP_HOME/bin/hdfs dfs -copyToLocal /temp.txt
Me näeme temp.txt kopeeritud kohalikku failisüsteemi.
4. Uue kataloogi loomise käsk
$HADOOP_HOME/bin/hdfs dfs -mkdir /mydirectory
Kontrollige, kas kataloog on loodud või mitte. Nüüd peaksite teadma, kuidas seda teha 😉