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 marfă. Este tolerant la erori, scalabil și extrem de simplu de extins. Hadoop vine la pachet cu HDFS ( sisteme de fișiere distribuite Hadoop ).
Când datele depășesc capacitatea de stocare pe o singură mașină fizică, devine esențială împărțirea acesteia într-un număr de 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.
În acest tutorial, vom învăța,
- Ce este HDFS?
- Arhitectură HDFS
- Citiți Operațiunea
- Operațiune de scriere
- Accesați HDFS utilizând API-ul JAVA
- Accesați HDFS utilizând INTERFATA COMANDĂ-LINIE
Arhitectură HDFS
Clusterul HDFS constă în principal dintr-un NameNode care gestionează metadatele sistemului de fișiere și un DataNodes care stochează datele reale .
- NameNode: NameNode poate fi considerat un maestru al sistemului. Acesta menține arborele sistemului de fișiere și metadatele pentru toate fișierele și directoarele prezente în sistem. Două fișiere „Imagine spațiu nume” și „jurnal editare” sunt utilizate pentru a stoca informații despre metadate. Namenode are cunoștințe despre toate codurile de date care conțin blocuri de date pentru un fișier dat, cu toate acestea, nu stochează în mod persistent locațiile blocurilor. Aceste informații sunt reconstituite de fiecare dată din datanodes când sistemul pornește.
- DataNode: DataNode sunt sclave care se află pe fiecare mașină dintr-un cluster și oferă stocarea reală. Este responsabil pentru servirea, citirea și scrierea cererilor pentru clienți.
Operațiile 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 dimensiuni bloc, care sunt stocate ca unități independente. Dimensiunea blocului implicit este de 64 MB.
HDFS funcționează pe un concept de replicare a datelor în care sunt create replici multiple de blocuri de date și sunt distribuite pe noduri în întregul cluster pentru a permite o disponibilitate ridicată a datelor în caz de eșec al nodului.
Știi? Un fișier în HDFS, care este mai mic decât un singur bloc, nu ocupă stocarea completă a unui bloc.
Citiți Operațiunea în HDFS
Cererea de citire a datelor este deservită de HDFS, NameNode și DataNode. Să numim cititorul ca „client”. Diagrama de mai jos prezintă operația de citire a fișierelor în Hadoop.
- Un client inițiază cererea de citire apelând metoda „open ()” a obiectului FileSystem; este un obiect de tip DistributedFileSystem .
- Acest obiect se conectează la namenode folosind RPC și primește 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 DataNodes care au o copie a acelui bloc sunt returnate înapoi.
- Odată primite adresele DataNodes, un obiect de tip FSDataInputStream este returnat clientului. FSDataInputStream conține DFSInputStream care are grijă 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 cu primul bloc al unui fișier.
- Datele sunt citite sub formă de fluxuri în care clientul invocă în mod repetat metoda „read ()” . Acest proces de operare read () continuă până ajunge la sfârșitul blocului.
- Odată ajuns la sfârșitul unui bloc, DFSInputStream închide conexiunea și trece la localizarea următorului DataNode pentru următorul bloc
- Odată ce un client a terminat citirea, apelează o metodă close () .
Scrieți operațiunea în HDFS
În această secțiune, vom înțelege modul în care datele sunt scrise în HDFS prin fișiere.
- Un client inițiază operațiunea de scriere apelând metoda 'create ()' a obiectului DistributedFileSystem care creează un fișier nou - Pasul nr. 1 în diagrama de mai sus.
- Obiectul DistributedFileSystem se conectează la NameNode utilizând apelul RPC și inițiază crearea de fișiere noi. Cu toate acestea, acest fișier creează operațiunea 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 permisiuni corecte pentru a crea un fișier nou. Dacă există deja un fișier sau clientul nu are permisiunea suficientă pentru a crea un fișier nou, atunci IOException este aruncat clientului. În caz contrar, operațiunea reușește și o nouă înregistrare pentru fișier este creată de NameNode.
- Odată ce se creează o nouă înregistrare în NameNode, un obiect de tip FSDataOutputStream este returnat clientului. Un client îl folosește pentru a scrie date în HDFS. Se invocă metoda de scriere a datelor (pasul 3 din diagramă).
- FSDataOutputStream conține 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 în coadă într-o coadă numită DataQueue .
- Există încă o componentă numită DataStreamer care consumă această DataQueue . DataStreamer solicită, de asemenea, NameNode pentru alocarea de noi blocuri, alegând astfel DataNodes de dorit 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 toarnă pachete în primul DataNode din conductă.
- Fiecare DataNode dintr-o conductă stochează pachetul primit de acesta și îl redirecționează la 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 în coadă este primită de la toate DataNodes din conductă, acesta este eliminat din „Ack Queue”. În cazul unei defecțiuni DataNode, pachetele din această coadă sunt utilizate pentru a reinicia operațiunea.
- După ce un client a terminat cu scrierea datelor, acesta apelează o metodă close () (Pasul 9 din diagramă) Apelare la închidere (), rezultă în spălarea pachetelor de date rămase în conductă 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șierelor este finalizată.
Accesați HDFS utilizând API-ul JAVA
În această secțiune, încercăm să înțelegem interfața Java utilizată pentru accesarea sistemului de fișiere Hadoop.
Pentru a interacționa cu sistemul de fișiere Hadoop programatic, Hadoop oferă mai multe clase JAVA. 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, deschide, citește, scrie și închide. 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, programat
Obiectul java.net.URL este utilizat pentru citirea conținutului unui fișier. Pentru început, trebuie să facem ca Java să recunoască schema URL a hado-urilor Hadoop. Acest lucru se face apelând metoda setURLStreamHandlerFactory pe obiectul URL și o instanță a FsUrlStreamHandlerFactory îi este transmisă. Această metodă trebuie executată o singură dată pe JVM, prin urmare este inclusă î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 acestui fișier pe HDFS este transmisă programului ca argument de linie de comandă.
Accesați HDFS utilizând INTERFATA COMANDĂ-LINIE
Acesta este unul dintre cele mai simple moduri de a interacționa cu HDFS. Interfața din linia de comandă are suport pentru operațiile sistemului de fișiere, cum ar fi citirea fișierului, crearea de directoare, mutarea fișierelor, ștergerea datelor și listarea directoarelor.
Putem rula „$ HADOOP_HOME / bin / hdfs dfs -help” pentru a obține ajutor detaliat la 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) listat în directorul „/” .
3. Comandați 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ți pentru a crea un nou director
$HADOOP_HOME/bin/hdfs dfs -mkdir /mydirectory
Verificați dacă este creat sau nu un director. Acum, ar trebui să știi cum să o faci ;-)