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.

  • 🔘 Architectúra: A NameNode tárolja a névtér képét és a szerkesztési naplót, míg a DataNode-ok a tényleges blokkreplikákat.
  • ☑️ Blokkméretezés: A Hadoop 1.x alapértelmezés szerint 64 MB blokkot használt; a Hadoop 2.x és 3.x verziók ehelyett 128 MB-ot.
  • Replikáció: Alapértelmezés szerint blokkonként három replika van, amelyek a rackek között elosztva készülnek, így hardverhiba esetén soha nem vesznek el adatok.
  • 🧪 Olvasási útvonal: Az FSDataInputStream és a DFSInputStream a NameNode-ból kéri le a blokkok helyét, majd közvetlenül a DataNode-okból streameli a bájtokat.
  • 🇧🇷 Írási útvonal: A DFSOutputStream sorba állítja a csomagokat, a DataStreamer egy DataNode folyamatot épít, az Ack Queue pedig a csomagvesztés ellen véd.
  • 🧭 Hozzáférési lehetőségek: Az org.apache.hadoop.fs Java Az API és a hdfs dfs shell egyaránt lefedi a megnyitást, olvasást, írást és bezárást.

HDFS oktatóanyag

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.

HDFS olvasási műveleti adatfolyam a kliens, a NameNode és a DataNode között

  1. 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.
  2. 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.
  3. Erre a metaadat-kérésre válaszul a blokk másolatával rendelkező DataNode-ok címei kerülnek visszaadásra.
  4. 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.
  5. 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.
  6. 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.
  7. 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.

HDFS írási műveleti folyamat DataQueue, DataStreamer és Ack Queue használatával

  1. 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.
  2. 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.
  3. 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).
  4. 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.
  5. 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.
  6. 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.
  7. A DataStreamer a csomagokat a folyamat első DataNode-jába önti.
  8. 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.
  9. 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.
  10. 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.
  11. 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.
  12. 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.

hdfs dfs -copyFromLocal parancs a temp.txt fájl HDFS-be másolása

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.

A hdfs dfs -ls parancs kimenete a HDFS gyökérkönyvtárában található temp.txt fájl listázása.

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.

hdfs dfs -copyToLocal parancs kimenete, amely 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.

hdfs dfs -mkdir parancs a /mydirectory mappa létrehozásával a HDFS-ben

Ellenőrizd, hogy létrejött-e a könyvtár. Most már tudnod kell, hogyan kell csinálni 😉

GYIK

A nagy blokkok kis méretűvé teszik a NameNode metaadatokat, és lehetővé teszik a leképező számára, hogy a bájtok hosszú, egymást követő sorozatát olvassa be, mielőtt újra keresne. A lemezkeresési idő így az átviteli idő töredékévé válik, ami a teljes fájlok beolvasását gyorssá teszi.

A NameNode leállítja a szívverések fogadását, halottnak jelöli a csomópontot, és minden olyan blokk replikációját ütemezi, amely a replikációs tényező alá esett, egészséges DataNode-okra. A repülés közbeni írások az Ack sorból térnek vissza, így a kliens nem veszít csomagokat.

Nincs megfelelően konfigurált fürtben. A HDFS High Availability egy aktív és egy készenléti NameNode-ot futtat, amelyek JournalNode-okon keresztül megosztják a szerkesztéseket, és a ZooKeeper feladatátvételi vezérlők automatikusan készenléti állapotba léptetik, amikor az aktív csomópont nem válaszol.

Mindkettő feltölti az adatokat a HDFS-be. A -copyFromLocal kapcsoló a forrást a helyi fájlrendszerre korlátozza, míg a -put bármilyen támogatott forrást elfogad, beleértve más HDFS elérési utat vagy stdin-t is. A viselkedés egyébként megegyezik, így a -copyFromLocal egyszerűen a szándékot dokumentálja.

Minden fájl, könyvtár és blokk memóriát foglal a NameNode-ban, így több millió apró fájl kimeríti a heap-et jóval azelőtt, hogy a lemezek megtelnének. Ezeket szekvenciafájlokba, Avro, ORC, Parquet vagy HAR archívumokba kombinálva a metaadatok kezelhetővé válnak.

A replikáció három teljes másolatot tart meg, ami 200 százalékkal több tárhelyet jelent. A Hadoop 3-ban bevezetett törléskódolás ehelyett paritáscellákat tárol, és hasonló tartósságot ér el nagyjából 50 százalékos többletterhelés mellett, az olcsóbb tárhelyet magasabb CPU- és hálózati költségekért cserébe a helyreállítás során.

A NameNode auditnaplókon és DataNode metrikákon alapuló gépi tanulási modellek képesek előre jelezni a kapacitás kimerülését, megjelölni a forró blokkokat, és a hibás lemezeket még a meghibásodás előtt észlelni. A hozzáférési minták anomáliadetektálása a megszabadult feladatokat is korán feltárja.

A Copilot gyorsan végrehajtja az ismerős org.apache.hadoop.fs sablonfájlokat, például a FileSystem.get, az FSDataInputStream ciklusokat és az IOUtils.copyBytes hívásokat. Mindig ellenőrizze a generált kódot a használatban lévő Hadoop verzióval szemben, mivel az API-nevek és az elavult metódusok észrevehetően eltérnek a Hadoop 2.x és 3.x között.

Foglald össze ezt a bejegyzést a következőképpen: