HDFS opetusohjelma: Architecture, Read & Write Operakäyttöä Java API
Mikä on HDFS?
HDFS on hajautettu tiedostojärjestelmä erittäin suurten datatiedostojen tallentamiseen, ja se toimii hyödykelaitteistoryhmissä. Se on vikasietoinen, skaalautuva ja erittäin helppo laajentaa. Hadoop toimitetaan mukana HDFS (Hadoop Distributed File Systems).
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 a NameNode joka hallitsee tiedostojärjestelmää Metadata ja DataNodes joka tallentaa todellisia tietoja.
- NameNode: NameNodea voidaan pitää järjestelmän päällikkönä. Se ylläpitää tiedostojärjestelmäpuuta ja metatietoja kaikista järjestelmässä olevista tiedostoista ja hakemistoista. Kaksi tiedostoa "Nimiavaruuskuva" ja 'muokkaa lokia' käytetään metatietotietojen tallentamiseen. Namenode tietää kaikki datasolmut, jotka sisältävät datalohkoja tietylle tiedostolle, mutta se ei tallenna lohkon paikkoja jatkuvasti. Nämä tiedot rekonstruoidaan joka kerta datasolmuista järjestelmän käynnistyessä.
- DataNode: DataNodes ovat orjia, jotka sijaitsevat jokaisessa klusterin koneessa ja tarjoavat todellisen tallennustilan. Se vastaa asiakkaiden palvelemisesta, lukemisesta ja kirjoittamisesta.
HDFS:n luku-/kirjoitustoiminnot toimivat lohkotasolla. HDFS:n datatiedostot jaetaan lohkon kokoisiksi paloiksi, jotka tallennetaan itsenäisinä yksiköinä. Oletuslohkokoko on 64 MB.
HDFS toimii tietojen replikoinnin konseptilla, jossa luodaan useita tietolohkojen replikoita, jotka jaetaan solmuihin koko klusterin kautta, mikä mahdollistaa tiedon korkean käytettävyyden solmuvian sattuessa.
Tiedätkö? HDFS-tiedosto, joka on pienempi kuin yksi lohko, ei vie lohkon täyttä tallennustilaa.
Lue OperaHDFS:ssä
Datan lukupyyntöä palvelevat HDFS, NameNode ja DataNode. Kutsukaamme lukijaa "asiakkaaksi". Alla oleva kaavio kuvaa tiedoston lukutoimintoa Hadoop.
- Asiakas aloittaa lukupyynnön soittamalla 'avata()' FileSystem-objektin menetelmä; se on tyyppinen esine DistributedFileSystem.
- Tämä objekti muodostaa yhteyden namenodeen RPC:n avulla ja saa metatietotiedot, kuten tiedoston lohkojen sijainnit. Huomaa, että nämä osoitteet ovat tiedoston ensimmäisiä lohkoja.
- Vastauksena tähän metatietopyyntöön palautetaan datasolmujen osoitteet, joilla on kopio kyseisestä lohkosta.
-
Kun DataNodes-osoitteet on vastaanotettu, tyyppinen objekti FSDataInputStream palautetaan asiakkaalle. FSDataInputStream sisältää DFSInputStream joka huolehtii vuorovaikutuksista DataNoden ja NameNoden kanssa. Yllä olevan kaavion vaiheessa 4 asiakas kutsuu 'lukea()' menetelmä, joka aiheuttaa DFSInputStream muodostaaksesi yhteyden ensimmäiseen DataNodeen tiedoston ensimmäisen lohkon kanssa.
-
Tiedot luetaan virtojen muodossa, joissa asiakas kutsuu 'lukea()' menetelmää toistuvasti. Tämä prosessi lukea() toiminta jatkuu, kunnes se saavuttaa lohkon loppuun.
- Kun lohkon loppu on saavutettu, DFSInputStream sulkee yhteyden ja siirtyy etsimään seuraavan datasolmun seuraavalle lohkolle
- Kun asiakas on lukenut, se soittaa lähellä() menetelmällä.
Kirjoittaa OperaHDFS:ssä
Tässä osiossa ymmärrämme kuinka tiedot kirjoitetaan HDFS:ään tiedostojen kautta.
- Asiakas aloittaa kirjoitustoiminnon kutsumalla DistributedFileSystem-objektin "create()"-menetelmää, joka luo uuden tiedoston – Vaihe nro. 1 yllä olevassa kaaviossa.
- DistributedFileSystem-objekti muodostaa yhteyden NameNodeen RPC-kutsulla ja aloittaa uuden tiedoston luomisen. Tämä tiedosto luo toiminto ei kuitenkaan liitä tiedostoon lohkoja. NameNoden vastuulla on varmistaa, että tiedostoa (jota ollaan luomassa) ei ole jo olemassa ja että asiakkaalla on oikeat oikeudet luoda uusi tiedosto. Jos tiedosto on jo olemassa tai asiakkaalla ei ole riittäviä oikeuksia uuden tiedoston luomiseen, niin IOException heitetään asiakkaalle. Muussa tapauksessa toiminto onnistuu ja NameNode luo tiedostolle uuden tietueen.
- Kun uusi tietue NameNodeen on luotu, FSDataOutputStream-tyyppinen objekti palautetaan asiakkaalle. Asiakas käyttää sitä tietojen kirjoittamiseen HDFS:ään. Tietojen kirjoitusmenetelmä kutsutaan (vaihe 3 kaaviossa).
- FSDataOutputStream sisältää DFSOutputStream-objektin, joka huolehtii tiedonsiirrosta DataNodesin ja NameNoden kanssa. Kun asiakas jatkaa tietojen kirjoittamista, DFSOutputStream jatkaa pakettien luomista näillä tiedoilla. Nämä paketit asetetaan jonoon, jota kutsutaan nimellä DataQueue.
- On vielä yksi komponentti nimeltään DataStreamer joka kuluttaa tätä DataQueue. DataStreamer pyytää myös NameNodelta uusien lohkojen allokointia ja valitsee siten halutut DataNodet, joita käytetään replikointiin.
- 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 liukuhihnan DataSolmu tallentaa vastaanottamansa paketin ja välittää sen edelleen liukuhihnan toiselle DataSolmulle.
- Toista jonoa, 'Ack Queue', ylläpitää DFSOutputStream tallentaakseen paketteja, jotka odottavat kuittausta DataNodesilta.
- 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 lopettanut tietojen kirjoittamisen, se kutsuu close()-menetelmää (kaavion vaihe 9). Call to close() johtaa siihen, että jäljellä olevat datapaketit huuhdellaan liukuhihnaan, minkä jälkeen odotetaan kuittausta.
- Kun viimeinen kuittaus on vastaanotettu, NameNode ottaa yhteyttä ja ilmoittaa, että tiedoston kirjoitustoiminto on valmis.
Käytä HDFS:ää JAVA API:n avulla
Tässä osiossa yritämme ymmärtää Java käyttöliittymä, jota käytetään Hadoopin tiedostojärjestelmän käyttämiseen.
Voidakseen olla vuorovaikutuksessa Hadoopin tiedostojärjestelmän kanssa ohjelmallisesti, Hadoop tarjoaa useita JAVA-luokkia. Paketti nimeltä org.apache.hadoop.fs sisältää luokkia, jotka ovat hyödyllisiä tiedoston käsittelyssä Hadoopin tiedostojärjestelmässä. Näitä toimintoja ovat avaaminen, lukeminen, kirjoittaminen ja sulkeminen. Itse asiassa Hadoopin tiedoston API on yleinen 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-URL-osoitemallin. Tämä tehdään soittamalla setURLStreamHandlerFactory menetelmä URL-objektissa ja FsUrlStreamHandlerFactory-esiintymä välitetään sille. Tämä menetelmä on suoritettava 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. Tämän HDFS-tiedoston polku välitetään ohjelmalle komentoriviargumenttina.
Käytä HDFS:ää KOMENTORILIITÄNTÄ
Tämä on yksi yksinkertaisimmista tavoista olla vuorovaikutuksessa HDFS:n kanssa. Komentoriviliittymä tukee tiedostojärjestelmän 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 jokaiseen komentoon. Tässä, "dfs" on HDFS:n komentotulkkikomento, joka tukee useita alikomentoja.
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.
2. Voimme listata hakemistossa olevat tiedostot käyttämällä -ls
$HADOOP_HOME/bin/hdfs dfs -ls /
Voimme nähdä tiedoston 'temp.txt' (kopioitu aiemmin) luetellaan alla '/' hakemistoon.
3. Komento kopioida tiedosto paikalliseen tiedostojärjestelmään HDFS:stä
$HADOOP_HOME/bin/hdfs dfs -copyToLocal /temp.txt
Me pystymme näkemään temp.txt kopioidaan paikalliseen tiedostojärjestelmään.
4. Komento luoda uusi hakemisto
$HADOOP_HOME/bin/hdfs dfs -mkdir /mydirectory
Tarkista, onko hakemisto luotu vai ei. Nyt sinun pitäisi tietää miten se tehdään 😉