HDFS mokymo programa: architektūra, skaitymas ir amp; Rašymo operacija naudojant „Java“ API

Kas yra HDFS?

HDFS yra paskirstyta failų sistema, skirta labai dideliems duomenų failams laikyti, veikianti prekių aparatūros grupėse. Jis yra atsparus gedimams, keičiamo dydžio ir yra labai paprastas išplėsti. „Hadoop“ yra komplektuojamas su HDFS („ Hadoop Distributed File Systems“ ).

Kai duomenys viršija vienos fizinės mašinos saugojimo talpą, būtina juos padalyti į keletą atskirų mašinų. Failų sistema, valdanti saugojimo operacijas mašinų tinkle, vadinama paskirstyta failų sistema. HDFS yra viena iš tokių programinės įrangos.

Šioje pamokoje sužinosime,

  • Kas yra HDFS?
  • HDFS architektūra
  • Skaityti operaciją
  • Rašymo operacija
  • Pasiekite HDFS naudodami JAVA API
  • Pasiekite HDFS naudodami „COMMAND-LINE INTERFACE“

HDFS architektūra

HDFS grupę pirmiausia sudaro „ NameNode“ , valdanti failų sistemą „ Metaduomenys“, ir „ DataNodes“, kurioje saugomi tikrieji duomenys .

  • „NameNode“: „ NameNode“ galima laikyti sistemos pagrindiniu. Jis palaiko failų sistemos medį ir visų sistemoje esančių failų ir katalogų metaduomenis. Du failai „Vardų srities vaizdas“ ir „Redagavimo žurnalas“ naudojami metaduomenų informacijai saugoti. „Namenode“ turi žinių apie visus datanodus, kuriuose yra tam tikro failo duomenų blokai, tačiau jis nuolat nesaugo blokų vietų. Kai sistema paleidžiama, ši informacija kiekvieną kartą rekonstruojama iš duomenų mazgų.
  • DataNode: DataNodes yra vergai, esantys kiekvienoje mašinoje grupėje ir suteikiantys tikrąją saugyklą. Ji yra atsakinga už klientų aptarnavimą, skaitymą ir rašymą.

Skaitymo / rašymo operacijos HDFS veikia bloko lygiu. Duomenų failai HDFS yra suskaidyti į bloko dydžio gabalus, kurie saugomi kaip nepriklausomi vienetai. Numatytasis bloko dydis yra 64 MB.

HDFS veikia pagal duomenų replikacijos koncepciją, kai sukuriamos kelios duomenų blokų kopijos ir paskirstomos mazguose visoje grupėje, kad mazgas sugedus būtų užtikrintas aukštas duomenų prieinamumas.

Ar tu žinai? HDFS failas, kuris yra mažesnis nei vienas blokas, neužima visos bloko saugyklos.

Skaitykite operaciją HDFS

Duomenų skaitymo užklausą teikia HDFS, NameNode ir DataNode. Paskambinkime skaitytojui kaip „klientui“. Žemiau esančioje diagramoje pavaizduota failo skaitymo operacija Hadoope.

  1. Klientas inicijuoja skaitymo užklausą iškviesdamas FileSystem“ objekto metodą „open ()“ ; tai yra DistributedFileSystem tipo objektas .
  2. Šis objektas prisijungia prie namenode naudodamas RPC ir gauna informaciją apie metaduomenis, pvz., Failo blokų vietas. Atminkite, kad šie adresai yra pirmieji failo blokai.
  3. Atsakant į šią metaduomenų užklausą, grąžinami duomenų bloko, turinčio to bloko kopiją, adresai.
  4. Gavus „DataNodes“ adresus, klientui grąžinamas FSDataInputStream tipo objektas . FSDataInputStream yra DFSInputStream, kuri rūpinasi sąveika su DataNode ir NameNode. 4 žingsnyje, parodytame pirmiau pateiktoje diagramoje, klientas naudoja „read ()“ metodą, kuris priverčia DFSInputStream užmegzti ryšį su pirmuoju „DataNode“ su pirmuoju failo bloku.
  5. Duomenys skaitomi srautų pavidalu, kai klientas pakartotinai naudoja „read ()“ metodą. Šis „ read ()“ operacijos procesas tęsiasi tol, kol pasiekia bloko pabaigą.
  6. Pasiekus bloko pabaigą, DFSInputStream uždaro ryšį ir pereina ieškoti kito duomenų bloko kitam blokui
  7. Kai klientas atliks skaitymą, jis iškvies uždarymo () metodą.

Rašymo operacija HDFS

