HDFS oktatóanyag: Architecture, Read & Write OperaCIÓ
⚡ Okos összefoglaló
A HDFS a Hadoop elosztott tárolási rétege, amely a nagyon nagy fájlokat replikált blokkokra osztja a fontos gépek között, így egyetlen NameNode tracks metaadatokat, míg sok DataNode megbízhatóan szolgálja ki az olvasási és írási kéréseket.
Mi az a HDFS?
A HDFS egy elosztott fájlrendszer nagyon nagy adatfájlok tárolására, amely hagyományos hardverek fürtjein fut. Hibatűrő, skálázható és rendkívül egyszerűen bővíthető. A Hadoop a HDFS-sel (Hadoop Distributed File System) együtt érkezik.
Ha az adatok meghaladják egyetlen fizikai gép tárolókapacitását, elengedhetetlenné válik, hogy azokat több különálló gép között osszák fel. Elosztott fájlrendszernek nevezzük azt a fájlrendszert, amely a tárolóspecifikus műveleteket a gépek hálózatán keresztül kezeli. A HDFS egy ilyen szoftver.
HDFS Architectúra
Egy HDFS klaszter elsősorban egy NameNode amely kezeli a fájlrendszer metaadatait és DataNodes amelyek a tényleges adatokat tárolják.
- Névcsomópont: A NameNode tekinthető a rendszer mesterének. Ez tartja karban a fájlrendszerfát és a rendszerben található összes fájl és könyvtár metaadatait. Két fájl, a „névtérkép” és a „szerkesztési napló” a metaadat-információk tárolására szolgál. A NameNode ismeri az adott fájlhoz tartozó adatblokkokat tartalmazó összes DataNode-ot, azonban a blokkok helyét nem tárolja állandóan. Ez az információ minden alkalommal rekonstruálódik a DataNode-okból, amikor a rendszer elindul.
- DataNode: A DataNode-ok (adatcsomópontok) a klaszter minden egyes gépén található, és a tényleges tárhelyet biztosítják. Felelősek a kliensektől érkező olvasási és írási kérések kiszolgálásáért.
Mivel egyetlen NameNode egyetlen meghibásodási pontot jelentene, a jelenlegi klaszterek egy aktív NameNode-ot futtatnak egy készenléti NameNode mellett, amely megosztja a szerkesztési naplót a JournalNode-ok kvórumán keresztül, automatikus feladatátvétellel a kettő között.
A HDFS olvasási és írási műveletei blokk szinten működnek. A HDFS adatfájljai blokk méretű darabokra vannak bontva, amelyek független egységekként tárolódnak. A Hadoop 1.x alapértelmezett blokkmérete 64 MB. A Hadoop 2.x-től kezdődően az alapértelmezett dfs.blokkméret 128 MB-os.
A HDFS az adatreplikáció koncepcióján alapul, amelyben az adatblokkok több replikáját hozzák létre és osztják el a fürt csomópontjain, hogy csomóponthiba esetén is biztosítsák az adatok magas rendelkezésre állását. Az alapértelmezett replikációs tényező három (dfs.replication), és amikor egy DataNode leállítja a szívverések küldését, a NameNode automatikusan újrareplikálja a blokkjait máshol.
Tudod? Az egyetlen blokknál kisebb HDFS-fájl nem foglalja el a blokk teljes tárhelyét.
Olvass OperaHDFS-ben
Az adatolvasási kérést a HDFS, a NameNode és a DataNode szolgálja ki. Nevezzük az olvasót „kliensnek”. Az alábbi ábra a fájlolvasási műveletet ábrázolja Hadoopban.
- Egy kliens olvasási kérést kezdeményez a FileSystem objektum 'open()' metódusának meghívásával; ez egy DistributedFileSystem típusú objektum.
- Ez az objektum RPC-n keresztül csatlakozik a NameNode-hoz, és metaadat-információkat kér le, például a fájl blokkjainak helyét. Kérjük, vegye figyelembe, hogy ezek a címek a fájl első néhány blokkját jelentik.
- Erre a metaadat-kérésre válaszul a blokk másolatával rendelkező DataNode-ok címei kerülnek visszaadásra.
- Miután a DataNode-ok címei megérkeztek, egy FSDataInputStream típusú objektum kerül visszaadásra a kliensnek. Az FSDataInputStream tartalmazza a DFSInputStream metódust, amely a DataNode-dal és a NameNode-dal való interakciókat kezeli. A fenti ábrán látható 4. lépésben a kliens meghívja a 'read()' metódust, amely arra készteti a DFSInputStream-et, hogy kapcsolatot létesítsen az első DataNode-dal, amely a fájl első blokkját tartalmazza.
- Az adatokat streamek formájában olvassuk be, ahol a kliens ismételten meghívja a 'read()' metódust. A read() műveletnek ez a folyamata addig folytatódik, amíg el nem éri a blokk végét.
- Miután elérte a blokk végét, a DFSInputStream lezárja a kapcsolatot, és továbblép, hogy megkeresse a következő blokkhoz tartozó következő DataNode-ot.
- Miután a kliens befejezte az olvasást, meghívja a close() metódust.
Ír OperaHDFS-ben
Ebben a részben megértjük, hogyan íródnak az adatok HDFS-be fájlokon keresztül. Az alábbi ábra tracelérési utat író es.
- Egy kliens írási műveletet kezdeményez a DistributedFileSystem objektum 'create()' metódusának meghívásával, amely létrehoz egy új fájlt – 1. lépés a fenti ábrán.
- A DistributedFileSystem objektum egy RPC hívás segítségével csatlakozik a NameNode-hoz, és új fájl létrehozását kezdeményezi. Ez a fájllétrehozási művelet azonban nem társít blokkokat a fájlhoz. A NameNode felelőssége annak ellenőrzése, hogy a létrehozandó fájl nem létezik-e már, és hogy a kliens rendelkezik-e a megfelelő jogosultságokkal egy új fájl létrehozásához. Ha egy fájl már létezik, vagy a kliens nem rendelkezik elegendő jogosultsággal egy új fájl létrehozásához, akkor egy IOException kivételt kap a kliens. Ellenkező esetben a művelet sikeres, és a NameNode új rekordot hoz létre a fájlhoz.
- Miután létrejön egy új rekord a NameNode-ban, egy FSDataOutputStream típusú objektumot ad vissza a kliens. A kliens ezt használja adatok HDFS-be írásához. Meghívódik az adatírás metódus (a diagram 3. lépése).
- Az FSDataOutputStream tartalmaz egy DFSOutputStream objektumot, amely a DataNode-okkal és a NameNode-dal való kommunikációt felügyeli. Amíg az ügyfél folytatja az adatok írását, a DFSOutputStream továbbra is csomagokat hoz létre ezekkel az adatokkal. Ezeket a csomagokat egy várólistába rendezi a rendszer, amelyet DataQueue-nak nevezünk.
- Van még egy DataStreamer nevű komponens, amely ezt a DataQueue-t használja. A DataStreamer a NameNode-tól is kér új blokkok kiosztását, ezáltal kiválasztja a replikációhoz használandó DataNode-okat.
- Most a replikáció folyamata egy folyamat létrehozásával kezdődik a DataNodes használatával. Esetünkben a 3-as replikációs szintet választottuk, és ezért 3 DataNode van a folyamatban.
- A DataStreamer a csomagokat a folyamat első DataNode-jába önti.
- Egy csővezeték minden DataNode-ja tárolja az általa fogadott csomagot, és továbbítja azt a csővezeték második DataNode-jának.
- Egy másik várólistát, az „Ack Queue”-t a DFSOutputStream tartja karban, hogy tárolja azokat a csomagokat, amelyek a DataNode-ok visszaigazolására várnak.
- Miután a sorban lévő csomagok nyugtázása megérkezett a folyamatban lévő összes adatcsomóponttól, az eltávolításra kerül az „Ack Queue”-ból. Bármilyen DataNode meghibásodás esetén az ebből a sorból származó csomagokat használja a rendszer a művelet újraindítására.
- Miután a kliens befejezte az adatok írását, meghívja a close() metódust (az ábra 9. lépése). A close() hívása a fennmaradó adatcsomagok kiürítését eredményezi a folyamatba, majd a rendszer a visszaigazolásra vár.
- Miután a végső visszaigazolás megérkezett, a NameNode-dal felveszik a kapcsolatot, hogy értesítsék a fájlírási művelet befejezéséről.
HDFS elérése a következő használatával: Java API
Ebben a részben megpróbáljuk megérteni a Java A Hadoop fájlrendszerének eléréséhez használt interfész.
A Hadoop fájlrendszerével való programozott interakcióhoz a Hadoop több eszközt is biztosít Java osztályok. Az org.apache.hadoop.fs nevű csomag olyan osztályokat tartalmaz, amelyek hasznosak a Hadoop fájlrendszerében lévő fájlok kezelésében. Ezek a műveletek magukban foglalják a megnyitást, olvasást, írást és bezárást. A Hadoop fájl API általános, és kiterjeszthető a HDFS-től eltérő fájlrendszerekkel való interakcióra.
Fájl olvasása HDFS-ből, programozottan
A java.net objektum.URL egy fájl tartalmának olvasására szolgál. Először is meg kell csinálnunk Java felismeri a Hadoop hdfs-eit URL séma. Ez a halmaz meghívásával történik.URLStreamHandlerFactory metódus a következőn: URL objektumot, és átadunk neki egy FsUrlStreamHandlerFactory példányt. Ezt a metódust csak egyszer kell végrehajtani JVM, ezért egy statikus blokkba van zárva.
Egy példa kód:
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); } } }
Ez a kód megnyit és beolvassa egy fájl tartalmát. A fájl HDFS-en található elérési útja parancssori argumentumként kerül átadásra a programnak.
HDFS elérése a parancssori felület használatával
Ez az egyik legegyszerűbb módja a HDFS-sel való interakciónak. A parancssori felület támogatja a fájlrendszeri műveleteket, mint például a fájlok olvasása, könyvtárak létrehozása, fájlok áthelyezése, adatok törlése és könyvtárak listázása.
Tudunk futni '$HADOOP_HOME/bin/hdfs dfs -help' hogy részletes segítséget kapjon minden parancshoz. Itt a „dfs” a HDFS egy shell parancsa, amely több alparancsot is támogat. A jelenlegi Hadoop kiadásokban hdfs dfs az előnyben részesített forma, míg az idősebb hadoop fs parancs ugyanazt a feladatot látja el bármely támogatott fájlrendszeren.
Az alábbiakban felsorolunk néhány széles körben használt parancsot, néhány részlettel együtt.
1. Másoljon egy fájlt a helyi fájlrendszerből HDFS-be
$HADOOP_HOME/bin/hdfs dfs -copyFromLocal temp.txt /
Ez a parancs a temp.txt fájlt másolja a helyi fájlrendszerről a HDFS-re, ahogy az alábbi kimenet is mutatja.
2. A könyvtárban található fájlokat a -ls kapcsolóval listázhatjuk.
$HADOOP_HOME/bin/hdfs dfs -ls /
Az alábbi listában láthatjuk a korábban másolt 'temp.txt' fájlt a ' / ' könyvtárban.
3. Parancs, hogy másoljon egy fájlt a helyi fájlrendszerbe a HDFS-ből
$HADOOP_HOME/bin/hdfs dfs -copyToLocal /temp.txt
Ez a parancs tükrözi a -get kapcsolót, és egy explicit helyi célútvonalat fogad el második argumentumként. Az alábbi kimenet a helyi fájlrendszerbe másolt temp.txt fájlt mutatja.
4. Parancs egy új könyvtár létrehozásához
$HADOOP_HOME/bin/hdfs dfs -mkdir /mydirectory
A parancs csendben végrehajtódik, ahogy az alábbi prompt is mutatja.
Ellenőrizd, hogy létrejött-e a könyvtár. Most már tudnod kell, hogyan kell csinálni 😉




