
Vista l’immensa quantità di dati generati solo giornalmente non è più pensabile dover gestire i dati tramite i database relazionali. Il motivo principale è che questi ultimi non sono bravi a gestire in maniera economica elevati quantitativi di dati di tipo non strutturato, dove non risulta possibile associare una relazione come uno schema o una tabella (ad esempio, foto o video).
Le grandi imprese high tech della Silicon Valley già da qualche anno stanno adottando un differente approccio per gestire questa enorme mole di dati.
Mi riferisco ad Hadoop: è un sistema che permette di gestire i big data con maggior semplicità, e c’è addirittura chi afferma che cattura più del 90% del mercato dei big data (fonte inglese).
In questo articolo voglio mostrare cosa si intende per la piattaforma Hadoop e da quali componenti è formata.
Cos’è Hadoop?
Si può considerare Hadoop come una piattaforma open source che è stata creata per gestire e immagazzinare un’elevata quantità di dati in maniera economica ed efficiente.
Open source significa che è liberamente disponibile e possiamo anche cambiare il suo codice sorgente secondo determinati requisiti. Se le funzionalità standard non soddisfano le tue necessità, puoi modificarle in base alle tue esigenze.
Fu ideato nel 2005 da Doug Cutting e Mike Cafarella. Nel 2006, Cutting si unì a Yahoo e portò con sé il progetto a cui stava lavorando e le idee basate sui primi lavori di Google con l’automazione dell’archiviazione e dell’elaborazione dei dati distribuiti.
Una parte del suo progetto è diventata Hadoop il cui nome deriva dal nome dell’elefante giocattolo del figlio di Cutting.
Nel 2008, Yahoo ha rilasciato Hadoop come progetto open-source. Oggi, la struttura e l’ecosistema di tecnologie di Hadoop sono gestiti dalla Apache Software Foundation (ASF) senza scopo di lucro, una comunità globale di sviluppatori di software e collaboratori. Viene per questo chiamato anche Apache Hadoop.
Apache Hadoop è scritto in Java, il cui maggiore contributo proviene da Yahoo, IBM, Facebook e Cloudera.
Volendo, se hai competenze in altri linguaggi di programmazione, puoi modificare e utilizzare altri linguaggi a tuo piacimento per utilizzare Hadoop.
Perché Hadoop è così tanto utilizzato?
I motivi principali della sua diffusione sono i seguenti:
- Per la sua flessibilità ad immagazzinare i dati indipendentemente dal fatto che siano strutturati, semi-strutturati che non strutturati. L’immagazzinamento non è vincolato dal tipo di dati.
- Eccelle nel processare i dati di natura complessa e di elevate dimensioni;
- È economico e scalabile rispetto ai sistemi di immagazzinamento dei dati tradizionali;
- Tollerante al guasto (fault tolerant), così se per qualche motivo un nodo dovesse smettere di funzionare non è un problema perché i dati verrebbero processati da un altro nodo.
Componenti di Hadoop
È possibile affermare che Hadoop è composto da due componenti essenziali, senza i quali non esisterebbe:
1) Hadoop Distributed File System (HDFS): è il componente di immagazzinamento e storage dei dati;
2) MapReduce: la piattaforma indispensabile al processamento dei dati che permette di ricavare le informazioni ricercate.
Vediamoli un po’ più in dettaglio.
Hadoop Distributed File System (HDFS)
Per una maggiore chiarezza è bene elencare quali sono gli elementi che compongono Hadoop Distributed File System (HDFS):
- Cluster: Un insieme di PC/server interconnessi in una rete. Un cluster è composto da più nodi;
- Nodo: ciascuno dei PC/server di base è chiamato nodo. Esistono due tipologie di nodi nell’architettura Hadoop: il nodo master e il nodo slave.
Nel cluster esiste un nodo Master che prende il controllo di tutti i nodi Slaves. Questi ultimi sono elevati e vengono definiti DataNodes: è qui che le informazioni sono suddivise e immagazzinate in blocchi.
Il nodo master è anche chiamato Namenode, e controlla e gestisce i Datanodes.
Il Namenode regola l’accesso ai file agli utilizzatori in quanto ha accesso e gestisce tutti i dati immagazzinati nei Datanodes.
- Blocco: divisione di un file di dati la cui dimensione standard è 64MB (nella prima versione di Hadoop, contro 128MB nella seconda), ma essa può essere aumentata. È la più piccola unità nel file system, che viene creata, duplicata o eliminata dal Namenode. Non si ha nessun controllo sui blocchi da parte dell’utente, proprio perché vengono gestiti dal Namenode.
I blocchi vengono replicati e memorizzati in maniera distribuita nel cluster in diversi nodi. Questo avviene perché Il file system Hadoop è progettato per essere altamente tollerante ai guasti e per facilitare il rapido trasferimento dei dati tra i nodi di calcolo.
I sistemi Hadoop continuano a funzionare se un nodo fallisce. Ciò riduce il rischio di guasti catastrofici, anche nel caso in cui numerosi nodi falliscono.
In Hadoop una collezione di nodi formano il cluster, che forma l’architettura hardware Hadoop, definita Hadoop Distributed File System (HDFS).
A seconda della quantità di dati che si desidera elaborare e anche dal tempo necessario per elaborare i dati, si può decidere se installare Hadoop in uno o più computer.
Quando installi Hadoop per utilizzarlo in un solo computer, si dice che è in esecuzione in modalità locale. In questo caso Hadoop scrive i dati sul file system locale anziché sull’HDFS (qua il cluster è formato da un solo nodo).
Nel secondo caso, si utilizzano più macchine, e si dice che Hadoop è in modalità cluster. Un cluster può raggiungere anche migliaia di nodi contemporaneamente (per l’esattezza circa 4000 nella prima versione di Hadoop).
Il File System di Hadoop è differente rispetto a un file system non distribuito. Nella tabella sottostante vengono confrontate le varie caratteristiche dell’HDFS rispetto a un file system standard.
Un file system distribuito altro non è che un’applicazione client/server che consente ai client di accedere ed elaborare i dati memorizzati sul server come se fossero sul proprio computer.
Quando un utente accede a un file sul server, il server invia all’utente una copia del file che viene memorizzata nella cache sul computer dell’utente mentre i dati vengono elaborati e quindi restituiti al server.
Se vuoi maggiori informazioni, ti consiglio di leggere qua.
MapReduce
Abbiamo visto che l’HDFS permette di archiviare un enorme quantitativo di dati. Probabilmente starai pensando che per ricavare valore da questo ammasso di dati occorre un sistema che sia in grado di elaborare e cercare informazioni dall’HDFS.
Bene, questo è il compito di MapReduce, che altro non è che il livello di elaborazione dati di Hadoop.
Anche in questo caso è bene dare qualche definizione prima di procedere:
- Lavoro: è l’esecuzione della funzione Mapper o Reducer in un insieme di dati;
- Chiave: è un riferimento al valore di input (sono dati univoci alfanumerici o prevalentemente letterali);
- Valore: è il set di dati su cui operare (sono solitamente dati numerici);
- Mapper: è l’attività eseguita nella prima fase di utilizzo di MapReduce. Partendo dai dati di input, ottiene come risultato una coppia chiave-valore intermedia.
- Reducer: è l’attività eseguita nella seconda fase di utilizzo di MapReduce. Utilizzando quanto ricavato nella fase precedente permette di ottenere quanto ricercato dall’utente.
Molto semplicemente, MapReduce elabora l’enorme quantità di dati in parallelo dividendo il lavoro in un insieme di attività indipendenti.
Un problema è suddiviso in un numero elevato di problemi minori, ciascuno dei quali viene elaborato in modo indipendente per fornire risultati individuali. Questi risultati intermedi vengono ulteriormente elaborati per fornire l’output finale.
Quanto appena enunciato è eseguito nelle due fasi fondamentali di MapReduce:
1) Map: dopo aver ricevuto la richiesta dell’utente procede il lavoro sulla mappa, in cui i vari dati vengono divisi (Split). Il fine di questa attività è ricavare un blocco di dati che viene letto ed elaborato per produrre coppie chiave-valore come output intermedio.
2) Reduce: ognuna di queste coppie verrà quindi ordinata in base alla chiave e raggiungerà lo stesso nodo, dove viene utilizzata una funzione “reduce” per unire i valori (della stessa chiave) in un singolo risultato.
Il processo di esecuzione completo (Map e Reduce) nella prima versione di Hadoop è controllato da due tipi di entità chiamate:
- Jobtracker: viene utilizzato per interfacciarsi col Namenode e identificare la posizione di un determinato dato nei Datanodes. Una volta individuato assegna il lavoro da effettuare al TaskTracker.
- Task Tracker: esegue il lavoro che il JobTracker gli assegna. La sua responsabilità principale consiste nel tenere traccia dell’esecuzione dei carichi di lavoro MapReduce che si verificano localmente sul proprio nodo slave e inviare aggiornamenti di stato al JobTracker.
Non ci hai capito molto vero?
Voglio mostrare un esempio, tratto dal sito di IBM, per rendere più chiaro il funzionamento di MapReduce.
Supponiamo di avere cinque file e ogni file contiene due colonne (una chiave e un valore in termini Hadoop) che rappresentano una città e la temperatura corrispondente registrata in quella città per i vari giorni di misurazione.
Ovviamente si rende questo esempio molto semplice: un’applicazione reale è probabile che contenga milioni o addirittura miliardi di righe e potrebbero non essere affatto file formattati correttamente.
Non importa quanto grande o piccola sia la quantità di dati che devi analizzare, i principi chiave che si sta trattando qui rimangono gli stessi.
In entrambi i casi, in questo esempio, la città è la chiave e la temperatura è il valore.
Toronto, 20
Whitby, 25
New York, 22
Roma, 32
Toronto, 4
Roma, 33
New York, 18
Ipotizziamo che si voglia trovare la temperatura massima per ogni città attraverso tutti i file di dati (si noti che ogni file potrebbe avere la stessa città rappresentata più volte).
Utilizzando il framework MapReduce, si può suddividerlo in cinque attività della mappa (Split), in cui ogni Mapper lavora su uno dei cinque file.
In questo modo, l’attività Mapper passa attraverso i dati e restituisce la temperatura massima per ciascuna città.
Ad esempio, i risultati prodotti da un’attività di un Mapper per i dati di cui sopra sono simili a questo:
(Toronto, 20) (Whitby, 25) (New York, 22) (Roma, 33)
Supponiamo che gli altri quattro task del mapper (che lavorano sugli altri quattro file non mostrati qui) abbiano prodotto i seguenti risultati intermedi:
(Toronto, 18) (Whitby, 27) (New York, 32) (Roma, 37) (Toronto, 32) (Whitby, 20) (New York, 33) (Roma, 38) (Toronto, 22) (Whitby, 19) (New York, 20) (Roma, 31) (Toronto, 31) (Whitby, 22) (New York, 19) (Roma, 30)
Tutti e cinque questi flussi di output verrebbero inseriti nelle attività di Reduce, che combinano i risultati di input e generano un singolo valore per ciascuna città, producendo un set di risultati finali come segue:
(Toronto, 32) (Whitby, 27) (New York, 33) (Roma, 38)
Abbiamo visto gli elementi fondamentali di Hadoop: HDFS e MapReduce. Dalla seconda versione rilasciata (attualmente ce ne sono 3) c’è un altro componente fondamentale che ha preso parte di Hadoop: esso è Yarn (Yet Another Resource Negotiator).
Yarn altro non è che una tecnologia per gestire al meglio il cluster. Permette di togliere del lavoro e responsabilità a MapReduce, in modo da organizzare efficacemente la gestione delle risorse. Coordina l’attività da eseguire, tenendo sotto controllo la CPU, la memoria, la larghezza di banda della rete e lo spazio di archiviazione disponibile.
YARN offre chiari vantaggi in termini di scalabilità, efficienza e flessibilità rispetto al classico motore MapReduce nella sua prima versione.
I maggiori venditori di Hadoop offrono un ampio supporto per l’esecuzione di Hadoop YARN. Oggi, YARN viene utilizzato con successo nella produzione da molte aziende, come Yahoo, eBay, Spotify, Xing, Allegro e altro ancora.