Tutorial HDFS: architettura, lettura e Scrivi operazione utilizzando l'API Java

Sommario:

Anonim

Cos'è HDFS?

HDFS è un file system distribuito per l'archiviazione di file di dati di grandi dimensioni, eseguito su cluster di hardware comune. È a tolleranza di errore, scalabile ed estremamente semplice da espandere. Hadoop viene fornito in bundle con HDFS ( Hadoop Distributed File System ).

Quando i dati superano la capacità di archiviazione su una singola macchina fisica, diventa essenziale dividerli tra più macchine separate. Un file system che gestisce operazioni specifiche di archiviazione su una rete di macchine è chiamato file system distribuito. HDFS è uno di questi software.

In questo tutorial impareremo,

  • Cos'è HDFS?
  • Architettura HDFS
  • Leggi operazione
  • Scrivi operazione
  • Accedi a HDFS utilizzando l'API JAVA
  • Accedi a HDFS utilizzando l'INTERFACCIA A RIGA DI COMANDO

Architettura HDFS

Il cluster HDFS è costituito principalmente da un NameNode che gestisce i metadati del file system e da un DataNodes che archivia i dati effettivi .

  • NameNode: NameNode può essere considerato come un master del sistema. Mantiene l'albero del file system e i metadati per tutti i file e le directory presenti nel sistema. Due file "Namespace image" e "edit log" vengono utilizzati per memorizzare le informazioni sui metadati. Namenode conosce tutti i datanode contenenti blocchi di dati per un dato file, tuttavia, non memorizza le posizioni dei blocchi in modo persistente. Queste informazioni vengono ricostruite ogni volta dai datanode all'avvio del sistema.
  • DataNode: i DataNode sono slave che risiedono su ogni macchina in un cluster e forniscono l'effettiva memoria. È responsabile della gestione, lettura e scrittura delle richieste per i client.

Le operazioni di lettura / scrittura in HDFS operano a livello di blocco. I file di dati in HDFS vengono suddivisi in blocchi delle dimensioni di un blocco, che vengono archiviati come unità indipendenti. La dimensione predefinita del blocco è 64 MB.

HDFS opera su un concetto di replica dei dati in cui vengono create più repliche di blocchi di dati e vengono distribuite sui nodi in un cluster per consentire un'elevata disponibilità dei dati in caso di guasto del nodo.

Lo sai? Un file in HDFS, che è più piccolo di un singolo blocco, non occupa la memoria completa di un blocco.

Leggi operazione in HDFS

La richiesta di lettura dei dati viene fornita da HDFS, NameNode e DataNode. Chiamiamo il lettore come un "cliente". Il diagramma sottostante mostra l'operazione di lettura dei file in Hadoop.

  1. Un client avvia una richiesta di lettura chiamando il metodo 'open ()' dell'oggetto FileSystem; è un oggetto di tipo DistributedFileSystem .
  2. Questo oggetto si connette a namenode utilizzando RPC e ottiene informazioni sui metadati come le posizioni dei blocchi del file. Tieni presente che questi indirizzi sono i primi pochi blocchi di un file.
  3. In risposta a questa richiesta di metadati, vengono restituiti gli indirizzi dei DataNode che hanno una copia di quel blocco.
  4. Una volta ricevuti gli indirizzi dei DataNodes, al client viene restituito un oggetto di tipo FSDataInputStream . FSDataInputStream contiene DFSInputStream che si occupa delle interazioni con DataNode e NameNode. Nel passaggio 4 mostrato nel diagramma sopra, un client richiama il metodo 'read ()' che fa sì che DFSInputStream stabilisca una connessione con il primo DataNode con il primo blocco di un file.
  5. I dati vengono letti sotto forma di flussi in cui il client richiama ripetutamente il metodo "read ()" . Questo processo dell'operazione read () continua finché non raggiunge la fine del blocco.
  6. Una volta raggiunta la fine di un blocco, DFSInputStream chiude la connessione e passa alla ricerca del DataNode successivo per il blocco successivo
  7. Una volta che un client ha terminato la lettura, chiama un metodo close () .

Scrivi operazione in HDFS

