Tutorial HDFS: Architectură, Citiți și Scrieți OperaTION
⚡ Rezumat inteligent
HDFS este stratul de stocare distribuit al Hadoop, care împarte fișierele foarte mari în blocuri replicate pe mașini comune, astfel încât un singur NameNode tracks metadate, în timp ce multe DataNode-uri deservesc cererile de citire și scriere în mod fiabil.
Ce este HDFS?
HDFS este un sistem de fișiere distribuit pentru stocarea fișierelor de date foarte mari, care rulează pe clustere de hardware obișnuit. Este tolerant la erori, scalabil și extrem de simplu de extins. Hadoop vine la pachet cu HDFS (Hadoop Distributed File System).
Când datele depășesc capacitatea de stocare pe o singură mașină fizică, devine esențial să le împărțim pe mai multe mașini separate. Un sistem de fișiere care gestionează operațiuni specifice de stocare într-o rețea de mașini se numește sistem de fișiere distribuit. HDFS este un astfel de software.
HDFS Architectură
Un cluster HDFS constă în principal dintr-un NameNode care gestionează metadatele sistemului de fișiere și DataNodes care stochează datele propriu-zise.
- NameNode: NameNode poate fi considerat maestrul sistemului. Acesta menține arborele sistemului de fișiere și metadatele pentru toate fișierele și directoarele prezente în sistem. Două fișiere, „imaginea spațiului de nume” și „jurnalul de editare”, sunt folosite pentru a stoca informații despre metadate. NameNode are cunoștințe despre toate DataNode-urile care conțin blocuri de date pentru un anumit fișier, însă nu stochează persistent locațiile blocurilor. Aceste informații sunt reconstruite de fiecare dată din DataNode-uri la pornirea sistemului.
- DataNode: Nodurile de date sunt slave care se află pe fiecare mașină dintr-un cluster și asigură stocarea propriu-zisă. Acestea sunt responsabile pentru servirea cererilor de citire și scriere de la clienți.
Deoarece un NameNode singular ar fi un punct unic de defecțiune, clusterele actuale rulează un NameNode activ alături de un NameNode în standby care partajează jurnalul de editări printr-un cvorum de JournalNode-uri, cu failover automat între cele două.
Operațiunile de citire și scriere în HDFS funcționează la nivel de bloc. Fișierele de date din HDFS sunt împărțite în bucăți de dimensiunea unui bloc, care sunt stocate ca unități independente. Dimensiunea implicită a blocului este de 64 MB în Hadoop 1.x. De la Hadoop 2.x încolo, dimensiunea implicită dfs.blocksize este de 128 MB.
HDFS funcționează pe baza conceptului de replicare a datelor, în care sunt create mai multe replici ale blocurilor de date și sunt distribuite pe noduri în cadrul unui cluster pentru a permite o disponibilitate ridicată a datelor în cazul unei defecțiuni a nodului. Factorul de replicare implicit este trei (dfs.replication), iar când un DataNode nu mai trimite pulsuri, NameNode își replică automat blocurile în altă parte.
Tu stii? Un fișier în HDFS, care este mai mic decât un singur bloc, nu ocupă spațiul de stocare complet al unui bloc.
Citiți OperaÎn HDFS
O cerere de citire a datelor este deservită de HDFS, NameNode și DataNode-uri. Să numim cititorul „client”. Diagrama de mai jos ilustrează operațiunea de citire a fișierelor în Hadoop.
- Un client inițiază o cerere de citire apelând metoda „open()” a obiectului FileSystem; acesta este un obiect de tip DistributedFileSystem.
- Acest obiect se conectează la NameNode folosind RPC și obține informații despre metadate, cum ar fi locațiile blocurilor fișierului. Rețineți că aceste adrese sunt ale primelor blocuri ale unui fișier.
- Ca răspuns la această solicitare de metadate, sunt returnate adresele DataNode-urilor care au o copie a blocului respectiv.
- Odată ce adresele DataNode-urilor sunt primite, un obiect de tip FSDataInputStream este returnat clientului. FSDataInputStream conține DFSInputStream, care se ocupă de interacțiunile cu DataNode și NameNode. În pasul 4, prezentat în diagrama de mai sus, un client invocă metoda „read()”, care determină DFSInputStream să stabilească o conexiune cu primul DataNode care deține primul bloc al unui fișier.
- Datele sunt citite sub formă de fluxuri (stream-uri) în care clientul invocă metoda „read()” în mod repetat. Acest proces al operației read() continuă până când ajunge la sfârșitul blocului.
- Odată ce se ajunge la sfârșitul unui bloc, DFSInputStream închide conexiunea și continuă să localizeze următorul DataNode pentru blocul următor.
- După ce clientul a terminat de citit, acesta apelează metoda close().
Scrie OperaÎn HDFS
În această secțiune, vom înțelege cum sunt scrise datele în HDFS prin intermediul fișierelor. Diagrama de mai jos traces care scriu calea.
- Un client inițiază o operațiune de scriere apelând metoda „create()” a obiectului DistributedFileSystem, care creează un fișier nou – Pasul nr. 1 din diagrama de mai sus.
- Obiectul DistributedFileSystem se conectează la NameNode folosind un apel RPC și inițiază crearea unui nou fișier. Cu toate acestea, această operațiune de creare a fișierului nu asociază niciun bloc cu fișierul. Este responsabilitatea NameNode să verifice dacă fișierul (care este creat) nu există deja și dacă clientul are permisiunile corecte pentru a crea un fișier nou. Dacă un fișier există deja sau clientul nu are permisiuni suficiente pentru a crea un fișier nou, atunci o excepție IOException este generată către client. În caz contrar, operațiunea reușește și o nouă înregistrare pentru fișier este creată de NameNode.
- Odată ce o nouă înregistrare în NameNode este creată, un obiect de tip FSDataOutputStream este returnat clientului. Un client îl folosește pentru a scrie date în HDFS. Metoda de scriere a datelor este invocată (pasul 3 din diagramă).
- FSDataOutputStream conține un obiect DFSOutputStream care se ocupă de comunicarea cu DataNodes și NameNode. În timp ce clientul continuă să scrie date, DFSOutputStream continuă să creeze pachete cu aceste date. Aceste pachete sunt puse într-o coadă numită DataQueue.
- Există încă o componentă numită DataStreamer care consumă această coadă de date (DataQueue). DataStreamer solicită, de asemenea, NameNode-ului alocarea de noi blocuri, alegând astfel nodurile de date dorite pentru replicare.
- Acum, procesul de replicare începe prin crearea unei conducte folosind DataNodes. În cazul nostru, am ales un nivel de replicare de 3 și, prin urmare, există 3 DataNodes în conductă.
- DataStreamer-ul toarnă pachete în primul DataNode din conductă.
- Fiecare DataNode dintr-o conductă stochează pachetul primit de el și îl transmite mai departe către al doilea DataNode din conductă.
- O altă coadă, „Ack Queue”, este menținută de DFSOutputStream pentru a stoca pachetele care așteaptă confirmarea de la DataNodes.
- Odată ce confirmarea pentru un pachet din coadă este primită de la toate nodurile de date din conductă, acesta este eliminat din „Coada de confirmare”. În cazul oricărei defecțiuni DataNode, pachetele din această coadă sunt folosite pentru a reiniționa operația.
- După ce un client termină de scris datele, acesta apelează metoda close() (Pasul 9 din diagramă). Apelul către close() are ca rezultat trimiterea pachetelor de date rămase în canal, urmată de așteptarea confirmării.
- Odată ce se primește o confirmare finală, NameNode este contactat pentru a-i spune că operațiunea de scriere a fișierului s-a finalizat.
Accesați HDFS utilizând Java API
În această secțiune, încercăm să înțelegem Java interfață utilizată pentru accesarea sistemului de fișiere Hadoop.
Pentru a interacționa cu sistemul de fișiere Hadoop în mod programatic, Hadoop oferă mai multe Java clase. Pachetul numit org.apache.hadoop.fs conține clase utile în manipularea unui fișier în sistemul de fișiere Hadoop. Aceste operațiuni includ deschiderea, citirea, scrierea și închiderea. API-ul de fișiere Hadoop este generic și poate fi extins pentru a interacționa cu alte sisteme de fișiere decât HDFS.
Citirea unui fișier din HDFS, în mod programatic
Obiect java.net.URL este folosit pentru a citi conținutul unui fișier. Pentru început, trebuie să facem Java recunoaște fișierele HDF din Hadoop URL schemă. Acest lucru se face prin apelarea mulțimiiURLMetoda StreamHandlerFactory pe URL obiect și transmițându-i o instanță a FsUrlStreamHandlerFactory. Această metodă trebuie executată o singură dată pe FMV, prin urmare este închis într-un bloc static.
Un exemplu de cod este-
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); } } }
Acest cod se deschide și citește conținutul unui fișier. Calea către acest fișier pe HDFS este transmisă programului ca argument în linia de comandă.
Accesarea HDFS utilizând interfața liniei de comandă
Aceasta este una dintre cele mai simple metode de a interacționa cu HDFS. Interfața din linia de comandă oferă suport pentru operațiuni ale sistemului de fișiere, cum ar fi citirea unui fișier, crearea de directoare, mutarea fișierelor, ștergerea datelor și listarea directoarelor.
Putem alerga „$HADOOP_HOME/bin/hdfs dfs -help” pentru a obține ajutor detaliat pentru fiecare comandă. Aici, „dfs” este o comandă shell a HDFS care acceptă mai multe subcomenzi. În versiunile actuale de Hadoop fișiere HDFS DFS este forma preferată, în timp ce cea mai veche sistem de funcționare Hadoop Comanda efectuează aceeași lucrare pentru orice sistem de fișiere acceptat.
Unele dintre comenzile utilizate pe scară largă sunt enumerate mai jos, împreună cu câteva detalii despre fiecare.
1. Copiați un fișier din sistemul de fișiere local în HDFS
$HADOOP_HOME/bin/hdfs dfs -copyFromLocal temp.txt /
Această comandă copiază fișierul temp.txt din sistemul de fișiere local în HDFS, așa cum se arată în rezultatul de mai jos.
2. Putem lista fișierele prezente într-un director folosind -ls
$HADOOP_HOME/bin/hdfs dfs -ls /
În lista de mai jos putem vedea fișierul „temp.txt” (copiat anterior) în directorul „ / ”.
3. Comanda pentru a copia un fișier în sistemul de fișiere local din HDFS
$HADOOP_HOME/bin/hdfs dfs -copyToLocal /temp.txt
Această comandă oglindește comanda -get și acceptă o cale de destinație locală explicită ca al doilea argument. Rezultatul de mai jos arată fișierul temp.txt copiat în sistemul de fișiere local.
4. Comanda pentru a crea un director nou
$HADOOP_HOME/bin/hdfs dfs -mkdir /mydirectory
Comanda se finalizează în mod silențios, așa cum arată promptul de mai jos.
Verifică dacă directorul este creat sau nu. Acum, ar trebui să știi cum să faci asta 😉