Šiame skyriuje suprasime, kaip duomenys įrašomi į HDFS per failus.

  1. Klientas inicijuoja rašymo operaciją iškvietęs objekto DistributedFileSystem metodą „create ()“, kuris sukuria naują failą - žingsnis Nr. 1 aukščiau pateiktoje diagramoje.
  2. Objektas „DistributedFileSystem“ prisijungia prie „NameNode“ naudodamas RPC iškvietimą ir pradeda naujo failo kūrimą. Tačiau šis failas sukuria operaciją nesieja jokių failų blokų. „NameNode“ yra atsakinga patikrinti, ar failo (kuris yra kuriamas) dar nėra, o klientas turi teisingus leidimus kurti naują failą. Jei failas jau egzistuoja arba klientas neturi pakankamo leidimo sukurti naują failą, IOException perduodama klientui. Kitu atveju operacija pavyksta ir „NameNode“ sukuria naują failo įrašą.
  3. Sukūrus naują „NameNode“ įrašą, klientui grąžinamas FSDataOutputStream tipo objektas. Klientas naudoja ją įrašydamas duomenis į HDFS. Naudojamas duomenų rašymo metodas (3 žingsnis diagramoje).
  4. FSDataOutputStream yra objektas DFSOutputStream, kuris prižiūri ryšį su DataNodes ir NameNode. Kol klientas toliau rašo duomenis, „ DFSOutputStream“ toliau kuria paketus su šiais duomenimis. Šie paketai yra sudaryti į eilę, kuri vadinama „ DataQueue“ .
  5. Yra dar vienas komponentas, vadinamas „ DataStreamer“, kuris sunaudoja šią „ DataQueue“ . „DataStreamer“ taip pat prašo „NameNode“ paskirstyti naujus blokus, taip pasirinkdamas norimus „DataNodes“, kurie bus naudojami replikacijai.
  6. Dabar replikacijos procesas prasideda sukūrus vamzdyną naudojant „DataNodes“. Mūsų atveju mes pasirinkome 3 replikacijos lygį ir todėl yra 3 „DataNodes“.
  7. „DataStreamer“ pila paketus į pirmąjį vamzdyno „DataNode“.
  8. Kiekvienas dujotiekio duomenų mazgas saugo gautą paketą ir perduoda tą patį dujotiekio antrajam duomenų mazgui.
  9. Kitą eilę „Ack Queue“ palaiko „DFSOutputStream“, kad saugotų paketus, kurie laukia patvirtinimo iš „DataNodes“.
  10. Gavus paketo, esančio eilėje, patvirtinimą iš visų „DataNodes“, vykstančių dujotiekyje, jis pašalinamas iš „Ack Queue“. Sugedus „DataNode“, operacijai atnaujinti naudojami šios eilės paketai.
  11. Kai klientas baigia rašyti duomenis, jis iškviečia uždarymo () metodą (9 žingsnis diagramoje). Skambinimas uždaryti () lemia likusių duomenų paketų praplovimą dujotiekyje, po kurio laukia patvirtinimo.
  12. Gavus galutinį patvirtinimą, susisiekiama su „NameNode“, nurodant, kad failo rašymo operacija baigta.

Pasiekite HDFS naudodami JAVA API

Šiame skyriuje bandome suprasti „Java“ sąsają, naudojamą norint pasiekti „Hadoop“ failų sistemą.

Siekdamas programiškai sąveikauti su „Hadoop“ failų sistema, „Hadoop“ teikia kelias JAVA klases. Pakete, pavadintame org.apache.hadoop.fs, yra klasės, naudingos manipuliuojant failu Hadoop failų sistemoje. Šios operacijos apima, atidarymą, skaitymą, rašymą ir uždarymą. Tiesą sakant, „Hadoop“ failų API yra bendroji ir gali būti išplėsta, kad sąveikautų su kitomis failų sistemomis, išskyrus HDFS.

Programinis failo skaitymas iš HDFS

Objektas java.net.URL naudojamas failo turiniui nuskaityti. Pirmiausia turime priversti „Java“ atpažinti „Hadoop“ hdfs URL schemą. Tai daroma iškviečiant metodą setURLStreamHandlerFactory URL objekte ir jam perduodamas FsUrlStreamHandlerFactory egzempliorius. Šį metodą kiekvienam JVM reikia atlikti tik vieną kartą, todėl jis yra įtrauktas į statinį bloką.

Kodo pavyzdys yra

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);}}}

Šis kodas atidaro ir nuskaito failo turinį. Šio failo kelias HDFS yra perduodamas programai kaip komandinės eilutės argumentas.

Pasiekite HDFS naudodami „COMMAND-LINE INTERFACE“

Tai yra vienas iš paprasčiausių būdų bendrauti su HDFS. Komandinės eilutės sąsaja palaiko failų sistemos operacijas, tokias kaip failo skaitymas, katalogų kūrimas, failų perkėlimas, duomenų ištrynimas ir katalogų sąrašas.

Mes galime paleisti '$ HADOOP_HOME / bin / hdfs dfs -help', kad gautume išsamią pagalbą kiekvienai komandai. Čia „dfs“ yra „HDFS“ apvalkalo komanda, palaikanti kelis potvarkius.

Kai kurios plačiai naudojamos komandos yra išvardytos žemiau, kartu pateikiant kai kurias jų detales.

1. Nukopijuokite failą iš vietinės failų sistemos į HDFS

$HADOOP_HOME/bin/hdfs dfs -copyFromLocal temp.txt /

Ši komanda nukopijuoja failą temp.txt iš vietinės failų sistemos į HDFS.

2. Kataloge esančius failus galime išvardyti naudodami -ls

$HADOOP_HOME/bin/hdfs dfs -ls /

Matome, kad failas „temp.txt“ (nukopijuotas anksčiau) yra įtrauktas į katalogą „/“ .

3. Komanda nukopijuoti failą į vietinę failų sistemą iš HDFS

$HADOOP_HOME/bin/hdfs dfs -copyToLocal /temp.txt

Matome, kad temp.txt nukopijuotas į vietinę failų sistemą.

4. Komanda sukurkite naują katalogą

$HADOOP_HOME/bin/hdfs dfs -mkdir /mydirectory

Patikrinkite, ar katalogas yra sukurtas, ar ne. Dabar turėtumėte žinoti, kaip tai padaryti ;-)

Įdomios straipsniai...