PageRank con Hadoop - Digital Forensics @ UniSa

Transcript

PageRank con Hadoop - Digital Forensics @ UniSa
PageRank con Hadoop
Giovanni Mastroianni
Giuseppe Valentino
Giugno 2012
2
Indice
1 Introduzione
5
2 Il PageRank
7
2.1
L’algoritmo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
2.2
Algoritmo raffinato . . . . . . . . . . . . . . . . . . . . . . . . . .
9
2.3
Apache Hadoop . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10
2.4
PageRank con Hadoop . . . . . . . . . . . . . . . . . . . . . . . .
11
3 Analisi delle prestazioni
3.1
3.2
15
Hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
3.1.1
Macchina fisica . . . . . . . . . . . . . . . . . . . . . . . .
15
3.1.2
Macchina virtuale . . . . . . . . . . . . . . . . . . . . . .
16
Casi di studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
16
3.2.1
Caso di studio 1 . . . . . . . . . . . . . . . . . . . . . . .
16
3.2.2
Caso di studio 2 . . . . . . . . . . . . . . . . . . . . . . .
17
3.2.3
Caso di studio 3 . . . . . . . . . . . . . . . . . . . . . . .
19
3.2.4
Caso di studio 4 . . . . . . . . . . . . . . . . . . . . . . .
20
4 Conclusioni
23
3
4
INDICE
Capitolo 1
Introduzione
Ogni volta che si effettua un ricerca su Google ci sorprendiamo di quanto siano
attinenti i risultati organici. I sofisticati algoritmi utilizzati dai motori di ricerca
hanno il compito di restituire le pagine che più possono interessare l’utente.
Fare ciò non è semplice: ogni keyword, oltre a poter essere inespressiva presa
singolarmente, può soffrire di problemi di polisemia (un termine può avere più
significati) e sinonimia (ci sono diversi termini che indicano la stessa cosa).
Con l’avvento di Internet, dove tutti sono autori e tutti cercano contenuti, il
problema di reperire le informazioni è diventato cruciale per ogni motore di
ricerca. Questi ultimi devono non solo trovare e catalogare milioni di documenti
che sono rilevanti per una query, ma anche “raccomandare” i pochi risultati che
un utente vorrebbe consultare per soddisfare le proprie richieste. Possibilmente,
tra i primissimi risultati del motore di ricerca.
Per svolgere questo compito su una mole di dati enorme, è sicuramente
impensabile adoperare una sola macchina. Per questo motivo in questo lavoro
descriveremo le sperimentazioni e i benchmark dell’algoritmo di PageRank su
un cluster di macchine, utilizzato il framework Hadoop per il grid computing
e confronteremo le differenze nei tempi di esecuzione e i fattori di scalabilità
5
6
dell’algoritmo.
CAPITOLO 1. INTRODUZIONE
Capitolo 2
Il PageRank
PageRank è un algoritmo utilizzato da Google per valutare la reputazione di
una pagina. Partendo da una rete di pagine web, l’obiettivo dell’algoritmo è
quello di assegnare ad ogni pagina un punteggio; tanto più il punteggio sarà
alto, maggiore sarà l’importanza della pagina web nella rete.
PageRank svolge un ruolo fondamentale nel processo di indicizzazione di
pagine web da parte di Google poichè contribuisce a restituire, per una specifica
ricerca, solo i risultati che sono ad essa più attinenti. Informalmente, il calcolo
del PageRank è una sorta di votazione ricorsiva da parte delle pagine: ciascuna
pagina, tramite i link in uscita, vota per una o più altre pagine, accrescendone
il PageRank. Questo processo è pesato su due fattori: il PageRank della pagina
votante (un “voto” ricevuto da una pagina importante vale di più rispetto a
un “voto” ricevuto da una pagina con reputazione più bassa) e il numero di
link uscenti della pagina votante (ciascuna pagina distribuisce il proprio voto
suddividendolo equamente tra le pagine puntate dai link in uscita). Da ciò,
chiaramente, si deduce che tanto più una pagina è linkata tanto più accresce la
sua reputazione.
Metaforicamente, il PageRank può essere interpretato come un fluido che
7
8
CAPITOLO 2. IL PAGERANK
Figura 2.1: Esempio di pagine web collegate
circola nella rete di pagine e stagna in ciascuna di essa a seconda della sua
reputazione.
Una rappresentazione classica di una rete di pagine web è un grafo diretto
G(V, E) dove V è l’insieme delle pagine web ed E è l’insieme degli hyperlink da
una pagina a un’altra.
Da un punto di vista puramente matematico, il PageRank è una distribuzione
di probabilità che rappresenta la possibilità che un navigatore, cliccando a caso
sui link, possa raggiungere una determinata pagina. Considerando ciò, una
pagina con PageRank 0.5 ha il 50 % di possibilità di essere raggiunta da un
navigatore che percorre a caso il web.
2.1
L’algoritmo
Consideriamo un piccolo universo di pagine web, rappresentato in figura 2.1,
V = {A, B, C, D} con i seguenti link E = {(D, A), (D, B), (D, C), (B, C), (B, A)}
i.e. D ha un link in uscita verso tutte le pagine e B punta alle pagine A e C.
Sia |V | = n.
2.2. ALGORITMO RAFFINATO
9
Ragionando in termini di distribuzione di probabilità, ciascuna pagina ha
come PageRank iniziale il valore 0.25 (i.e.1/n). Consideriamo la pagina A: essa
è linkata da 2 pagine, quindi ciascuna di essa trasferirà il proprio PageRank
come di seguito
P R(A) =
P R(B) P R(D)
+
= 0.125 + 0.083 = 0.298
2
3
In generale, definendo L(v) il numero di link uscenti dalla pagina v e Hu
l’insieme delle pagine che linkano a u, la formula per il calcolo del PageRank
diventa
Definizione 1 P R(u) =
P
v∈Hu
P R(v)
L(v)
Questo calcolo viene effettuato durante più iterazioni dell’algoritmo in modo da
raffinare le valutazioni che tenderanno a convergere verso valori stabili.
2.2
Algoritmo raffinato
Utilizzando la definizione di PageRank data finora, sussiste un problema non
considerato: nella rete di pagine potrebbero esserci due nodi nei quali confluisce,
dopo un certo numero di aggiornamenti, tutto il PageRank senza mai uscirne.
Questo fenomeno si verifica in reti con cicli tra due nodi che non hanno altri archi uscenti. Fortunatamente, esiste un semplice stratagemma per evitare
queste situazioni. Ritornando alla metafora del fluido, si fa in modo che una
piccola quantità del PageRank totale “evapori” e si disperda casualmente tra
tutti i nodi ad ogni aggiornamento; in questo modo nella rete ci sarà sempre
una piccola quantità di PageRank che non può stagnare tra due pagine che si
linkano esclusivamente a vicenda. Per fare ciò, si introduce uno scaling factor s
ridefinendo l’algoritmo di aggiornamento.
Definizione 2 Regola di aggiornamento PageRank con scaling: Ogni pagina
viene aggiornata secondo la formula 1. Successivamente, si scalano tutti i valori
10
CAPITOLO 2. IL PAGERANK
di un fattore s. Questo significa che il PageRank totale nella rete passa da 1 a s.
Il restante valore 1 − s viene diviso equamente tra tutti i nodi, dando (1 − s)/n
a ciascuna pagina.
Un fattore di scaling utilizzato solitamente in pratica oscilla tra s = 0, 8 e
s = 0, 9.
2.3
Apache Hadoop
Hadoop è un framework open-source che permette di eseguire le applicazioni su
grandi cluster formati da hardware di comodità. E progettato per scalare da un
server singolo a migliaia di macchine, ognuna delle quale offre potenza di calcolo
e spazio di archiviazione locale. Prende spunto dal MapReduce di Google e dal
Google File System e permette di lavorare con migliaia di nodi e petabyte di
dati.
Ad oggi sono davvero tanti gli utilizzatori Hadoop per ricerca o per fini
commerciali, tra essi si annoverano nomi illustri quali Google, IBM, Amazon e
Yahoo!. Proprio quest’ultimo è uno dei maggiori utilizzatori di Hadoop. Vanta
più di 100,000 CPUs in 40,000 computer, il loro cluster più grande è formato
da 4500 nodi (2*4 cpu box con 4*1TB dischi e 16GB RAM). Yahoo! utilizza
Hadoop per supportare la ricerca web e una serie di servizi, come ad esempio
“Ad System”. In alcuni documenti vengono mostrate le potenzialità di Hadoop
e i guadagni in termini di tempo nell’uso di una griglia per la risoluzione di alcuni
problemi. In questo primo esempio, vengono comparati i tempi di esecuzione
per l’analisi di 100 TB di dati (cosa normalissima per Yahoo!) con diverse
configurazioni:
• Computer standard (100 MBPS): 11 giorni
• Soluzione con connessione a 10 Gbit: 1 giorni
2.4. PAGERANK CON HADOOP
11
• 1000 computer normali: 15 minuti!
Questo serve a sottolineare l’efficienza di una griglia, e quindi di Hadoop, per
l’analisi di un’ingente mole di dati. É proprio per questo motivo che abbiamo
deciso di utilizzare questo strumento in un ambito di calcolo che Google utilizza
in ogni istante per poter catalogare la vastissima mole di dati che caratterizza
le pagine web di tutto il globo.
2.4
PageRank con Hadoop
In questa sezione descriveremo come è possibile implementare l’algoritmo di
PageRank utilizzando il paradigma map/reduce.
Input
Il formato di input utilizzato prevede un file strutturato nel seguente
modo: (P1 , < O1 , O2 , . . . , On >) dove P1 è una pagina web e < O1 , O2 , . . . , On >
è la lista delle pagine puntate da P1
Map
Durante la fase di map viene calcolato, per ogni pagina P, il contributo
che verrà poi passato ad ogni pagina Oi puntata. Come descritto precedentemente, questo contributo è pari al valore di PageRank della pagina P diviso per
il numero di outlink. L’output della fase di map sarà quindi una serie di coppie
R(P)
chiave-valore del tipo: (Oi , PL(P)
).
Ragionando in termini implementativi ciò viene realizzato con la seguente
porzione di codice:
12
1
CAPITOLO 2. IL PAGERANK
S t r i n g URL = key . t o S t r i n g ( ) ;
RankRecord r e c o r d = new RankRecord ( v a l u e . t o S t r i n g ( ) ) ;
for ( String u : record . getUrlList () ) {
3
d o u b l e newRank = r e c o r d . g e t U r l L i s t ( ) . l e n g t h == 0 ? 0 : r e c o r d .
getRank ( ) / ( r e c o r d . g e t U r l L i s t ( ) . l e n g t h ) ;
5
c o n t e x t . w r i t e ( new Text ( u ) , new O b j e c t W r i t a b l e ( new D o u b l e W r i t a b l e (
newRank ) ) ) ;
}
7
c o n t e x t . w r i t e ( new Text (URL) , new O b j e c t W r i t a b l e ( r e c o r d .
getUrlList () ) ) ;
Reduce Durante la fase di reduce viene di fatto calcolato il nuovo valore di
PageRank secondo la formula 1 di ciascuna pagina sfruttando i dati calcolati
nella fase di map, pesandoli eventualmente con il fattore di scaling. L’output
della fase di reduce sarà una lista con i valori di PageRank aggiornati in modo da
poter ricominciare la fase di map. Questo procedimento iterativo viene ripetuto
per un numero fissato di volte (nel nostro algoritmo, 15).
Anche questo viene facilmente implementato tramite le API di Hadoop:
1
String [ ]
u r l L i s t = new S t r i n g [ 0 ] ;
f o r ( ObjectWritable w : val ) {
3
i f (w . g e t D e c l a r e d C l a s s ( ) . t o S t r i n g ( ) . e q u a l s ( D o u b l e W r i t a b l e .
class . toString () ) ) {
rank += d ∗ ( ( D o u b l e W r i t a b l e ) w . g e t ( ) ) . g e t ( ) ;
}
5
i f (w . g e t D e c l a r e d C l a s s ( ) . t o S t r i n g ( ) . e q u a l s ( S t r i n g [ ] . c l a s s .
toString () ) ) {
7
u r l L i s t = ( S t r i n g [ ] ) w. get ( ) ;
}
9
}
rank = ( 1 − d ) + rank ;
2.4. PAGERANK CON HADOOP
11
c o n t e x t . w r i t e ( key , new RankRecord ( rank , u r l L i s t ) ) ;
13
14
CAPITOLO 2. IL PAGERANK
Capitolo 3
Analisi delle prestazioni
3.1
Hardware
L’analisi delle prestazioni è stata effettuata su una griglia complessiva di 39
macchine, 1 master e 38 slave. Tuttavia, l’installazione del framework Hadoop è
stata effettuata su macchine virtuali. Descriveremo quindi in seguito sia la configurazione hardware di ogni macchina ospitante sia la configurazione di ciascuna
delle macchine virtuali.
Le macchine sono collegate tra loro da una rete LAN a 100 Mbit/s.
3.1.1
Macchina fisica
Ciascuna delle 39 macchine fisiche è dotata di
• 4 GB di memoria RAM
• Sistema Operativo Windows 7 a 32-bit
• Processore Intel Celeron G530, dual-core 2.4GHz
• 230 GB di hard-disk
15
16
CAPITOLO 3. ANALISI DELLE PRESTAZIONI
3.1.2
Macchina virtuale
La configurazione di ogni macchina virtuale prevede
• 2 GB di memoria RAM
• Sistema Operativo Linux Ubuntu 11.10 a 32-bit
• 1 Processore
• 50 GB di hard-disk
3.2
Casi di studio
3.2.1
Caso di studio 1
Nel primo caso di studio abbiamo voluto misurare le performance del nostro
algoritmo su un diverso numero di macchine (1, 4, 8, 16, 32, 38), per valutarne
la scalabilità a parità di input (16 GB). Il tempo di esecuzione dell’algoritmo, in
stand-alone, su una sola macchina è stato di 24 ore. Passando già a una configurazione con sole 4 macchine si può notare come la scalabilità sia quasi lineare.
Il limite teorico lineare (riportato in rosso sul grafico 3.1) è chiaramente utopico
utilizzando Hadoop, in quanto bisogna tenere in considerazione l’overhead da
inizializzazione dei map/reduce task, dallo split dell’input e dal suo successivo
riassemblamento finale.
Ciò nonostante, il grafico 3.1 mostra come passando da una configurazione
all’altra, le performance vengono incrementate in maniera notevole, confermando quanto sia importante per le performance di questo algoritmo il numero
di macchine a disposizione. Utilizzando il massimo numero di slave a nostra
disposizione i tempi crollano da 24 ore (1 nodo) a soli 49 minuti (38 nodi).
3.2. CASI DI STUDIO
17
Figura 3.1: Test di scalabilità con input 16 GB
3.2.2
Caso di studio 2
In questo secondo caso di studio abbiamo misurato le differenze, in termini di
tempi di prestazioni, nel modificare il numero di reduce impiegati da Hadoop.
Questo caso di studio ha avuto un’importanza cruciale, in quanto il nostro algoritmo concentra proprio nella fase di reduce, buona parte della sua complessità
computazionale. In generale, è possibile conoscere a priori il numero ottimale
di reduce task dalla formula
(nodes ∗ mapred.tasktracker.tasks.maximum)∗ c
dove nodes è il numero di slaves impiegati, mapred.tasktracker.tasks.maximum
indica il numero massimo di map/reduce task che possono essere eseguiti simultaneamente da ciascuna macchina (di default è pari a 2), mentre c vale 0.95 o
1.75.
É possibile effettuare lo stesso ragionamento per il numero di processi map.
Tuttavia, nel nostro caso, la fase di map è di basso carico e, quindi, non siamo
18
CAPITOLO 3. ANALISI DELLE PRESTAZIONI
Figura 3.2: Performance al variare del numero di reduce task
intervenuti nel modificare a mano il numero di map task, preferendo il comportamento classico di Hadoop. Il numero di map task, in Hadoop, dipende dalla
taglia del file di input e dal valore di block size: più blocchi ha il file di input,
maggiori saranno i map task impiegati. É possibile intervenire sul numero di
map task modificando il valore di block size di Hadoop (di default è pari a 64
MB).
L’importanza di quantificare il numero di map/reduce task è importantissimo, poichè l’inizializzazione di ciascuno di essi comporta un’aggiunta di overhead al carico totale che può non essere giustificato nel caso in cui il lavoro che
essi compiano sia di breve durata.
Nel nostro caso di studio abbiamo provato a modificare il numero di reduce task su un file di input di 16 GB. Il nostro test è stato eseguito su 38
macchine con 72 e 133 reduce task (questi numeri sono derivati dall’espressione precedente). Com’è possibile osservare in figura 3.2, con 72 e 133 task,
il miglioramento rispetto all’algoritmo stand-alone è tangibile e questo è gius-
3.2. CASI DI STUDIO
19
tificato dal fatto che il nostro algoritmo concentra buona parte del carico nella
fase di reduce. Con 72 reduce otteniamo tempi di prestazione ottimali. Anche
questo è in linea con le nostre attese, poichè non è possibile eseguire più di 2
task in parallelo su una macchina, con 133 reduce alcuni task vengono messi in
coda ed eseguiti in un secondo momento e, aggiungendo a questo l’overhead di
inizializzazione, è giustificato il peggioramento delle prestazioni.
3.2.3
Caso di studio 3
Nel nostro terzo caso di studio abbiamo voluto misurare le prestazioni del nostro
algoritmo su file di input di taglia differente. Precisamente le dimensioni dei dati
di input analizzati sono stati 5.7 MB, 509 MB, 3.7 GB e 16 GB tutti eseguiti
sul cluster completo di 38 macchine.
Figura 3.3: Confronto prestazioni dell’algoritmo tra locale e distribuito
Per il primo file, osserviamo dal grafico 3.3 che addirittura l’utilizzo di
Hadoop peggiora le prestazioni rispetto all’esecuzione dello stesso input in modalità
20
CAPITOLO 3. ANALISI DELLE PRESTAZIONI
stand-alone. Questo risultato è giustificabile poichè, come già detto, Hadoop ha
dell’overhead intrinseco dovuto all’inizializzazione dei vari task e alla lavorazione
dell’I/O. Oltre a ciò, la taglia del file in input è inferiore alla block size di default
(64 MB), per cui l’algoritmo non utilizza nient’altro che 1 solo map task.
Il discorso cambia già a partire dal secondo input, 5 volte superiore rispetto
al primo, su cui le prestazioni di Hadoop iniziano a dare i loro frutti, riducendo
a meno di 1/4 il tempo di esecuzione rispetto a un singolo pc. Questo è giustificabile perchè il carico di computazione che si concentra nella fase di map viene
scaricato in più task che, come già detto, crescono proporzionalmente con la
taglia dell’input.
Le prestazioni più incoraggianti si hanno sui due input di taglia maggiore,
dove il confronto tra cluster di Hadoop e macchina singola diventa imbarazzante:
nel caso estremo si passa da 24 ore di esecuzione a soli 49m! La spiegazione di
questo miglioramento, oltre alle potenzialità di Hadoop, è dovuta al fatto che il
nostro algoritmo concentra buona parte della computazione nella fase di reduce.
Quindi, aumentando il numero di postazioni e, di conseguenza, il numero di
reduce task, i benefici sono evidenti.
3.2.4
Caso di studio 4
In quest’ultimo caso di studio abbiamo confrontato i tempi di esecuzione variando il numero di repliche dei dati in input. Il fattore di replica, di default
pari a 2, è un indice importante che indica il numero di repliche per ogni blocco
del file sui nodi della rete. Nel caso predefinito, ad esempio, ogni blocco dei
file in input sarà presente su due macchine del cluster. Questo indice influisce
anche sul tempo di caricamento dell’input da file system classici al file system
distribuito di Hadoop.
Nel nostro caso abbiamo configurato Hadoop per effettuare 1, 2 e 3 repliche
di un file di input di 3.7GB.
3.2. CASI DI STUDIO
21
Figura 3.4: Performance al variare del fattore di replica
Come possiamo osservare dal grafico 3.4, i tempi di esecuzione non sono
fortemente influenzati dalla modifica del fattore di replica, per cui in tutti i
nostri casi di studio precedenti abbiamo utilizzato il fattore di replica di default,
pari a 2.
22
CAPITOLO 3. ANALISI DELLE PRESTAZIONI
Capitolo 4
Conclusioni
Come abbiamo potuto osservare dai risultati descritti precedentemente, PageRank è sicuramente un algoritmo che si adatta al paradigma del grid computing.
Con una griglia di modesta entità sono balzati subito all’occhio i grandi guadagni
in termini di tempi di esecuzione e scalabilità e abbiamo buone ragioni di credere
che questi risultati possano essere confermati con griglie molto più grandi e performanti. Il paradigma map/reduce di Hadoop ha inoltre facilitato enormemente
lo sviluppo dell’algoritmo e i test, gestendo in maniera totalmente trasparente
le modifiche di configurazione delle macchine e contribuendo a raggiungere in
un lasso di tempo più che ragionevole i nostri risultati.
23
24
CAPITOLO 4. CONCLUSIONI
Bibliografia
[DJ10]
Easley D. and Kleimberg J. Networks, Crowds and Markets. Cambride
University Press, New York, 2010.
[Whi09] Tom White. Hadoop: The definitive guide. O’Reilly, 2009.
25