Quando i dati diventano “big”…. Hadoop!

Quando i dati diventano “big”…. Hadoop!

Chi non ha sentito parlare di Big Data negli ultimi tempi? Sempre più le dimensioni dei dataset gestiti da alcune organizzazioni e aziende (gli apripista sono stati giganti come Google e Facebook) sono diventate così grandi e complesse (parliamo di PetaBytes, se non di ExaBytes) da richiedere strumenti differenti da quelli tradizionali in tutte le fasi del processo: dall’acquisizione, alla condivisione, all’analisi, fino alla visualizzazione dell’informazione. In molte situazioni, la gestione del dato attraverso piattaforme RDBMS basate su SQL non basta più: si parla infatti di soluzioni alternative di tipo noSQL. Tra queste, Hadoop è sicuramente la piattaforma oggi più diffusa per lavorare con i Big Data, in grado, perciò, di gestire:

  • enormi volumi di dati in input;
  • dataset eterogenei, laddove i dati sono poco e variamente strutturati;
  • esigenza di risposte Near-Real-Time;
  • necessità di calcolo parallelo

Tra l’altro, Hadoop è un progetto open source Apache. Per dirla tutta, Hadoop costituisce il “core” di un ecosistema fatto di progetti, quindi di strumenti, altrettanto open, che possono collaborare tra di loro per affrontare al meglio la sfida dell’incombente “diluvio di dati”.

In estrema sintesi, Hadoop è formato da due componenti fondamentali:

  • HDFS, il file system
  • MapReduce, il “motore”

HDFS rende semplice memorizzare e gestire file molto grandi:

  • ottimizza la velocità di trasferimento sulla latenza, che è quello che vogliamo quando:
    • scriviamo files con decine/centinaia di milioni di record (web pages);
    • scriviamo ogni volta “una volta sola”, visto che il prossimo “crawl” riscriverà il file da zero.

MapReduce rende semplice operare con dati distribuiti:

  • dopo aver suddiviso (split) il file in input su più blocchi (su più nodi), MapReduce è capace di operare sul file in parallelo facendo lavorare un processo di lettura indipendente su ogni blocco.

Forse conviene dare una chance ad Hadoop se il grep su qualche file di log sta impiegando 10 minuti o se la generazione del report SQL sta impiegando più di mezz’ora..

In questo articolo vedremo come, in pochi semplici passi, sia possibile installare Hadoop ed eseguire la nostra prima applicazione.

Installeremo Hadoop su Linux Ubuntu 12.04 LTS, ovviamente in configurazione single node. 

Prerequisiti:

  • Oracle Java JDK;
  • Aggiunta di un utente di sistema dedicato Hadoop;
  • Configurazione SSH;

Per installare Java 7, digitiamo i seguenti comandi:

Per verificare che l’installazione sia andata a buon fine digitiamo java -version che visualizzerà la versione di Java installata. Digitiamo quindi i seguenti comandi:

che permetteranno di aggiungere l’utente hduser al gruppo hadoop sulla macchina locale.

Hadoop richiede un accesso tramite SSH per la gestione dei suoi nodi. Nel nostro caso permetteremo all’utente hduser di accedere al localhost configurando SSH eseguendo i seguenti comandi:

a questo punto premendo invio comparirà i seguente output:

e un’altra serie di messaggi che descrivono il risultato dell’esecuzione. Successivamente, forniamo un accesso SSH per accedere alla macchina con la chiave appena creata:

Per testare che la configurazione sia andata a buon fine digitiamo ssh localhost

A questo punto siamo pronti per scaricare l’ultima versione stabile di Hadoop, ad esempio da qui, e installarla in una directory a piacere, ad esempio in: /usr/local/hadoop:

Aggiungiamo le seguenti righe in fondo al file $HOME/.bashrc per l’utente hduser:

Infine, editiamo il file /usr/local/hadoop/etc/hadoop/hadoop-env.sh individuando la riga:

e sostituendola con la riga:

La configurazione di Hadoop, consiste nell’editare il file /usr/local/hadoop/etc/hadoop/core-site.xml.
In questo file possiamo ad esempio indicare la directory in cui Hadoop memorizza i data files, la porta di ascolto, etc. Editare il file, significa inserire i parametri di configurazione tra i tag xml configuration. Supponiamo di voler configurare il percorso di base per le directory in cui risiederanno i file di input e di output utilizzati dai job di MapReduce.

