Tutorial HDFS: Architectură, Citiți și Scrieți Operation folosind Java API
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 de bază. Este tolerant la erori, scalabil și extrem de simplu de extins. Hadoop vine la pachet HDFS (Sisteme de fișiere distribuite Hadoop).
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ă
Clusterul HDFS constă în principal dintr-un NameNode care gestionează sistemul de fișiere Metadata și DataNodes care stochează date reale.
- NameNode: NameNode poate fi considerat un maestru al sistemului. Menține arborele sistemului de fișiere și metadatele pentru toate fișierele și directoarele prezente în sistem. Două dosare „Imagine cu spațiu de nume” si „editează jurnalul” sunt folosite pentru a stoca informații despre metadate. Namenode cunoaște toate nodurile de date care conțin blocuri de date pentru un fișier dat, cu toate acestea, nu stochează locațiile blocurilor în mod persistent. Aceste informații sunt reconstruite de fiecare dată din noduri de date când sistemul pornește.
- DataNode: DataNodes sunt sclavi care locuiesc pe fiecare mașină dintr-un cluster și asigură stocarea reală. Este responsabil pentru deservirea, citirea și scrierea cererilor pentru clienți.
Operațiunile de citire/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.
HDFS funcționează pe un concept de replicare a datelor în care sunt create mai multe replici ale blocurilor de date și sunt distribuite pe noduri de-a lungul unui cluster pentru a permite disponibilitatea ridicată a datelor în cazul defecțiunii nodului.
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.
Citeste OperaÎn HDFS
Solicitarea de citire a datelor este deservită de HDFS, NameNode și DataNode. Să numim cititorul drept „client”. Diagrama de mai jos prezintă operația de citire a fișierului în Hadoop.
- Un client inițiază cererea de citire prin apelare 'deschis()' metoda obiectului FileSystem; 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. Vă rugăm să rețineți că aceste adrese sunt din primele câteva blocuri ale unui fișier.
- Ca răspuns la această solicitare de metadate, adresele nodurilor de date care au o copie a acelui bloc sunt returnate.
-
Odată ce adresele DataNodes 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ă 'citit()' metoda care provoaca DFSInputStream pentru a stabili o conexiune cu primul DataNode cu primul bloc al unui fișier.
-
Datele sunt citite sub formă de fluxuri în care clientul invocă 'citit()' metoda în mod repetat. Acest proces de citit() operațiunea 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 trece mai departe pentru a localiza următorul DataNode pentru următorul bloc
- Odată ce un client a terminat cu citirea, sună o inchidere() metodă.
Scrie OperaÎn HDFS
În această secțiune, vom înțelege cum sunt scrise datele în HDFS prin fișiere.
- Un client inițiază operația 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 apelul RPC și inițiază crearea de fișiere noi. Cu toate acestea, acest fișier creează operațiuni care nu asociază niciun bloc cu fișierul. Este responsabilitatea NameNode să verifice dacă fișierul (care este creat) nu există deja și un client are permisiunile corecte pentru a crea un fișier nou. Dacă un fișier există deja sau clientul nu are permisiunea suficientă pentru a crea un fișier nou, atunci IOException este aruncat clientului. În caz contrar, operația reușește și o nouă înregistrare pentru fișier este creată de către NameNode.
- Odată ce o înregistrare nouă în NameNode este creată, un obiect de tip FSDataOutputStream este returnat clientului. Un client îl folosește pentru a scrie date în HDFS. Este invocată metoda de scriere a datelor (pasul 3 din diagramă).
- FSDataOutputStream conține obiectul DFSOutputStream care are grijă 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 în coadă într-o coadă numită ca Coada de date.
- Mai există o componentă numită DataStreamer care consumă asta Coada de date. DataStreamer cere, de asemenea, NameNode alocarea de noi blocuri, alegând astfel nodurile de date dorite pentru a fi utilizate 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 acesta și îl transmite către al doilea DataNode dintr-o 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ă cu scrierea datelor, apelează o metodă close() (Pasul 9 din diagramă) Call to close(), are ca rezultat eliminarea pachetelor de date rămase în conductă, urmată de așteptarea confirmării.
- Odată ce este primită o confirmare finală, NameNode este contactat pentru a-i spune că operația de scriere a fișierului este finalizată.
Accesați HDFS folosind API-ul JAVA
În această secțiune, încercăm să înțelegem Java interfață utilizată pentru accesarea sistemului de fișiere Hadoop.
Pentru a interacționa programatic cu sistemul de fișiere Hadoop, Hadoop oferă mai multe clase JAVA. Pachetul numit org.apache.hadoop.fs conține clase utile în manipularea unui fișier din sistemul de fișiere Hadoop. Aceste operațiuni includ deschiderea, citirea, scrierea și închiderea. De fapt, API-ul de fișiere pentru Hadoop este generic și poate fi extins pentru a interacționa cu alte sisteme de fișiere, altele 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ți schema URL hdfs a Hadoop. Acest lucru se face prin apel setURLStreamHandlerFactory metoda pe obiectul URL și i se transmite o instanță a lui 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 deschide și citește conținutul unui fișier. Calea acestui fișier pe HDFS este transmisă programului ca argument în linia de comandă.
Accesați HDFS folosind INTERFAȚA DE COMANDĂ
Aceasta este una dintre cele mai simple moduri de a interacționa cu HDFS. Interfața de linie de comandă are suport pentru operațiuni ale sistemului de fișiere, cum ar fi citirea fișierului, crearea directoarelor, 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.
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.
2. Putem lista fișierele prezente într-un director folosind -ls
$HADOOP_HOME/bin/hdfs dfs -ls /
Putem vedea un fișier „temp.txt” (copiat mai devreme) fiind enumerate sub '/' director.
3. Comanda pentru a copia un fișier în sistemul de fișiere local din HDFS
$HADOOP_HOME/bin/hdfs dfs -copyToLocal /temp.txt
Putem vedea temp.txt copiat într-un sistem de fișiere local.
4. Comanda pentru a crea un director nou
$HADOOP_HOME/bin/hdfs dfs -mkdir /mydirectory
Verificați dacă un director este creat sau nu. Acum, ar trebui să știi cum să o faci 😉