HDFS-i õpetus: Architecture, Read & Write Operamine

⚡ Nutikas kokkuvõte

HDFS on Hadoopi hajutatud salvestuskiht, mis jagab väga suured failid replikeeritud plokkideks erinevate masinate vahel, nii et üks NameNode tracks metaandmeid, samas kui paljud DataNodes pakuvad lugemis- ja kirjutamispäringuid usaldusväärselt.

  • 🔘 ArchiStruktuur: NameNode hoiab nimeruumi kujutist ja muutmislogi, samas kui DataNoded salvestavad tegelikke plokkide koopiaid.
  • ☑️ Ploki suurus: Hadoop 1.x vaikeseadeks oli 64 MB plokid; Hadoop 2.x ja 3.x vaikeseadeks oli hoopis 128 MB.
  • Replikatsioon: Vaikimisi on ploki kohta kolm koopiat, mis on jaotatud riiulite vahel, nii et riistvara rikke korral andmed kunagi ei kao.
  • 🧪 Loe tee: FSDataInputStream ja DFSInputStream hangivad plokkide asukohad NameNode'ist ja seejärel voogesitavad baite otse DataNode'idest.
  • 🛠️ Kirjutamisrada: DFSOutputStream paneb paketid järjekorda, DataStreamer loob DataNode'i konveieri ja Ack-järjekord kaitseb pakettide kadumise eest.
  • 🧭 Juurdepääsu valikud: org.apache.hadoop.fs Java Nii API kui ka hdfs dfs kest hõlmavad avamist, lugemist, kirjutamist ja sulgemist.

HDFS-i õpetus

Mis on HDFS?

HDFS on hajusfailisüsteem väga suurte andmefailide salvestamiseks, mis töötab tavaliste riistvaraklastritel. See on tõrketaluv, skaleeritav ja äärmiselt lihtne laiendada. Hadoop on komplekteeritud HDFS-iga (Hadoop Distributed File System).

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-st NameNode mis haldab failisüsteemi metaandmeid ja DataNodes mis salvestavad tegelikke andmeid.

  • NameNode: NameNode'i võib pidada süsteemi ülemaks. See haldab failisüsteemi puud ja kõigi süsteemis olevate failide ja kataloogide metaandmeid. Metaandmete teabe salvestamiseks kasutatakse kahte faili, nimeruumi kujutist ja redigeerimislogi. NameNode'il on teadmised kõigist andmesõlmedest, mis sisaldavad antud faili andmeplokke, kuid see ei salvesta plokkide asukohti püsivalt. See teave rekonstrueeritakse iga kord andmesõlmedest süsteemi käivitamisel.
  • DataNode: Andmesõlmed on alamüksused, mis asuvad klastri igas masinas ja pakuvad tegelikku salvestusruumi. Nad vastutavad klientide lugemis- ja kirjutamistaotluste teenindamise eest.

Kuna üksik NameNode oleks ainus rikkeallikas, käitavad praegused klastrid aktiivset NameNode'i koos ooterežiimis oleva NameNode'iga, mis jagab redigeerimislogi JournalNode'ide kvoorumi kaudu, kusjuures nende kahe vahel toimub automaatne tõrkesiire.

HDFS-i lugemis- ja kirjutamisoperatsioonid toimivad plokkide tasemel. HDFS-i andmefailid on jaotatud plokkide suurusteks tükkideks, mida salvestatakse iseseisvate üksustena. Hadoop 1.x-s on vaikesäte ploki suurus 64 MB. Alates Hadoop 2.x-st on vaikesäte dfs.blokisuurus on 128 MB.

HDFS toimib andmete replikatsiooni kontseptsioonil, kus luuakse mitu andmeplokkide koopiat, mis jaotatakse klastri sõlmede vahel, et tagada andmete kõrge kättesaadavus sõlme rikke korral. Vaikimisi replikatsioonitegur on kolm (dfs.replikatsioon) ja kui DataNode lõpetab südamelöökide saatmise, replikeerib NameNode oma plokid automaatselt mujale.

Kas sa tead? HDFS-fail, mis on väiksem kui üks plokk, ei hõivata ploki kogu salvestusruumi.

Lugenud OperaHDFS-is

Andmete lugemise päringut teenindavad HDFS, nimesõlm ja andmesõlmed. Nimetagem lugejat kliendiks. Allolev diagramm kujutab faili lugemise operatsiooni Hadoopis.