Innanzitutto creiamo una directory tmp:

Successivamente inseriamo le seguenti proprietà nel file core-site.xml:

core-site

Figura 1 – Configurazione del core di Hadoop

Allo stesso modo, possiamo gli altri due file principali di Hadoop. Editiamo mapred-site.xml con le seguenti proprietà:

mapred-site

Figura 2 – Configurazione del map reduce task

e hdfs-site.xml con le seguenti proprietà:

hdfs-site

Figura 3 – Configurazione dei site per HDFS

Ultimata la configurazione, procediamo con lo start della nostra installazione. Prima di tutto, formattiamo il file system lanciando il comando:
/usr/local/hadoop/bin/hdfs namenode -format

Quindi, siamo finalmente pronti ad eseguire Hadoop, per farlo lanciamo: /usr/local/hadoop/sbin/start-all.sh 

l’output del comando riporta la seguente linea significativa:

dove my_ubuntu è il nome della macchina Linux.

Possiamo accedere all’interfaccia web di amministrazione Hadoop digitando il seguente indirizzo nel browser: http://localhost:50070.

Passiamo ora, come promesso, a una semplice applicazione di esempio.

Word Count sarà il nostro Hello World. Si tratta di un’applicazione che conta l’occorrenza di ciascuna parola in uno o più files di testo.

E’ uno di quei casi in cui l’applicazione in sè è decisamente banale, mentre l’implementazione lo è solo se la quantità di testo da analizzare è ragionevolmente piccola, in particolare se la RAM è sufficiente a contenerla.

Che significa, infatti, realizzare una versione di Word Count che funzioni su 500 GB o 1 TB di testo?

Hadoop elabora il dataset di input attraverso le due funzioni “primitive” map e reduce, la cui strategia di azione si può schematizzare nello schema seguente:

wordcount

Figura 4 – Lo schema di azione dei task map e reduce

Il framework Hadoop, in maniera trasparente rispetto all’utente, organizza l’insieme di coppie chiave/valore emesse dai vari «map task» in modo che tutte quelle che hanno la stessa chiave siano inviate allo stesso «reduce task». A questo punto, la funzione «reduce» non deve far altro che sommare tutti i valori corrispondenti a quella chiave per produrre il risultato finale.

Bene, proviamo a fare il word count del contenuto di un libro. L’applicazione wordcount fa parte della libreria di esempi forniti di serie dal framework. Come dataset da “contare”, possiamo ad esempio liberamente scaricare i libri:

  • Alice nel Paese delle Meraviglie:

http://www.gutenberg.org/ebooks/11.txt.utf-8 (testo semplice UTF-8: 164 Kb)

  • La Divina Commedia:

http://www.gutenberg.org/ebooks/1012 (testo semplice UTF-8: 604 Kb)

Portiamo i files nella nostra macchina Linux (in /home/hadoop) lanciando:

 

dataset

Figura 5 – Browsing del file system HDFS

Quindi, eseguiamo l’applicazione lanciando il seguente comando:

Viene creata la dir. /home/hadoop/output al cui interno troviamo il file part-r-00000 che rappresenta il risultato del wordcount. L’output sarà reperibile anche attraverso il comando:

e il seguente non è che un piccolo estratto:

output

Figura 6 – Estratto dell’output dopo l’esecuzione dell’esempio precedente

Semplice, no? Bene, se invece di poche centinaia di KB vorrete esaminare qualche TB, non avete che da accomodarvi…

Se poi vorrete mettere alla prova il “vero” Hadoop, predisponendo il calcolo parallelo su qualche decina o centinaia di nodi, allora significherà che questo articolo avrà conquistato davvero il vostro interesse!

0 Condivisioni

Alessandro Cecconi

Sono ingegnere elettronico, e dal 1995 sforno applicazioni software in ambito enterprise. Negli ultimi anni mi sto occupando di CRM e di SugarCRM in particolare, il mio blog è nato proprio con l’obiettivo di contribuire a far conoscere sempre di più questo software open source potente e, al tempo stesso, semplice e alla portata di tutti anche in Italia.

Potrebbero interessarti anche...