In questa sezione, capiremo come i dati vengono scritti in HDFS tramite i file.

  1. Un client avvia l'operazione di scrittura chiamando il metodo 'create ()' dell'oggetto DistributedFileSystem che crea un nuovo file - Passaggio n. 1 nel diagramma sopra.
  2. L'oggetto DistributedFileSystem si connette a NameNode utilizzando la chiamata RPC e avvia la creazione di un nuovo file. Tuttavia, questo file crea l'operazione non associa alcun blocco al file. È responsabilità di NameNode verificare che il file (che viene creato) non esista già e che un client disponga delle autorizzazioni corrette per creare un nuovo file. Se un file esiste già o il client non dispone di autorizzazioni sufficienti per creare un nuovo file, al client viene generata IOException . In caso contrario, l'operazione ha esito positivo e un nuovo record per il file viene creato da NameNode.
  3. Una volta creato un nuovo record in NameNode, al client viene restituito un oggetto di tipo FSDataOutputStream. Un client lo utilizza per scrivere dati nell'HDFS. Viene richiamato il metodo di scrittura dei dati (passaggio 3 nel diagramma).
  4. FSDataOutputStream contiene l'oggetto DFSOutputStream che si occupa della comunicazione con DataNodes e NameNode. Mentre il client continua a scrivere dati, DFSOutputStream continua a creare pacchetti con questi dati. Questi pacchetti vengono accodati in una coda chiamata DataQueue .
  5. C'è un altro componente chiamato DataStreamer che consuma questo DataQueue . DataStreamer chiede inoltre a NameNode l'allocazione di nuovi blocchi, selezionando così i DataNode desiderabili da utilizzare per la replica.
  6. Ora, il processo di replica inizia creando una pipeline utilizzando DataNodes. Nel nostro caso, abbiamo scelto un livello di replica di 3 e quindi ci sono 3 DataNode nella pipeline.
  7. Il DataStreamer riversa i pacchetti nel primo DataNode nella pipeline.
  8. Ogni DataNode in una pipeline archivia il pacchetto ricevuto da esso e lo inoltra al secondo DataNode in una pipeline.
  9. Un'altra coda, "Ack Queue", viene gestita da DFSOutputStream per archiviare i pacchetti in attesa di riconoscimento da DataNodes.
  10. Una volta ricevuto il riconoscimento per un pacchetto nella coda da tutti i DataNode nella pipeline, viene rimosso dalla "Coda di riconoscimento". In caso di qualsiasi errore del DataNode, i pacchetti di questa coda vengono utilizzati per riavviare l'operazione.
  11. Dopo che un client ha terminato di scrivere i dati, chiama un metodo close () (passaggio 9 nel diagramma) Chiama a close (), i risultati nello svuotare i pacchetti di dati rimanenti nella pipeline seguito dall'attesa del riconoscimento.
  12. Una volta ricevuto un riconoscimento finale, NameNode viene contattato per comunicargli che l'operazione di scrittura del file è stata completata.

Accedi a HDFS utilizzando l'API JAVA

In questa sezione, proviamo a comprendere l'interfaccia Java utilizzata per accedere al file system di Hadoop.

Per interagire con il filesystem di Hadoop a livello di programmazione, Hadoop fornisce più classi JAVA. Il pacchetto denominato org.apache.hadoop.fs contiene classi utili nella manipolazione di un file nel filesystem di Hadoop. Queste operazioni includono, aprire, leggere, scrivere e chiudere. In realtà, l'API di file per Hadoop è generica e può essere estesa per interagire con altri file system diversi da HDFS.

Lettura di un file da HDFS, a livello di programmazione

L'oggetto java.net.URL viene utilizzato per leggere il contenuto di un file. Per cominciare, dobbiamo fare in modo che Java riconosca lo schema URL hdfs di Hadoop. Questo viene fatto chiamando il metodo setURLStreamHandlerFactory sull'oggetto URL e ad esso viene passata un'istanza di FsUrlStreamHandlerFactory. Questo metodo deve essere eseguito solo una volta per JVM, quindi è racchiuso in un blocco statico.

Un codice di esempio è-

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

Questo codice apre e legge il contenuto di un file. Il percorso di questo file su HDFS viene passato al programma come argomento della riga di comando.

Accedi a HDFS utilizzando l'INTERFACCIA A RIGA DI COMANDO

Questo è uno dei modi più semplici per interagire con HDFS. L'interfaccia della riga di comando supporta le operazioni del file system come leggere il file, creare directory, spostare file, eliminare dati ed elencare directory.

Possiamo eseguire "$ HADOOP_HOME / bin / hdfs dfs -help" per ottenere una guida dettagliata su ogni comando. Qui, "dfs" è un comando shell di HDFS che supporta più sottocomandi.

Alcuni dei comandi ampiamente utilizzati sono elencati di seguito insieme ad alcuni dettagli di ciascuno.

1. Copiare un file dal file system locale su HDFS

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

Questo comando copia il file temp.txt dal filesystem locale su HDFS.

2. Possiamo elencare i file presenti in una directory usando -ls

$HADOOP_HOME/bin/hdfs dfs -ls /

Possiamo vedere un file "temp.txt" (copiato in precedenza) elencato nella directory "/" .

3. Comando per copiare un file nel filesystem locale da HDFS

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

Possiamo vedere temp.txt copiato su un filesystem locale.

4. Comando per creare una nuova directory

$HADOOP_HOME/bin/hdfs dfs -mkdir /mydirectory

Controlla se una directory è stata creata o meno. Ora dovresti sapere come farlo ;-)