HDFS-i lugemisoperatsiooni andmevoog kliendi, NameNode'i ja DataNode'ide vahel

  1. Klient algatab lugemispäringu, kutsudes FileSystem objekti meetodit 'open()'; see on DistributedFileSystem tüüpi objekt.
  2. See objekt loob RPC abil ühenduse NameNode'iga ja saab metaandmete teavet, näiteks faili plokkide asukohad. Pange tähele, et need aadressid on faili esimeste plokkide aadressid.
  3. Vastuseks sellele metaandmete päringule tagastatakse selle ploki koopia omavate DataNode'ide aadressid.
  4. Kui andmesõlmede aadressid on vastu võetud, tagastatakse kliendile FSDataInputStream tüüpi objekt. FSDataInputStream sisaldab DFSInputStreami, mis hoolitseb andmesõlme ja nimesõlme interaktsiooni eest. Ülaltoodud diagrammil näidatud 4. etapis kutsub klient esile meetodi 'read()', mis paneb DFSInputStreami looma ühenduse esimese andmesõlmega, mis hoiab faili esimest plokki.
  5. Andmeid loetakse voogude kujul, kus klient kutsub korduvalt esile meetodi 'read()'. See read() operatsiooni protsess jätkub kuni ploki lõpuni.
  6. Kui ploki lõpp on jõutud, sulgeb DFSInputStream ühenduse ja liigub edasi järgmise ploki järgmise DataNode'i otsimist.
  7. Kui klient on lugemise lõpetanud, kutsub ta välja meetodi close().

Kirjutama OperaHDFS-is

Selles osas vaatleme, kuidas andmeid HDFS-i failide kaudu kirjutatakse. Allolev diagramm traces, mis kirjutavad teed.

HDFS-i kirjutamisoperatsioonide torujuhe DataQueue, DataStreamer ja Ack Queue abil

  1. Klient algatab kirjutamisoperatsiooni, kutsudes DistributedFileSystem objekti meetodit 'create()', mis loob uue faili – ülaltoodud diagrammi 1. samm.
  2. DistributedFileSystem objekt loob RPC-kutse abil ühenduse NameNode'iga ja algatab uue faili loomise. See faili loomise toiming ei seosta aga failiga ühtegi plokki. NameNode'i ülesanne on kontrollida, kas loodavat faili juba ei eksisteeri ja kas kliendil on uue faili loomiseks vajalikud õigused. Kui fail on juba olemas või kliendil pole uue faili loomiseks piisavalt õigusi, saadetakse kliendile IOException. Vastasel juhul toiming õnnestub ja NameNode loob faili jaoks uue kirje.
  3. Kui NameNode'is on uus kirje loodud, tagastatakse kliendile FSDataOutputStream tüüpi objekt. Klient kasutab seda andmete kirjutamiseks HDFS-i. Käivitatakse andmete kirjutamise meetod (diagrammil 3. samm).
  4. FSDataOutputStream sisaldab DFSOutputStream objekti, mis hoolitseb suhtluse eest andmesõlmede (DataNode) ja nimesõlmega (NameNode). Samal ajal kui klient jätkab andmete kirjutamist, loob DFSOutputStream nende andmetega pakette. Need paketid lisatakse järjekorda, mida nimetatakse andmejärjekorraks (DataQueue).
  5. Seda andmejärjekorda tarbib veel üks komponent nimega DataStreamer. DataStreamer küsib nimesõlmelt (NameNode) ka uute plokkide eraldamist, valides seeläbi replikatsiooniks sobivad andmesõlmed (DataNode).
  6. Nüüd algab replikatsiooniprotsess konveieri loomisega DataNodesi abil. Meie puhul oleme valinud replikatsioonitasemeks 3 ja seetõttu on konveieris 3 DataNode'i.
  7. DataStreamer valab paketid esimesse konveieri DataNode'i.
  8. Iga torujuhtme andmesõlm salvestab enda poolt vastuvõetud paketi ja edastab selle torujuhtme teisele andmesõlmele.
  9. Teist järjekorda, „Ack Queue”, haldab DFSOutputStream pakettide salvestamiseks, mis ootavad DataNode'ide kinnitust.
  10. 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.
  11. Pärast seda, kui klient on andmete kirjutamise lõpetanud, kutsub ta välja meetodi close() (skeemil 9. samm). Kutse meetodile close() suunab ülejäänud andmepaketid torujuhtmesse, millele järgneb kinnituse ootamine.
  12. Kui viimane kinnitus on laekunud, võetakse ühendust NameNode'iga, et teatada talle faili kirjutamise operatsiooni lõpuleviimisest.

Juurdepääs HDFS-ile, kasutades Java API

Selles osas püüame mõista, Java liides, mida kasutatakse Hadoopi failisüsteemile juurdepääsuks.

Hadoopi failisüsteemiga programmiliselt suhtlemiseks pakub Hadoop mitut Java klassid. Pakett nimega org.apache.hadoop.fs sisaldab klasse, mis on kasulikud Hadoopi failisüsteemis failiga manipuleerimiseks. Nende toimingute hulka kuuluvad avamine, lugemine, kirjutamine ja sulgemine. Hadoopi faili API on üldine ja seda saab laiendada, et see suhtleks ka teiste failisüsteemidega peale HDFS-i.

Faili lugemine HDFS-ist programmiliselt

Objekt java.net.URL kasutatakse faili sisu lugemiseks. Alustuseks peame tegema Java tunne ära Hadoopi hdf-id URL skeem. Seda tehakse hulga kutsumisegaURLStreamHandlerFactory meetod peal URL objekti ja edastades sellele FsUrlStreamHandlerFactory eksemplari. Seda meetodit tuleb käivitada ainult üks kord päevas. 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 käsurealiidese abil

