HDFS opetusohjelma: Architecture, Read & Write OperaTUKSEN

โšก ร„lykรคs yhteenveto

HDFS on Hadoopin hajautettu tallennuskerros, joka jakaa erittรคin suuret tiedostot replikoituihin lohkoihin eri hyรถdykekoneiden vรคlillรค siten, ettรค yksi NameNode tracks metatietoja, kun taas monet DataNodes-solmut palvelevat luku- ja kirjoituspyyntรถjรค luotettavasti.

  • ๐Ÿ”˜ Archirakenne: NameNode sisรคltรครค nimiavaruuden kuvan ja muokkauslokin, kun taas DataNode tallentaa varsinaiset lohkoreplikat.
  • โ˜‘๏ธ Lohkon koko: Hadoop 1.x:n oletusarvoinen lohkokoko on 64 Mt; Hadoop 2.x:n ja 3.x:n oletusarvoinen lohkokoko on sen sijaan 128 Mt.
  • โœ… replikointi: Oletusarvoisesti lohkoa kohden on kolme kopiota, jotka on jaettu rรคkkien eri osille, joten laitteistovian sattuessa tietoja ei koskaan menetetรค.
  • ๐Ÿงช Lue polku: FSDataInputStream ja DFSInputStream hakevat lohkojen sijainnit NameNode-solmusta ja suoratoistavat sitten tavuja suoraan DataNode-solmuista.
  • ๐Ÿ› ๏ธ Kirjoituspolku: DFSOutputStream jonottaa paketteja, DataStreamer rakentaa DataNode-putken ja Ack-jono suojaa pakettien katoamiselta.
  • ๐Ÿงญ Pรครคsyvaihtoehdot: org.apache.hadoop.fs Java Sekรค API ettรค hdfs dfs -komentotulkki kattavat avaamisen, lukemisen, kirjoittamisen ja sulkemisen.

HDFS opetusohjelma

Mikรค on HDFS?

HDFS on hajautettu tiedostojรคrjestelmรค erittรคin suurten datatiedostojen tallennukseen, ja se toimii useimpien peruslaitteistojen klustereissa. Se on vikasietoinen, skaalautuva ja erittรคin helppo laajentaa. Hadoop toimitetaan HDFS:n (Hadoop Distributed File System) mukana.

Kun data ylittรครค yhden fyysisen koneen tallennuskapasiteetin, on vรคlttรคmรคtรถntรค jakaa se useille eri koneille. Tiedostojรคrjestelmรครค, joka hallitsee tallennuskohtaisia โ€‹โ€‹toimintoja koneverkon yli, kutsutaan hajautetuksi tiedostojรคrjestelmรคksi. HDFS on yksi tรคllainen ohjelmisto.

HDFS Archirakenne

HDFS-klusteri koostuu pรครคasiassa NameNode joka hallinnoi tiedostojรคrjestelmรคn metatietoja ja DataNodes jotka tallentavat varsinaisen datan.

  • NameNode: NameNode-solmua voidaan pitรครค jรคrjestelmรคn pรครคsolmuna. Se yllรคpitรครค tiedostojรคrjestelmรคpuuta ja kaikkien jรคrjestelmรคssรค olevien tiedostojen ja hakemistojen metatietoja. Kahteen tiedostoon, 'nimiavaruuden kuvaan' ja 'muokkauslokiin', tallennetaan metatiedot. NameNode-solmulla on tiedot kaikista tietyn tiedoston datalohkoja sisรคltรคvistรค DataNode-solmuista, mutta se ei tallenna lohkojen sijainteja pysyvรคsti. Nรคmรค tiedot rekonstruoidaan aina DataNode-solmuista jรคrjestelmรคn kรคynnistyessรค.
  • DataNode: DataNode-solmut ovat klusterin jokaisella koneella sijaitsevia orjasolmuja, jotka tarjoavat varsinaisen tallennustilan. Ne vastaavat asiakkaiden luku- ja kirjoituspyyntรถjen kรคsittelystรค.

