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.
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.
- Asiakas aloittaa lukupyynnรถn kutsumalla FileSystem-objektin 'open()'-metodia; kyseessรค on DistributedFileSystem-tyyppinen objekti.
- 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.
- Vastauksena tรคhรคn metatietopyyntรถรถn palautetaan niiden DataNode-solmujen osoitteet, joilla on kyseisen lohkon kopio.
- 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.
- Data luetaan virroina, joissa asiakas kutsuu 'read()'-metodia toistuvasti. Tรคmรค read()-operaatio jatkuu, kunnes se saavuttaa lohkon lopun.
- Kun lohkon loppu on saavutettu, DFSInputStream sulkee yhteyden ja siirtyy etsimรครคn seuraavan lohkon seuraavaa DataNodea.
- 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.
- Asiakas aloittaa kirjoitusoperaation kutsumalla DistributedFileSystem-objektin 'create()'-metodia, joka luo uuden tiedoston โ vaihe nro 1 yllรค olevassa kaaviossa.
- 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.
- 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).
- 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.
- 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.
- Nyt replikointiprosessi alkaa luomalla liukuhihna DataNodesin avulla. Meidรคn tapauksessamme olemme valinneet replikointitason 3, joten valmisteilla on 3 DataNodea.
- DataStreamer kaataa paketit liukuhihnan ensimmรคiseen DataNodeen.
- Jokainen putkilinjan DataNode tallentaa vastaanottamansa paketin ja vรคlittรครค sen edelleen putkilinjan toiselle DataNodelle.
- Toista jonoa, 'Ack Queue', yllรคpitรครค DFSOutputStream tallentamaan paketteja, jotka odottavat kuittausta DataNodeilta.
- 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.
- 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.
- 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.
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.
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.
4. Komento luoda uusi hakemisto
$HADOOP_HOME/bin/hdfs dfs -mkdir /mydirectory
Komento suoritetaan hiljaisesti, kuten alla oleva kehote osoittaa.
Tarkista, onko hakemisto luotu vai ei. Nyt sinun pitรคisi tietรครค miten se tehdรครคn ๐




