Hadoop – Come elaborare grandi dataset

Supponiamo di avere un file ASCII contenente valori di parametri ambientali, ad esempio le temperature orarie giornaliere di una data zona relative ad un intero anno. Un tale file potrebbe essere prodotto da una centralina di rilevamento del tipo utilizzato in meteorologia. Supponiamo adesso di voler calcolare la temperatura media di ciascun mese oppure di ciascun giorno della settimana. Quali strumenti potremmo utilizzare? Potremmo importare il file in un foglio elettronico (OpenOffice Calc/Excel) e poi analizzare i dati con l’ausilio di una tabella pivot, oppure caricarlo in una tabella di un database relazionale come MySQL (Oracle) e produrre i risultati voluti eseguendo delle query SQL, oppure scrivere uno script AWK o un programma che faccia una scansione dell’intero file e calcoli i valori di cui abbiamo bisogno.

Ma se le centraline di rilevamento fossero migliaia, ad esempio quelle di un intera nazione o se si trattasse di analizzare file ASCII enormi come i log di decine di web server o di creare indici di ricerca analizzando milioni di pagine web, quale sarebbe la reale praticabilità delle soluzioni prima esaminate? Viviamo nell’era dei dati digitali e ne produciamo di nuovi ogni giorno con un ritmo vertiginoso: una stima di IDC prevede che i dati registrati elettronicamente raggiungeranno nel 2011 la dimensione di 1.8 zettabyte. Intuiamo tutti che una buona strategia di analisi consista nel suddividere il lotto di input in più parti ed esaminarli in parallelo su diversi elaboratori: dividi e conquista!

Tuttavia anche con un approccio a forza bruta rimangono aperte alcune questioni molto importanti: coordinare il lavoro, raggruppare i risultati intermedi, rilanciare le elaborazioni fallite per errore applicativo o per guasto hardware, bilanciare e sfruttare in modo ottimale le risorse disponibili, il tutto utilizzando una soluzione che sia anche scalabile. In questo post vi parlerò di Hadoop, di Map/Reduce (un framework software per processare in parallelo dataset enormi) e di HDFS (un file system distribuito progettato per gestire file grandi centinaia di GB o di TB).

Il paradigma di programmazione è alquanto singolare. In sintesi mediante l’operazione di map si creano delle coppie chiave/valore che poi verranno ordinate e fuse insieme mediante un tipico meccanismo di sort/merge. E’ possibile personalizzare le funzioni sopra citate scrivendo il codice necessario a seconda della struttura del dato di input.
Lo storage è reso disponibile da un cluster comprendente anche migliaia di nodi di macchine comuni, non costosissimi elaboratori ma pur sempre macchine destinate al mercato professionale: ad esempio processore quad-core Intel Xeon, 8 GB ECC RAM e storage FC/SATA. Hadoop è stato creato da Doug Cutting, il creatore di Apache Lucene, e fonda le sue origini in Apache Nutch, un motore di ricerca web open source. Spigolando qua e là ho trovato una nota di colore: pare che Doug abbia chiarito che il nome Hadoop non è un acronimo ma il nome dato da suo figlio ad un elefantino giallo.
Ho passato qualche giorno a leggere l’ottimo libro di Tom White, uno dei membri del progetto, ed impegnato un week end per installare Hadoop e fare qualche test di funzionamento. Ovviamente confinare un “mostro” come Hadoop all’interno di un blog è davvero impossibile, tuttavia i link di cui è disseminato questo post dovrebbero essere sufficienti a mettere sulla buona strada i lettori più curiosi. Per padroneggiare lo strumento c’è davvero molto da studiare sia dal punto di vista sistemistico che applicativo (Hadoop è scritto in Java ma è possibile sviluppare anche in Ruby, Python, C++). Le figure che ho riportato sono tratte dalla mia installazione e si riferiscono alla interfacce web con cui è distribuito Hadoop: Task Tracker (porta 50060), HDFS name node (porta 50070), MapReduce Job Tracker (porta 50030).

Prima di parlarvi dei risultati ottenuti vorrei segnalarvi due tutorial di Michael Noll; contengono indicazioni preziose su come costruire un single-node cluster e multi-node cluster con sistema operativo Ubuntu. Io ho utilizzato Fedora 11 e, dopo qualche peripezia, sono riuscito ad avere un sistema funzionate ed a condurre qualche test su un PC con 1GB di RAM che ho chiamato (e qui tradisco la mia passione per la fantascienza) BorgCube. Mi è sembrato un nome adatto: un cubo Borg (il cluster), la collettività (il framework), i droni (i nodi).

Dopo aver verificato il corretto funzionamento di Hadoop (a proposito c’è qualche differenza di configurazione tra la versione 18 e la 20), ho scaricato un file ASCII dal progetto Gutenberg e, dopo aver ricompilato l’applicazione di esempio WordCount.java e generato il file JAR l’ho mandata in esecuzione ottenendo i risultati riportati nella figura seguente.

Le prove effettuate non potevano avere altra pretesa se non quella di verificare a grandi linee il funzionamento di Hadoop ma credo che questo progetto possa rivelarsi molto interessante per studenti e ricercatori universitari e per tutti coloro interessati a macinare grandi volumi di dati (ed a spendere anche qualche euro per le macchine).

Nella lista di quanti utilizzano Hadoop si sono nomi del calibro di AOL, Facebook, Google, IBM, Yahoo (solo per citarne alcuni). Un ultima nota da segnalare: Yahoo ha ordinato 1 terabyte di dati in 209 secondi con un cluster di 910 nodi.

2 Responses to “Hadoop – Come elaborare grandi dataset”

  1. E says:

    Ottimo e interessantissimo post.
    Il nostro Donato è al massimo della sua forma intellettuale, mi pare!

  2. [...] grandi quantità di dati. E’ basato su Hadoop framework, del quale abbiamo parlato in un precedente post, ed è pensato tipicamente per applicazioni di web indexing, data mining, log file analysis, [...]

Leave a Reply