04 bloom

34
Davide Carboni Corso di Computazione su Rete Laurea specialistica in Tecnologie Informatiche Facoltà Scienze MM.FF.NN Università di Cagliari AA 2007/2008 Filtri di Bloom

description

A introduction to

Transcript of 04 bloom

Page 1: 04 bloom

Davide CarboniCorso di Computazione su Rete

Laurea specialistica in Tecnologie InformaticheFacoltà Scienze MM.FF.NN

Università di CagliariAA 2007/2008

Filtri di Bloom

Page 2: 04 bloom

Bloom Filter● Un filtro di Bloom B è una struttura dati ottimizzata rispetto allo

spazio utilizzata per testare se un dato elemento x ∈ S● Il filtro evita di cercare l'elemento x con un'iterazione● E' possibile che restituisca dei falsi positivi● Gli elementi che vengono aggiunti al set S devono essere

aggiunti anche al filtro. Gli elementi rimossi da S non possono essere rimossi dal filtro

Page 3: 04 bloom

Bloom Filter● Un filtro di Bloom B è definito da un vettore di m

bit e da k-funzioni di hashing per le quali vale● fi(x) = j con 0 <= j <= m per qualunque i=1,2,...,k● In pratica ogni funzione di hash calcola una

posizione all'interno del vettore B

Page 4: 04 bloom

Bloom Filter: add● Quando un elemento y viene aggiunto al set S

allora si calcolano tutte le funzioni di hash– f1(y),f2(y),...,fk(y)

● e il vettore risultante contiene k-posizioni del filtro di Bloom che devono essere posti a uno

● B[fi(y)] := 1 per i=1,2,...,k

Page 5: 04 bloom

Bloom Filter: query● Per testare se un elemento y ∈ S è sufficiente

calcolare f1(y),f2(y),...,fk(y) e verificare che

● B[fi(y)] == 1 per i=1,2,...,k● Se uno solo dei B[fi(y)] == 0 allora l'elemento

y non è in S

Page 6: 04 bloom

Falsi positivi

● In generale quando aggiungiamo un elemento x calcoliamo il vettore di posizioni da settare

● B[fi(x)] := 1 per i=1,2,...,k● Se aggiungiamo anche y avremo ● B[fi(y)] := 1 per i=1,2,...,k● In generale potrà accadere che fi(x) == fj(y) per

x e y presi in modo arbitrario

Page 7: 04 bloom

Falsi positivi

● In generale potrà accadere che fi(x) == fj(y) per x e y presi in modo arbitrario

● Questo conduce al fatto che dati più elementi x1,x2,...,xp possono dar luogo al settaggio di B[i1],B[i2],...,B[ik] tale per cui un generico elemento y avente esattamente B[i1],B[i2],...,B[ik] come impronta risulterebbe positivo pur non essendo nel set S

Page 8: 04 bloom

Falso positivo esempio

add 'mela'

add 'pera'

add 'kiwi'

test 'arancia'

test(arancia) da un falso positivo

00100000100000000000000000001

00100000100100100000010000001

00101000100100100110010000001

00000000000100000100000000001

Page 9: 04 bloom

Falsi positivi: calcolo● Supponiamo che la probabilità che un dato bit

del filtro sia settato a 1 da una funzione di hash sia 1/m, dunque la prob. che NON sia settato a 1 sarà 1– 1/m

● La prob. che non sia settato da nessuna delle k-funzioni sarà (1 – 1/m)k

● La prob. che sia ancora zero dopo aver inserito n elementi sarà (1 – 1/m)kn

Page 10: 04 bloom

Falsi positivi: calcolo● La prob. che sia pari ad uno dopo aver inserito

n elementi sarà 1 - (1 – 1/m)kn

● Dato un elemento e che non appartiene a S la prob. che tutti i k-bit della sua impronta sul filtro siano settati ad uno è quindi

● (1 - (1 – 1/m)kn)k ≃ (1 – e -kn/m)k

Page 11: 04 bloom

Casi d'uso● spell-checker: un filtro di Bloom accetta tutte le parole

in un dato dizionario e non le altre● p2p: una query che è stata già inviata senza successo

in un ramo della rete non verrà ri-inviata● spam: per verificare che l'indirizzo di uno spammer sia

in una black list● Google BigTable usa i filtri di Bloom per evitare le

ricerche in colonne vuote

Page 12: 04 bloom

Cache distribuite

client

proxy

cache

internetproxy

cache

proxy

cache

proxy

cache

proxy

cache

1get x

il client interroga il proxyper ottenere l'oggetto x

Page 13: 04 bloom

Cache distribuite

client

proxy

cache

internetproxy

cache

proxy

cache

proxy

cache

proxy

cache

1get x

2 x in cache?

il proxy interroga la sua cachex in cache?

Page 14: 04 bloom

Cache distribuite

client

proxy

cache

internetproxy

cache

proxy

cache

proxy

cache

proxy

cache

1get x

2 x in cache?3

3

3

il proxy non trovando x nella sua cacheinoltra la richiesta alle altre cache da lui conosciute ognuna delle quali dovrainterrogare x in cache?

Page 15: 04 bloom

Cache distribuite

client

proxy

cache

internetproxy

cache

proxy

cache

proxy

cache

proxy

cache

1get x

2 x in cache?3

3

3

il proxy non trovando x in nessuna cache si collegherà con la vera risorsax in rete

4

Page 16: 04 bloom

Cache distribuite (con Bloom)

client

proxy

cache

internetproxy

cache

proxy

cache

proxy

cache

proxy

cache

1get x

il client interroga il proxyper ottenere l'oggetto x

bloom filters

Page 17: 04 bloom

Cache distribuite (con Bloom)

