# Apache Hadoop

Apache Hadoop è un framework sotto una licenza libera che supporta applicazioni distribuite con elevato accesso ai dati, permettendo alle applicazioni di lavorare con migliaia di nodi e petabyte di dati. Ispirato dalla MapReduce di Google e dal Google File System, è un progetto della fondazione Apache di alto livello costruito e usato da una comunità globale di contributori, che usano i linguaggi di programmazione Java e Scala.
Usato anche da AOL, Ebay, Facebook, IBM, Linkedin, Spotify, The New York Times e Twitter, il più grande contributore a questo progetto è stato Yahoo!, e ne fa fortemente uso. Offre una grande quantità di librerie di semplice utilizzo ed ha per il momento tre versioni, la prima versione di Hadoop contiene Map Reduce e Hadoop Distributed File System (HDFS); dalla prima versione di Hadoop sono cambiate le necessità di prestazione, per questo motivo la seconda versione è stata quindi integrata con YARN.
Il nome del progetto è stato scelto dal suo creatore Doug Cutting, il quale ha scelto Hadoop, il nome dell'elefante di pezza di suo figlio. In origine fu sviluppato per supportare la distribuzione per il progetto del motore di ricerca Nutch.

## Struttura

Hadoop, inteso in senso stretto, è composto da HDFS, MapReduce e YARN. Per ecosistema Hadoop si intendono tutti gli strumenti realizzati appositamente per integrarsi con questi, quali ad esempio Sqoop, Hive, Flume.

### File System

L'Hadoop Distributed File System (in sigla HDFS) è un file system distribuito, portabile e scalabile scritto in Java per il framework Hadoop. Un cluster in Hadoop tipicamente possiede uno o più name node (su cui risiedono i metadati dei file) e un insieme di data node (su cui risiedono, in blocchi di dimensione fissa, i file dell'HDFS). I formati più usati per i file su HDFS sono Comma-separated values, Apache Avro, Apache ORC e Apache Parquet.
HDFS viene utilizzato per l'archiviazione dei dati e MapReduce viene utilizzato per l'elaborazione dei dati. HDFS ha cinque servizi.
I primi tre sono servizi master/demoni/nodi e gli ultimi due sono servizi slave. I servizi Master possono comunicare tra loro e allo stesso modo i servizi Slave possono comunicare tra loro. Name Node è un nodo master e Data node è il corrispondente nodo Slave e può comunicare tra loro.
Name Node: HDFS è costituito da un solo Name Node chiamato Master Node. Il nodo master può tenere traccia dei file, gestire il file system e ha i metadati di tutti i dati memorizzati al suo interno. In particolare, il nodo nome contiene i dettagli del numero di blocchi, le posizioni del nodo dati in cui sono archiviati i dati, dove sono archiviate le repliche e altri dettagli. Il nodo del nome ha un contatto diretto con il client.
Nodo dati: un nodo dati memorizza i dati in esso come blocchi. Questo è anche noto come nodo slave e memorizza i dati effettivi in HDFS che è responsabile della lettura e della scrittura da parte del client. Questi sono demoni schiavi. Ogni nodo Dati invia un messaggio Heartbeat al nodo Nome ogni 3 secondi e comunica che è vivo. In questo modo, quando Name Node non riceve un heartbeat da un nodo di dati per 2 minuti, considera quel nodo di dati come morto e avvia il processo di replica dei blocchi su un altro nodo di dati.
Nodo nome secondario: serve solo per prendersi cura dei punti di controllo dei metadati del file system che si trova nel nodo nome. Questo è anche noto come checkpoint Node. È il nodo di supporto per il nodo dei nomi. Il nodo del nome secondario indica al nodo del nome di creare e inviare il file fsimage e editlog, su cui il file fsimage compresso viene creato dal nodo del nome secondario.
Job Tracker: Job Tracker riceve le richieste di esecuzione di Map Reduce dal client. Job tracker comunica con il Name Node per conoscere la posizione dei dati che verranno utilizzati nell'elaborazione. Il Nodo Nome risponde con i metadati dei dati di elaborazione richiesti.
Task Tracker: è il nodo slave per il Job Tracker e prenderà l'attività dal Job Tracker. Riceve anche il codice dal Job Tracker. Task Tracker prenderà il codice e lo applicherà al file. Il processo di applicazione di quel codice sul file è noto come Mapper.
Hadoop supporta anche:
* Amazon S3 file system;
* Azure data lake store;
Hadoop può lavorare direttamente con qualsiasi file system distribuito che possa essere montato da un sistema operativo sottostante semplicemente usando un URL del tipo 'file://'.
Un componente che permette di integrare Hadoop con un grande quantitativo di filesystem, distribuiti e non, è Alluxio.

### Applicazioni e librerie usate nei cluster Hadoop
#### Elaborazione dati in modalità batch

Quando nacque Hadoop, l'unico modo di realizzare applicativi di elaborazione dati era MapReduce, che richiede di scrivere molto codice Java anche per le attività più semplici. Col passare degli anni, vennero inventate librerie come Cascading e Apache Crunch per rendere più agevole la realizzazione di questi programmi. A questi si è affiancato Pig, uno strumento che permetteva di usare un linguaggio ispirato ad SQL.
Un cambiamento consistente è avvenuto con l'introduzione di Apache Spark che usa in modo aggressivo la memoria RAM dei nodi del cluster per eseguire le elaborazioni con una velocità nettamente superiore a quella di MapReduce. Col tempo, Apache Spark si è evoluto, aggiungendo il supporto ad un linguaggio simile ad SQL e la possibilità di eseguire elaborazioni streaming di tipo microbatch.