Koska yksittรคinen NameNode olisi ainoa vikaantumispiste, nykyisissรค klustereissa kรคytetรครคn aktiivista NameNodea rinnakkain valmiustilassa olevan NameNoden kanssa. Tรคmรค Node jakaa muokkauslokin JournalNode-koorumin kautta, ja nรคiden kahden vรคlillรค tapahtuu automaattinen vikasietoisuus.

HDFS:n luku- ja kirjoitustoiminnot toimivat lohkotasolla. HDFS:n datatiedostot jaetaan lohkon kokoisiin osiin, jotka tallennetaan itsenรคisinรค yksikรถinรค. Oletuslohkon koko on 64 Mt Hadoop 1.x:ssรค. Hadoop 2.x:stรค eteenpรคin oletusarvo dfs.blocksize on 128 Mt.

HDFS toimii datan replikoinnin konseptilla, jossa datalohkoista luodaan useita kopioita, jotka jaetaan solmuille koko klusterissa, jotta datan saatavuus olisi korkeaa solmun vikaantumisen sattuessa. Oletusreplikointikerroin on kolme (dfs.replication), ja kun DataNode lopettaa sykkeiden lรคhettรคmisen, NameNode replikoi lohkonsa automaattisesti uudelleen muualle.

Tiedรคtkรถ? HDFS-tiedosto, joka on pienempi kuin yksi lohko, ei vie lohkon tรคyttรค tallennustilaa.

Lue OperaHDFS:ssรค

Tiedonlukupyyntรถรค kรคsittelevรคt HDFS, NameNode ja DataNode-solmut. Kutsutaan lukijaa "asiakkaaksi". Alla oleva kaavio kuvaa tiedostonlukuoperaatiota Hadoopissa.

HDFS-lukuoperaation datavirta asiakkaan, NameNoden ja DataNoden vรคlillรค

  1. Asiakas aloittaa lukupyynnรถn kutsumalla FileSystem-objektin 'open()'-metodia; kyseessรค on DistributedFileSystem-tyyppinen objekti.
  2. Tรคmรค objekti muodostaa yhteyden NameNodeen RPC:n avulla ja hakee metatietotietoja, kuten tiedoston lohkojen sijainnit. Huomaa, ettรค nรคmรค osoitteet ovat tiedoston muutaman ensimmรคisen lohkon osoitteet.
  3. Vastauksena tรคhรคn metatietopyyntรถรถn palautetaan niiden DataNode-solmujen osoitteet, joilla on kyseisen lohkon kopio.
  4. Kun DataNode-solmujen osoitteet on vastaanotettu, asiakkaalle palautetaan FSDataInputStream-tyyppinen objekti. FSDataInputStream sisรคltรครค DFSInputStream-objektin, joka hoitaa vuorovaikutuksen DataNode- ja NameNode-solmujen kanssa. Yllรค olevan kaavion vaiheessa 4 asiakas kutsuu 'read()'-metodia, joka saa DFSInputStreamin muodostamaan yhteyden ensimmรคiseen DataNode-solmuun, joka sisรคltรครค tiedoston ensimmรคisen lohkon.
  5. Data luetaan virroina, joissa asiakas kutsuu 'read()'-metodia toistuvasti. Tรคmรค read()-operaatio jatkuu, kunnes se saavuttaa lohkon lopun.
  6. Kun lohkon loppu on saavutettu, DFSInputStream sulkee yhteyden ja siirtyy etsimรครคn seuraavan lohkon seuraavaa DataNodea.
  7. Kun asiakas on lukenut tiedot loppuun, se kutsuu close()-metodia.

Kirjoittaa OperaHDFS:ssรค

Tรคssรค osiossa ymmรคrrรคmme, miten dataa kirjoitetaan HDFS:รครคn tiedostojen kautta. Alla oleva kaavio traces, jotka kirjoittavat polun.

HDFS-kirjoitusoperaatioputki DataQueuen, DataStreamerin ja Ack Queuen avulla

  1. Asiakas aloittaa kirjoitusoperaation kutsumalla DistributedFileSystem-objektin 'create()'-metodia, joka luo uuden tiedoston โ€“ vaihe nro 1 yllรค olevassa kaaviossa.
  2. DistributedFileSystem-objekti muodostaa yhteyden NameNode-solmuun RPC-kutsulla ja aloittaa uuden tiedoston luomisen. Tรคmรค tiedostonluontioperaatio ei kuitenkaan liitรค tiedostoon mitรครคn lohkoja. NameNode-solmun vastuulla on varmistaa, ettรค luotavaa tiedostoa ei ole jo olemassa ja ettรค asiakkaalla on oikeat oikeudet uuden tiedoston luomiseen. Jos tiedosto on jo olemassa tai asiakkaalla ei ole riittรคviรค oikeuksia uuden tiedoston luomiseen, asiakkaalle annetaan IOException-poikkeus. Muussa tapauksessa operaatio onnistuu ja NameNode luo tiedostolle uuden tietueen.
  3. Kun NameNode-solmuun on luotu uusi tietue, asiakkaalle palautetaan FSDataOutputStream-tyyppinen objekti. Asiakas kรคyttรครค sitรค datan kirjoittamiseen HDFS:รครคn. Data write -metodia kutsutaan (kaavion vaihe 3).
  4. FSDataOutputStream sisรคltรครค DFSOutputStream-objektin, joka huolehtii kommunikoinnista DataNode- ja NameNode-solmujen kanssa. Asiakkaan jatkaessa datan kirjoittamista DFSOutputStream jatkaa pakettien luomista nรคillรค tiedoilla. Nรคmรค paketit asetetaan jonoon, jota kutsutaan DataQueue-nimiseksi.
  5. Tรคtรค DataQueue-jonoa kรคyttรครค vielรค yksi komponentti nimeltรค DataStreamer. DataStreamer pyytรครค myรถs NameNode-solmulta uusien lohkojen allokointia ja valitsee siten halutut DataNode-solmut replikointia varten.
  6. Nyt replikointiprosessi alkaa luomalla liukuhihna DataNodesin avulla. Meidรคn tapauksessamme olemme valinneet replikointitason 3, joten valmisteilla on 3 DataNodea.
  7. DataStreamer kaataa paketit liukuhihnan ensimmรคiseen DataNodeen.
  8. Jokainen putkilinjan DataNode tallentaa vastaanottamansa paketin ja vรคlittรครค sen edelleen putkilinjan toiselle DataNodelle.
  9. Toista jonoa, 'Ack Queue', yllรคpitรครค DFSOutputStream tallentamaan paketteja, jotka odottavat kuittausta DataNodeilta.
  10. Kun jonossa olevan paketin kuittaus on vastaanotettu kaikilta liukuhihnassa olevilta DataNodeilta, se poistetaan 'Ack Queue'sta. Jos DataNode epรคonnistuu, tรคmรคn jonon paketteja kรคytetรครคn kรคynnistรคmรครคn toiminto uudelleen.
  11. Kun asiakas on kirjoittanut datan, se kutsuu close()-metodia (kaavion vaihe 9). close()-kutsu johtaa jรคljellรค olevien datapakettien lรคhettรคmiseen liukuhihnalle, minkรค jรคlkeen odotetaan kuittausta.
  12. Kun lopullinen kuittaus on vastaanotettu, NameNode-solmuun otetaan yhteyttรค ja ilmoitetaan, ettรค tiedoston kirjoitusoperaatio on valmis.

Kรคytรค HDFS:รครค kรคyttรคmรคllรค Java API

Tรคssรค osiossa pyrimme ymmรคrtรคmรครคn, Java kรคyttรถliittymรค, jota kรคytetรครคn Hadoopin tiedostojรคrjestelmรคn kรคyttรคmiseen.

