HDFS oktatóanyag: Architecture, Read & Write Operahasználata Java API

Mi az a HDFS?

A HDFS egy elosztott fájlrendszer nagyon nagy adatfájlok tárolására, amely árucikk-hardvercsoportokon fut. Hibatűrő, méretezhető és rendkívül egyszerűen bővíthető. A Hadoop csomagban van HDFS (Hadoop elosztott fájlrendszerek).

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

A HDFS-fürt elsősorban a NameNode amely a fájlrendszert kezeli Metaadatok és egy DataNodes amely tárolja a tényleges adatok.

  • Névcsomópont: A NameNode a rendszer mesterének tekinthető. Karbantartja a fájlrendszer fát és a rendszerben lévő összes fájl és könyvtár metaadatait. Két fájl "Névtér kép" és a "napló szerkesztése" metaadat információk tárolására szolgálnak. A Namenode ismeri az adott fájlhoz tartozó összes adatblokkot tartalmazó adatcsomópontot, azonban nem tárolja folyamatosan a blokkok helyét. Ezt az információt a rendszer minden alkalommal rekonstruálja az adatcsomópontokból, amikor a rendszer elindul.
  • DataNode: A DataNode-ok szolgák, amelyek egy fürt minden egyes gépén találhatók, és biztosítják a tényleges tárhelyet. Felelős az ügyfelek kérelmeinek kiszolgálásáért, olvasásáért és írásáért.

A HDFS olvasási/írási műveletei blokkszinten működnek. A HDFS-ben lévő adatfájlok blokkméretű darabokra vannak bontva, amelyek független egységként kerülnek tárolásra. Az alapértelmezett blokkméret 64 MB.

A HDFS az adatreplikáció koncepcióján működik, amelyben az adatblokkok több replikája jön létre, és a csomópontokon szét van osztva a fürtben, hogy csomóponthiba esetén magas szintű adatok álljanak rendelkezésre.

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 „ügyfélnek”. Az alábbi ábra a fájl olvasási műveletét mutatja be Hadoop.

Olvass OperaHDFS-ben

  1. Az ügyfél olvasási kérést kezdeményez hívással 'nyisd ki()' a FileSystem objektum metódusa; ez egy típusú objektum DistributedFileSystem.
  2. Ez az objektum RPC használatával csatlakozik a namenode-hoz, és metaadat-információkat kap, például a fájl blokkjainak helyét. Kérjük, vegye figyelembe, hogy ezek a címek egy fájl első néhány blokkjából állnak.
  3. Erre a metaadat-kérésre válaszul a blokk másolatával rendelkező DataNodes-címek visszaküldésre kerülnek.
  4. Miután megkapta a DataNodes címeit, egy típusú objektum FSDataInputStream visszakerül az ügyfélnek. FSDataInputStream tartalmaz DFSInputStream amely gondoskodik a DataNode és NameNode interakciókról. A fenti diagramon látható 4. lépésben egy ügyfél meghív 'olvas()' módszer, amely okozza DFSInputStream kapcsolat létrehozása az első DataNode-dal a fájl első blokkjával.
  5. Az adatok folyamok formájában kerülnek beolvasásra, amelyekben az ügyfél meghív 'olvas()' módszert többször is. Ez a folyamat olvas() a művelet 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 a következő blokk következő DataNode-jának megkeresésére.
  7. Miután az ügyfél befejezte a leolvasást, hív egy zárás () módszer.

Ír OperaHDFS-ben

Ebben a részben meg fogjuk érteni, hogyan íródnak az adatok a HDFS-be fájlokon keresztül.

Ír OperaHDFS-ben

  1. A kliens írási műveletet kezdeményez a DistributedFileSystem objektum 'create()' metódusának meghívásával, amely új fájlt hoz létre – 1. lépés. XNUMX a fenti diagramon.
  2. A DistributedFileSystem objektum RPC-hívással csatlakozik a NameNode-hoz, és új fájl létrehozását kezdeményezi. Azonban ez a fájl létrehoz művelet nem társít semmilyen blokkot a fájlhoz. A NameNode felelőssége annak ellenőrzése, hogy a fájl (amely létrehozás alatt áll) már nem létezik, és az ügyfél megfelelő jogosultságokkal rendelkezik-e új fájl létrehozásához. Ha egy fájl már létezik, vagy az ügyfélnek nincs elegendő engedélye új fájl létrehozásához, akkor IOException az ügyfélnek kerül. Ellenkező esetben a művelet sikeres lesz, és a NameNode új rekordot hoz létre a fájlhoz.
  3. A NameNode új rekordjának létrehozása után egy FSDataOutputStream típusú objektum kerül visszaadásra az ügyfélnek. Egy kliens arra használja, hogy adatokat írjon a HDFS-be. Az adatírási metódus meghívásra kerül (3. lépés a diagramon).
  4. Az FSDataOutputStream DFSOutputStream objektumot tartalmaz, amely a DataNodes és a NameNode kommunikáció után néz. Amíg az ügyfél folytatja az adatírást, DFSOutputStream folytatja a csomagok létrehozását ezekkel az adatokkal. Ezek a csomagok sorba kerülnek egy sorba, amelyet ún DataQueue.
  5. Van még egy komponens, az úgynevezett DataStreamer amely ezt fogyasztja DataQueue. A DataStreamer új blokkok kiosztását is kéri a NameNode-tól, ezzel kiválasztva a replikációhoz használandó kívánt 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. A folyamatban lévő minden DataNode tárolja az általa fogadott csomagot, és továbbítja azt a folyamatban lévő második DataNode-nak.
  9. Egy másik sort, az 'Ack Queue'-t, a DFSOutputStream tart fenn a DataNodes-tól nyugtázásra váró csomagok tárolására.
  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 egy kliens befejezte az adatok írását, meghív egy close() metódust (a diagram 9. lépése) Call to close(), ami a fennmaradó adatcsomagok kiürítését eredményezi a folyamatban, majd a nyugtázásra vár.
  12. Miután megkapta a végső nyugtát, a NameNode felveszi a kapcsolatot, hogy közölje vele, hogy a fájlírási művelet befejeződött.

A HDFS elérése JAVA API használatával

Ebben a részben megpróbáljuk megérteni Java A Hadoop fájlrendszerének eléréséhez használt interfész.

A Hadoop fájlrendszerével való programozott interakció érdekében a Hadoop több JAVA osztályt biztosít. Az org.apache.hadoop.fs nevű csomag olyan osztályokat tartalmaz, amelyek hasznosak a Hadoop fájlrendszerében lévő fájlok kezeléséhez. E műveletek közé tartozik a megnyitás, az olvasás, az írás és a bezárás. Valójában a Hadoop fájl API-ja általános, és kibővíthető, hogy a HDFS-n kívül más fájlrendszerekkel is együttműködjön.

Fájl olvasása HDFS-ből, programozottan

Java.net.URL objektum egy fájl tartalmának olvasására szolgál. Először is meg kell csinálnunk Java felismeri a Hadoop hdfs URL-sémáját. Ez hívással történik setURLStreamHandlerFactory metódust az URL objektumon, és az FsUrlStreamHandlerFactory példányát átadja neki. Ezt a módszert 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 megnyitja és beolvassa a fájl tartalmát. A HDFS fájl elérési útja parancssori argumentumként kerül átadásra a programnak.

Hozzáférés a HDFS-hez a COMMAND-LINE INTERFÉSZ használatával

Ez az egyik legegyszerűbb módja a HDFS-sel való interakciónak. A parancssori felület támogatja a fájlrendszer műveleteit, mint például a fájl beolvasása, könyvtárak létrehozása, fájlok mozgatása, 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, "dfs" a HDFS shell parancsa, amely több alparancsot is támogat.

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 /

Hozzáférés a HDFS-hez a COMMAND-LINE INTERFÉSZ használatával

Ez a parancs a temp.txt fájlt a helyi fájlrendszerből HDFS-be másolja.

2. A könyvtárban lévő fájlokat listázhatjuk a segítségével -ls

$HADOOP_HOME/bin/hdfs dfs -ls /

Hozzáférés a HDFS-hez a COMMAND-LINE INTERFÉSZ használatával

Láthatunk egy fájlt "temp.txt" (korábban másolt) alatt szerepel '/' 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

Hozzáférés a HDFS-hez a COMMAND-LINE INTERFÉSZ használatával

Láthatjuk temp.txt helyi fájlrendszerbe másolva.

4. Parancs egy új könyvtár létrehozásához

$HADOOP_HOME/bin/hdfs dfs -mkdir /mydirectory

Hozzáférés a HDFS-hez a COMMAND-LINE INTERFÉSZ használatával

Ellenőrizze, hogy létrejött-e egy könyvtár vagy sem. Most tudnod kell, hogyan kell csinálni 😉