Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Big Data
… data that exceeds RDBMS capabilities …
Big Data
Origini
una quantità di dati talmente grande da non poter essere gestita ed elaborata
con le tradizionali tecnologie, file-system e RBDMS, a sua disposizione
I sistemi RDBMS sono basati su un rigido formalismo matematico che consente di:
Senza nulla togliere ai suoi innumerevoli pregi, il modello relazionale in ambito BigData
presenta due difetti principali :
● rigidità dello schema
● “perdita di informazione” rispetto ai dati RAW
Big Data
Implementazione dello schema
Alcune delle ottimizzazioni introdotte nel passaggio dal modello teorico a quello
concreto dei sistemi RDBMS, hanno delle conseguenze negative rispetto ai BigData:
● JOIN → perdita di località dei dati ( eventuale attesa per il trasferimento degli
stessi da DB remoti)
Big Data
una nuova prospettiva....
Se le dimensioni dei dati sono molto più grandi di quelle del codice
è più efficiente spostare il codice dove sono i dati da elaborare
La differenza di velocità è di
GFS + MapReduce
circa 3 ordini di grandezza.
Big Data
Tabella Riassuntiva : MapRed VS RDBMS
RDBMS MapReduce
Dimensione dati Gigabytes Petabytes
Tra il 2003 e il 2004 Google fece alcune pubblicazioni in cui annunciò al pubblico questi
suoi risultati, mantenendo tuttavia chiuso il codice delle proprie implementazioni.
Esplose così la rincorsa alle emulazioni che vide vincitore Hadoop, una
implementazione open-source in Java sviluppata da Dough Cutting, l'autore di Lucene.
Dopo la prima release Yahoo! che lavorava ad un progetto analogo si rese conto che
Hadoop era più efficiente, abbandonò il suo progetto ed ingaggio Dough Cutting per
proseguire lo sviluppo di Hadoop.
•
Commons : un insieme di utility su cui si basano gli altri componenti
•
HDFS : un file-system distribuito utilizzato per la memorizzazione dei dati
•
Map-Reduce: il framework vero e proprio per il supporto alla programmazione
distribuita
Hadoop
HDFS
E' un file-system minimale, ispirato al Google FS, sviluppato per supportare Hadoop.
Dunque con pochi semplici obiettivi da realizzare:
● possibilità di gestire file di dimensione superiore al petabyte
● alta velocità in lettura/scrittura (prossima al max-transfer rate del disco)
● fault-tolerance
● ridondanza dei dati
In un file-system tradizionale la dimensioni tipiche dei blocchi variano tra 512 bytes e
4Kbytes, su HDFS le dimensioni tipiche variano tra 64Mbyte e 256Mbyte.
Inoltre ogni singolo blocco può essere replicato su più macchine diverse, garantendo
così un semplice ma efficace meccanismo di ridondanza che aumenta la sicurezza del
sistema.
HDFS
architettura interna
Task
Slave Task Slave Tracker
Tracker
MapReduce
Architettura del Framework
●
il nodo master, o JobTracker, ha il compito di gestire il ciclo di vita dei job :
● permanenza in coda
● interazione con il NameNode
● suddivisione in task
● scheduling del job
● riesecuzione di eventuali task falliti
● notifica sul progresso/fine del job
MapReduce
Architettura del Framework
Date due liste di numeri e vogliamo calcolare la somma dei rispettivi elementi.
X 6 2 4 3 2 4 2 ...
Y 3 8 1 3 7 5 1 ...
X+Y 9 10 5 6 9 9 3 ...
MapReduce
... in stile procedurale
● inizializza un contatore
3 6 9
● prendi la prima coppia di numeri
● calcola la somma 8 2 10
● scrivi il risultato nella nuova lista 1 4 5
3 3 6
● incrementa il contatore
● prendi la seconda coppia di numeri
7 2 9
● calcola la somma 5 4 9
● scrivi il risultato nella nuova lista
● …
● …
MapReduce
...in stile funzionale: es. mapcar in Lisp
Ad esempio potremmo utilizzare Reduce per sapere quanti elementi erano dispari e
quanti pari, oppure quanti risultati erano minori di 8:
X+Y 9 10 5 6 9 9 3 ...
Quindi un Job hadoop realizza un parallelismo di tipo SIMD (Single Instruction Multiple
Data) in quanto applica in parallelo una stessa trasformazione su tutti i blocchi che
costituiscono il file di input.
MapReduce
map + reduce
Input
Result
MapReduce
Ciclo di vita di un Job
MapReduce
Word Count
MapReduce
Definizione formale di un Job
L'analisi del ciclo di vita di un Job ha illustrato una sequenza di operazioni che vengono
effettuate sui dati prima, durante e dopo l'esecuzione delle operazioni di map e reduce.
1. i dati vengono letti dalla sorgente (solitamente un file HDFS) e passati al map
2. i dati emessi dal map vengono ordinati e raggruppati e trasferiti al reduce
3. i dati emessi dal reduce vengono salvati sulla destinazione (solitamente un file
HDFS)
Queste operazioni pongono alcuni vincoli (relativamente leggeri) sui tipi di dati su cui le
operazioni di map e reduce possono operare.
Definizione formale Job
Vincoli sui tipi dei dati
Il framework fornisce dei tipi che rappresentano i tipi nativi di Java e che implementano
queste interfacce:
● int → IntWritable
● long → LongWritable
● …
● String → Text
Input Format
Logical
HDFS
Input
Format
Job
Input Format
Da RAW a WritableComparable
Una nota va spesa sul TextOutputFormat che converte i dati in stringhe, chiamando il
metodo toString() e li salva su file.
Nel farlo tuttavia memorizza in ogni riga una coppia chiave valore, per cui il
corrispondente InputFormat è il KeyValueTextInputFormat e non il
TextInputFormat.
MapReduce
Da RAW a Result
MapReduce
Word Count
MapReduce
Word Count : Pseudocodice
InputFormat = KeyValueTextInputFormat
Reduce input: key = word values = lista di occorrenze es: {1, 1, 1, ….. }
Input Output
MapReduce
Driver
Spesso per eseguire un algoritmo complesso e controllare l'intera esecuzione del DAG
viene scritto un tool apposito, che viene denominato Driver per sottolineare il fatto che
pilota l'intera pipeline.
Hadoop è scritto in Java ed è quindi naturale l'interazione più diretta avvenga attraverso
questo linguaggio. Tuttavia Hadoop offre due meccanismi che consentono la scrittura di
Job Hadoop in molti altri linguaggi di programmazione.
● Hadoop Streaming – che fa uso degli stream per il passaggio delle coppie chiave
valore
● Hadoop Pipes – che usa dei socket per il passaggio delle coppie chiave valore
Interoperabilità
Hadoop Streaming
Hadoop Streaming uso gli stream di Unix (stdin e stdout) come interfaccia tra il
framework e il Job, che dunque può esser scritto in un qualunque linguaggio che sia in
grado di leggere dallo standard input e di scrivere sullo standard output.
Hadoop Streaming ha una “visione” text-oriented dei dati, per cui
● il Task converte i dati di input in righe di testo e li passa al map attraverso lo
standard input
● il map li elabora e scrive i risultati sullo standard output
● questi vengono poi raccolti e ordinati (come testo)
● un altro Task suddivide i dati provenienti dai vari map in righe di testo e le inoltra al
reduce attraverso lo standard input
● il reduce le elabora e scrive i risultati sullo standard output
● questi vengono raccolti e memorizzati su file
Interoperabilità
Hadoop Pipes
Hadoop Pipes funziona in maniera simile a Streaming ma utilizza dei socket per il
passaggio dei dati ed è principalmente orientata agli sviluppatori C++.
Sia la chiave che il valore vengono forniti come stringhe ( std::string ).
Un Job in chiaveC++ deve sempre fornire due classi Mapper e Reducer ma i metodi
map() e reduce() hanno un solo parametro d'ingresso MapContext e ReduceContext
i cui metodi principali sono
A partire dal 2009 il CRS4 ha sviluppato Pydoop[1], una API per consentire la scrittura
di Job MapReduce e l'interazione con HDFS anche a chi utilizza il linguaggio Python.
È possibile scaricarlo da:
http://pydoop.sourceforge.net/docs/
[1] S. Leo and G. Zanetti. Pydoop: a Python MapReduce and HDFS API for Hadoop. In Proceedings of the 19th ACM
International Symposium on High Performance Distributed Computing, 819-825, 2010.
Pydoop
Architettura del sistema
Pydoop utilizza Hadoop Pipes e le librerie Boost per realizzare la comunicazione tra i
codice Python ed il framework Map Reduce o l'HDFS
Pydoop
Python API
Attraverso le API di Pydoop è possibile avere accesso diretto dal codice Python alla
gran parte delle funzionalità offerte dal framework Hadoop:
http://pydoop.sourceforge.net/docs/api_docs/index.html
Pydoop
pydoop script
Tuttavia l'accesso diretto alle API Pydoop richiede una profonda conoscenza del sistema
e delle tecnologie utilizzate per integrarlo con Hadoop.
Per semplificare la scrittura di job è stato creato Pydoop Script, che consente di scrivere
un Job Hadoop semplicemente definendo le due funzioni mappre e reducer.
A questo punto per lanciare il Job sarà sufficiente digitare sulla shell il comando :