Jotta Hadoopin tiedostojรคrjestelmรคn kanssa voisi ohjelmallisesti olla vuorovaikutuksessa, Hadoop tarjoaa useita Java luokat. Paketti nimeltรค org.apache.hadoop.fs sisรคltรครค luokkia, jotka ovat hyรถdyllisiรค tiedoston kรคsittelyssรค Hadoopin tiedostojรคrjestelmรคssรค. Nรคitรค operaatioita ovat avaaminen, lukeminen, kirjoittaminen ja sulkeminen. Hadoopin tiedosto-API on geneerinen ja sitรค voidaan laajentaa vuorovaikutukseen muiden tiedostojรคrjestelmien kuin HDFS:n kanssa.

Tiedoston lukeminen HDFS:stรค ohjelmallisesti

Objekti java.net.URL kรคytetรครคn tiedoston sisรคllรถn lukemiseen. Aluksi meidรคn on tehtรคvรค Java tunnistaa Hadoopin hdfs:t URL skeemaa. Tรคmรค tehdรครคn kutsumalla joukkoaURLStreamHandlerFactory-metodi pรครคllรค URL objekti ja vรคlittรคmรคllรค sille FsUrlStreamHandlerFactory-instanssin. Tรคmรค metodi tarvitsee suorittaa vain kerran per JVM, joten se on suljettu staattiseen lohkoon.

Esimerkkikoodi 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);
        }
    }
}

Tรคmรค koodi avaa ja lukee tiedoston sisรคllรถn. Tiedoston polku HDFS:ssรค annetaan ohjelmalle komentoriviargumenttina.

HDFS:n kรคyttรถ komentorivikรคyttรถliittymรคn avulla

Tรคmรค on yksi yksinkertaisimmista tavoista olla vuorovaikutuksessa HDFS:n kanssa. Komentorivikรคyttรถliittymรค tukee tiedostojรคrjestelmรคtoimintoja, kuten tiedoston lukemista, hakemistojen luomista, tiedostojen siirtรคmistรค, tietojen poistamista ja hakemistojen listaamista.

Voimme juosta '$HADOOP_HOME/bin/hdfs dfs -help' saadaksesi yksityiskohtaista apua jokaisesta komennosta. Tรคssรค 'dfs' on HDFS:n komentotulkkikomento, joka tukee useita alikomentoja. Hadoopin nykyisissรค julkaisuissa hdfs dfs on suositeltava muoto, kun taas vanhempi hadoop fs komento suorittaa saman tyรถn mille tahansa tuetulle tiedostojรคrjestelmรคlle.

Jotkut laajalti kรคytetyistรค komennoista on lueteltu alla ja joistakin yksityiskohdista.

1. Kopioi tiedosto paikallisesta tiedostojรคrjestelmรคstรค HDFS:รครคn

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

Tรคmรค komento kopioi tiedoston temp.txt paikallisesta tiedostojรคrjestelmรคstรค HDFS:รครคn, kuten alla oleva tuloste osoittaa.

hdfs dfs -copyFromLocal-komento kopioi temp.txt-tiedoston HDFS:รครคn

2. Voimme listata hakemistossa olevat tiedostot kรคyttรคmรคllรค -ls-valitsinta

$HADOOP_HOME/bin/hdfs dfs -ls /

Alla olevassa listauksessa nรคemme tiedoston 'temp.txt' (kopioitu aiemmin) ' / ' -hakemistossa.

hdfs dfs -ls -komennon tuloste nรคyttรครค tiedoston temp.txt HDFS:n juurihakemistossa.

3. Komento kopioida tiedosto paikalliseen tiedostojรคrjestelmรครคn HDFS:stรค

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

Tรคmรค komento peilaa -get-valitsinta ja hyvรคksyy toisena argumenttina eksplisiittisen paikallisen kohdepolun. Alla oleva tuloste nรคyttรครค paikalliseen tiedostojรคrjestelmรครคn kopioidun temp.txt-tiedoston.