#### Elaborazione dati in modalità Streaming

Per l'elaborazione di dati in modalità streaming con bassa latenza è possibile usare:
* Apache Flink
* Apache Heron
* Apache Samza
* Gearpump
Una libreria degna di nota è Akka. Questa permette di elaborare dati con delle prestazioni molto elevate sfruttando l'Actor Model. Le prime versioni di Apache Spark, precedenti alla 1.6, erano costruite proprio su Akka.
Sono stati creati anche degli strumenti che permettono di definire i flussi di elaborazione dati attraverso dei diagrammi. Tra questi troviamo Apache NiFi e StreamSets Data Collector.

#### Strumenti per la gestione dei dati

* Apache Hive, che viene usato per interrogare il contenuto di HDFS usando un linguaggio molto simile all'SQL che si chiama Hive Query Language;
* Apache Impala, simile a Hive, ma avente una latenza inferiore a fronte di un throughput inferiore. A questo software mancano le funzionalità più avanzate di Hive, ad esempio la gestione degli indici e dei dati di dato più complessi. Usa Impala Query Language;
* Apache Drill, uno strumento simile ad Hive ed Impala;
* Presto uno strumento per interrogare dati su HDFS simile ad Hive ed Impala, sviluppato da Facebook;
* Apache Kafka che viene usato per trasmettere dei messaggi e per custodire nel tempo i messaggi che sono stati trasmessi;
* Sqoop, strumento da linea di comando che permette di importare dati da basi dati relazionali verso HDFS e vice versa;
* Apache Flume, un servizio distribuito affidabile e disponibile per la raccolta, l'aggregazione e il trasporto un grande quantitativo di dati di log in maniera efficiente.

#### Console web

* Apache Ambari, che aiuta ad amministrare un cluster Hadoop con maggiore semplicità;
* Hue, una interfaccia grafica che permette di avere un punto di ingresso unico a tutti gli strumenti web per Hadoop;

#### Basi dati non relazionali

* HBase, una base dati distribuita che usa HDFS per gestire i dati
* Apache Cassandra
* Apache Kudu

#### Altri strumenti

* Apache ZooKeeper, un servizio di configurazione e sincronizzazione distribuito,

## Architetture dei sistemi basati su Hadoop

Usando Hadoop è possibile realizzare architetture di tipo Lambda, descritte da Nathan Marz e James Warren. Questo tipo di architettura prevede dei flussi batch e dei flussi streaming in parallelo. Il limite di questo approccio è che bisogna scrivere il doppio del codice. Per provare a superare questo limite, è stata proposta l'architettura Kappa, nella quale viene fatto tutto in streaming.

## Distribuzioni di Hadoop

Sebbene sia possibile scaricare ed installare autonomamente tutti i software necessari per far funzionare un cluster Hadoop, in molti casi è preferibile usare una distribuzione nella quale sono già presenti ed installati tutti questi software.
Tra le distribuzioni più note troviamo:
* Cloudera distribution, including Hadoop una distribuzione open source che include i principali pacchetti usati per Hadoop;
* Hortonworks Data Platform distribuzione Open Source, dismessa a seguito della fusione con Cloudera;
* The MapR Converged Data Platform, su mapr.com (archiviato dall'url originale il 21 maggio 2018). una distribuzione commerciale, acquisita da HPE;
* Huawei FusionInsight, su e.huawei.com (archiviato dall'url originale il 29 ottobre 2019). una distribuzione commerciale.

### Distribuzioni cloud

È possibile usufruire di cluster Hadoop già installati e configurati in cloud, tra le principali opzioni ci sono:
* Amazon Elastic Map Reduce in cui è possibile utilizzare Hive, Pig, Hue, Ganglia, Oozie e HBase ed eseguire Spark e Presto;
* Azure HDInsight che permette di eseguire Apache Hadoop, Spark, Hive, Kafka;
* Google cloud Dataproc permette l'utilizzo di vari componenti di Hadoop: Hive, HBase, Flink, Presto;
* Alibaba Cloud E-MapReduce permette l'uso di Apache Hive, Apache Kafka, Flink, Druid, e TensorFlow.

## Differenza tra Hadoop 1 e Hadoop 2

La più grande differenza tra Hadoop 1 e Hadoop 2 è l'aggiunta di YARN (Yet Another Resource Negotiator), che ha sostituito il motore MapReduce nella prima versione di Hadoop. YARN si sforza di allocare le risorse a varie applicazioni in modo efficace. Esegue due demoni, che si occupano di due diverse attività: il gestore delle risorse, che esegue il monitoraggio dei lavori e l'allocazione delle risorse alle applicazioni, il master dell'applicazione, che monitora l'avanzamento dell'esecuzione.

## Differenza tra Hadoop 2 e Hadoop 3

Ci sono importanti funzionalità fornite da Hadoop 3. Ad esempio, mentre c'è un singolo namenode in Hadoop 2, Hadoop 3 consente di avere più name node, che risolve il problema del singolo punto di errore.
In Hadoop 3, ci sono contenitori che funzionano in linea di principio di Docker, il che riduce il tempo speso per lo sviluppo delle applicazioni. Uno dei maggiori cambiamenti è che Hadoop 3 riduce il sovraccarico di archiviazione con la codifica di cancellazione.
Inoltre, Hadoop 3 consente l'utilizzo dell'hardware GPU all'interno del cluster, il che rappresenta un vantaggio sostanziale per l'esecuzione di algoritmi di deep learning su un cluster Hadoop.