See on üks lihtsamaid viise HDFS-iga suhtlemiseks. Käsurealiides toetab failisüsteemi toiminguid, nagu faili lugemine, kataloogide loomine, failide teisaldamine, andmete kustutamine ja kataloogide loetlemine.

Me saame joosta '$HADOOP_HOME/bin/hdfs dfs -help' et saada iga käsu kohta üksikasjalikku abi. Siin on 'dfs' HDFS-i kestakäsk, mis toetab mitut alamkäsku. Praegustes Hadoopi versioonides hdfs dfs on eelistatud vorm, samas kui vanem hadoop fs käsk teeb sama töö mis tahes toetatud failisüsteemi puhul.

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, nagu allolev väljund näitab.

hdfs dfs -copyFromLocal käsk kopeerib temp.txt faili HDFS-i

2. Saame kataloogis olevaid faile loetleda valikuga -ls

$HADOOP_HOME/bin/hdfs dfs -ls /

Allolevas loendis näeme faili 'temp.txt' (mis on varem kopeeritud) kaustas '/'.

hdfs dfs -ls väljund, mis kuvab HDFS-i juurkataloogis faili temp.txt

3. Käsk fail HDFS-ist kohalikku failisüsteemi kopeerida

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

See käsk peegeldab käsku -get ja aktsepteerib teise argumendina selgesõnalist kohalikku sihtkoha teed. Allolev väljund näitab kohalikku failisüsteemi kopeeritud temp.txt faili.

hdfs dfs -copyToLocal väljund, mis näitab kohalikku failisüsteemi kopeeritud temp.txt faili

4. Uue kataloogi loomise käsk

$HADOOP_HOME/bin/hdfs dfs -mkdir /mydirectory

Käsk täidetakse vaikselt, nagu allolev käsk näitab.

hdfs dfs -mkdir käsk, mis loob HDFS-is kausta /mydirectory

Kontrolli, kas kataloog on loodud või mitte. Nüüd peaksid teadma, kuidas seda teha 😉

KKK

Suured plokid hoiavad NameNode'i metaandmed väikesena ja võimaldavad kaardistajal enne uuesti otsimist lugeda pikka järjestikust baitide jada. Seega muutub ketta otsimisaeg edastusajast vaid murdosa, mis teebki täisfailide skaneerimise kiireks.

NameNode lõpetab südamelöökide vastuvõtmise, märgib sõlme surnuks ja ajastab iga replikatsioonitegurist allapoole langenud ploki uuesti replikatsiooni tervetele DataNode'idele. Kirjutamisoperatsioonid taastuvad ACK-järjekorrast, nii et klient ei kaota pakette.

Pole õigesti konfigureeritud klastris. HDFS High Availability käitab aktiivset ja ooterežiimis NameNode'i, mis jagavad muudatusi JournalNode'ide kaudu, ja ZooKeeperi tõrkesiirde kontrollerid suunavad ooterežiimi automaatselt, kui aktiivne sõlm enam ei reageeri.

Mõlemad laadivad andmed üles HDFS-i. Valik -copyFromLocal piirab allika kohaliku failisüsteemiga, samas kui -put aktsepteerib mis tahes toetatud allikat, sealhulgas teist HDFS-i teed või standardväljundit. Käitumine on muus osas identne, seega -copyFromLocal dokumenteerib lihtsalt kavatsuse.

Iga fail, kataloog ja plokk hõivab NameNode'is mälu, seega miljonid pisikesed failid kurnavad kuhja juba ammu enne, kui kettad täituvad. Nende kombineerimine järjestusfailideks, Avro, ORC, Parquet või HAR arhiivideks muudab metaandmed hallatavaks.

Replikatsioon säilitab kolm täiskoopiat, mis maksab 200 protsenti rohkem salvestusruumi. Hadoop 3-s lisatud kustutuskodeerimine salvestab hoopis pariteedirakke ja saavutab sarnase vastupidavuse umbes 50 protsendilise üldkuluga, vahetades odavama salvestusruumi taastamisperioodil kõrgemate protsessori- ja võrgukulude vastu.

NameNode'i auditilogide ja DataNode'i mõõdikute põhjal treenitud masinõppemudelid suudavad ennustada mahutavuse ammendumist, märgistada töökorras plokke ja tuvastada rikkis kettaid enne nende väljalangemist. Juurdepääsumustrite anomaaliate tuvastamine toob varakult esile ka tõrkuvaid töid.

Copilot viib tuttavad org.apache.hadoop.fs mallid kiiresti lõpule, näiteks FileSystem.get, FSDataInputStream tsüklid ja IOUtils.copyBytes päringud. Kontrollige alati genereeritud koodi kasutatava Hadoopi versiooni suhtes, kuna API nimed ja aegunud meetodid erinevad Hadoop 2.x ja 3.x vahel märgatavalt.

Võta see postitus kokku järgmiselt: