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.
- 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.
- 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.
- Erre a metaadat-kérésre válaszul a blokk másolatával rendelkező DataNodes-címek visszaküldésre kerülnek.
-
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.
-
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.
- 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.
- 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.
- 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.
- 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.
- 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).
- 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.
- 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.
- 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.
- 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.
- 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.
- 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 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.
- 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 /
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 /
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
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
Ellenőrizze, hogy létrejött-e egy könyvtár vagy sem. Most tudnod kell, hogyan kell csinálni 😉