client

proxy

cache

internetproxy

cache

proxy

cache

proxy

cache

proxy

cache

1get x

il proxy interroga il filtro relativo allasua cache

bloom filters

Page 18: 04 bloom

Cache distribuite (con Bloom)

client

proxy

cache

internetproxy

cache

proxy

cache

proxy

cache

proxy

cache

1get x

se x not in cache allora il proxyfarà la query sugli altri filtri relativialle cache remote

bloom filters

Page 19: 04 bloom

Cache distribuite (con Bloom)

client

proxy

cache

internetproxy

cache

proxy

cache

proxy

cache

proxy

cache

1get x

se nessun filtro restituisce query(x) = trueallora la risorsa viene caricata dalla rete

bloom filters

Page 20: 04 bloom

Cache distribuite (considerazioni)● Senza filtri di Bloom la query x in cache?

richiede un calcolo O(log n) al quale nel caso peggiore di consultazione di k cache remote va a sommarsi il tempo di latenza Tl (che consideriamo qui come media) per ognuna delle consultazioni

● Con i filtri di Bloom non c'è latenza di rete ed inoltre la consultazione per la singola filtro è molto più breve di O(log n)

Page 21: 04 bloom

Cache distribuite (considerazioni)● In caso un filtro restituisca x in filter=true

– se x in cache (vero positivo) OK, è quello che volevamo

– se x not in cache (falso positivo): allora il proxy chiederà inutilmente get x ad una cache ottenendo un Error 404

Page 22: 04 bloom

Cancellare un elemento● Cancellare un elemento da un filtro di Bloom

non è possibile senza ricostruire il filtro●

add 'mela'

add 'uva'

delete 'uva' distruggerebbe anche l'impronta di 'mela'

00100000100000000000000000001

00100010000000000000000001000

Page 23: 04 bloom

Cancellare un elemento● Si potrebbero usare per un set S={x1,...,xn} due

filtri di bloom A,D– A è il filtro di Bloom che contiene tutti gli elementi

aggiunti (added)– D è il filtro di Bloom che contiene tutti gli elementi

cancellati (deleted)– la query x in S? va verificata con le due query sui

filtri x in A? and x not in D?

Page 24: 04 bloom

Counting Filters● Un modo più interessante per consentire la

cancellazione è quello di costruire degli speciali filtri in cui invece di settare a 1 i bit si incrementano dei contatori

● In effetti il filtro di Bloom può essere considerato un Counting Filter in cui i contatori stanno nell'intervallo [0,1]

Page 25: 04 bloom

Counting Filters

● 00000000000000000 (filtro vuoto)● 00001000000010010 (add x)● 00002000100110010 (add y)● 00002001200110010 (add z)● 00001001200100000 (delete x)

Page 26: 04 bloom

Filtri Bloomier● I filtri Bloomier sono una struttura dati basata

sui filtri di Bloom capace di implementare un array associativo

● Dato l'array A:– add (key,value) equivalente a A[key] = value – value=get(key) equivalente a value = A[key]

Page 27: 04 bloom

Filtri Bloomier● Il caso più semplice è quello in cui i valori

dell'array possono assumere i valori 1 e 0– value ∊ {0,1}

● Si utilizzano due filtri di Bloom A e B– A contiene tutte le chiavi i cui valori sono 0– B contiene tutti le chiavi i cui valori sono 1

Page 28: 04 bloom

Bloomier (Esempi)

● A=00000000000000000 (array vuoto)● B=00000000000000000

● A=00000000000000000 (array vuoto)● B=00000000000000000● A=00000000000000000 array[x]=1● B=00010000101000000

h1(x) h2(x) h3(x)

● A=01000100000000100 array[y]=0● B=00010000101000000

h1(y) h2(y) h3(y)

Page 29: 04 bloom

Bloomier (Esempi)● Facciamo l'ipotesi che non modifichiamo mai il

valore associato ad una chiave– se imponiamo array[x] := 0 non imporremo in

seguito array[x] := 1– pertanto se risulta contemporaneamente che

● array[x] == 1 and array[x] == 0 questo è dovuto al fatto che uno o tutt'e due i filtri di Bloom A e B stanno restituendo un falso positivo

Page 30: 04 bloom

Bloomier non binari● Il caso più generale è quello in cui i valori dell'array

possono assumere valori qualsiasi.● Essi possono rappresentare un puntatore a n bit ad una

qualche zona di memoria

– value ∊ [00...0n , 11...1n]● Si utilizzano 2*n filtri di Bloom A1,...,An e B1,...,Bn

– x in Ai => i-esimo bit di array[x] == 0

– x in Bi => i-esimo bit di array[x] == 1

Page 31: 04 bloom

Bloomier non binari (Esempi)● A1 = 000000000000● A2 = 000000000000● B1 = 000000000000● B2 = 000000000000

consideriamo un filtro in cui i valoriarray[x] appartengano a {00,01,10,11}

Page 32: 04 bloom

Bloomier non binari (Esempi)● A1 = 001000010010● A2 = 000000000000● B1 = 000000000000● B2 = 001000010010

settiamo array[x] := 01

indici per x

Page 33: 04 bloom

Bloomier non binari (Esempi)● A1 = 001000010010● A2 = 000000000000● B1 = 100010000001● B2 = 101010010011

settiamo array[y] := 11

indici per y

Page 34: 04 bloom

Riferimenti● Bloom, Burton H. (1970),

– "Space/time trade-offs in hash coding with allowable errors",

● Chazelle e altri (2004), – "The Bloomier filter: an efficient data structure for

static support lookup tables"● Talk on Bloom Filter by GoogleTechTalks

http://www.youtube.com/watch?v=947gWqwkhu0