hdfs dfs -copyToLocal -komennon tuloste, joka nรคyttรครค paikalliseen tiedostojรคrjestelmรครคn kopioidun temp.txt-tiedoston

4. Komento luoda uusi hakemisto

$HADOOP_HOME/bin/hdfs dfs -mkdir /mydirectory

Komento suoritetaan hiljaisesti, kuten alla oleva kehote osoittaa.

hdfs dfs -mkdir-komento luo /mydirectory-kansion HDFS:รครคn

Tarkista, onko hakemisto luotu vai ei. Nyt sinun pitรคisi tietรครค miten se tehdรครคn ๐Ÿ˜‰

UKK

Suuret lohkot pitรคvรคt NameNode-metatiedon pienenรค ja antavat mapperin lukea pitkรคn perรคkkรคisen tavujonon ennen uutta hakua. Levyn hakuajasta tulee siis pieni osa siirtoajasta, mikรค tekee koko tiedoston skannauksista nopeita.

NameNode lopettaa sykkeiden vastaanottamisen, merkitsee solmun kuolleeksi ja aikatauluttaa jokaisen replikointikertoimen alapuolelle jรครคneen lohkon uudelleenreplikoinnin terveille DataNodeille. Lennon aikana tehtรคvรคt kirjoitukset palautuvat Ack-jonosta, joten asiakas ei menetรค paketteja.

Ei oikein konfiguroidussa klusterissa. HDFS High Availability suorittaa aktiivista ja valmiustilassa olevaa NameNode-solmua, jotka jakavat muokkauksia JournalNode-solmujen kautta, ja ZooKeeper-vikasieto-ohjaimet siirtรคvรคt valmiustilaan automaattisesti, kun aktiivinen solmu lakkaa vastaamasta.

Molemmat lataavat dataa HDFS:รครคn. -copyFromLocal-valitsin rajoittaa lรคhteen paikalliseen tiedostojรคrjestelmรครคn, kun taas -put hyvรคksyy minkรค tahansa tuetun lรคhteen, mukaan lukien toisen HDFS-polun tai stdin:n. Muuten toiminta on identtinen, joten -copyFromLocal yksinkertaisesti dokumentoi tarkoituksen.

Jokainen tiedosto, hakemisto ja lohko vie muistia NameNode-solmussa, joten miljoonat pienet tiedostot kuluttavat keon kauan ennen kuin levyt tรคyttyvรคt. Yhdistรคmรคllรค ne sekvenssitiedostoiksi, Avro-, ORC-, Parquet- tai HAR-arkistoiksi metatiedot pysyvรคt hallittavina.

Replikointi sรคilyttรครค kolme tรคyttรค kopiota, mikรค maksaa 200 prosenttia enemmรคn tallennustilaa. Hadoop 3:een lisรคtty poistokoodaus tallentaa pariteettisoluja sen sijaan ja saavuttaa samanlaisen kestรคvyyden noin 50 prosentin lisรคkuormituksella, jolloin halvempi tallennustila vaihtaisi korkeampiin suoritin- ja verkkokustannuksiin palautuksen aikana.

NameNode-tarkastuslokien ja DataNode-mittareiden avulla koulutetut koneoppimismallit voivat ennustaa kapasiteetin loppumisen, merkitรค kรคytรถssรค olevia lohkoja ja havaita vialliset levyt ennen niiden katoamista. Kรคyttรถmallien poikkeavuuksien havaitseminen paljastaa myรถs karkaavia tรถitรค varhaisessa vaiheessa.

Copilot suorittaa tutut org.apache.hadoop.fs-mallikappaleet nopeasti, kuten FileSystem.get-, FSDataInputStream-silmukat ja IOUtils.copyBytes-kutsuja. Tarkista aina luotu koodi kรคytรถssรค olevaa Hadoop-versiota vasten, koska API-nimet ja vanhentuneet metodit eroavat huomattavasti Hadoop 2.x:n ja 3.x:n vรคlillรค.

Tiivistรค tรคmรค viesti seuraavasti: