HBase总结(九)Bloom Filter概念和原理
Bloom Filter是一種空間效率很高的隨機(jī)數(shù)據(jù)結(jié)構(gòu),它利用位數(shù)組很簡(jiǎn)潔地表示一個(gè)集合,并能判斷一個(gè)元素是否屬于這個(gè)集合。Bloom Filter的這種高效是有一定代價(jià)的:在判斷一個(gè)元素是否屬于某個(gè)集合時(shí),有可能會(huì)把不屬于這個(gè)集合的元素誤認(rèn)為屬于這個(gè)集合(false positive)。因此,Bloom Filter不適合那些“零錯(cuò)誤”的應(yīng)用場(chǎng)合。而在能容忍低錯(cuò)誤率的應(yīng)用場(chǎng)合下,Bloom Filter通過(guò)極少的錯(cuò)誤換取了存儲(chǔ)空間的極大節(jié)省。
集合表示和元素查詢
下面我們具體來(lái)看Bloom Filter是如何用位數(shù)組表示集合的。初始狀態(tài)時(shí),Bloom Filter是一個(gè)包含m位的位數(shù)組,每一位都置為0。
為了表達(dá)S={x1, x2,…,xn}這樣一個(gè)n個(gè)元素的集合,Bloom Filter使用k個(gè)相互獨(dú)立的哈希函數(shù)(Hash Function),它們分別將集合中的每個(gè)元素映射到{1,…,m}的范圍中。對(duì)任意一個(gè)元素x,第i個(gè)哈希函數(shù)映射的位置hi(x)就會(huì)被置為1(1≤i≤k)。注意,如果一個(gè)位置多次被置為1,那么只有第一次會(huì)起作用,后面幾次將沒(méi)有任何效果。在下圖中,k=3,且有兩個(gè)哈希函數(shù)選中同一個(gè)位置(從左邊數(shù)第五位)。???
?
在判斷y是否屬于這個(gè)集合時(shí),我們對(duì)y應(yīng)用k次哈希函數(shù),如果所有hi(y)的位置都是1(1≤i≤k),那么我們就認(rèn)為y是集合中的元素,否則就認(rèn)為y不是集合中的元素。下圖中y1就不是集合中的元素。y2或者屬于這個(gè)集合,或者剛好是一個(gè)false positive。
錯(cuò)誤率估計(jì)
前面我們已經(jīng)提到了,Bloom Filter在判斷一個(gè)元素是否屬于它表示的集合時(shí)會(huì)有一定的錯(cuò)誤率(false positive rate),下面我們就來(lái)估計(jì)錯(cuò)誤率的大小。在估計(jì)之前為了簡(jiǎn)化模型,我們假設(shè)kn<m且各個(gè)哈希函數(shù)是完全隨機(jī)的。當(dāng)集合S={x1, x2,…,xn}的所有元素都被k個(gè)哈希函數(shù)映射到m位的位數(shù)組中時(shí),這個(gè)位數(shù)組中某一位還是0的概率是:
其中1/m表示任意一個(gè)哈希函數(shù)選中這一位的概率(前提是哈希函數(shù)是完全隨機(jī)的),(1-1/m)表示哈希一次沒(méi)有選中這一位的概率。要把S完全映射到位數(shù)組中,需要做kn次哈希。某一位還是0意味著kn次哈希都沒(méi)有選中它,因此這個(gè)概率就是(1-1/m)的kn次方。令p = e-kn/m是為了簡(jiǎn)化運(yùn)算,這里用到了計(jì)算e時(shí)常用的近似:
?
令ρ為位數(shù)組中0的比例,則ρ的數(shù)學(xué)期望E(ρ)=?p’。在ρ已知的情況下,要求的錯(cuò)誤率(false positive rate)為:
(1-ρ)為位數(shù)組中1的比例,(1-ρ)k就表示k次哈希都剛好選中1的區(qū)域,即false positive rate。上式中第二步近似在前面已經(jīng)提到了,現(xiàn)在來(lái)看第一步近似。p’只是ρ的數(shù)學(xué)期望,在實(shí)際中ρ的值有可能偏離它的數(shù)學(xué)期望值。M. Mitzenmacher已經(jīng)證明[2]?,位數(shù)組中0的比例非常集中地分布在它的數(shù)學(xué)期望值的附近。因此,第一步的近似得以成立。分別將p和p’代入上式中,得:
???
???
相比p’和f’,使用p和f通常在分析中更為方便。
最優(yōu)的哈希函數(shù)個(gè)數(shù)
既然Bloom Filter要靠多個(gè)哈希函數(shù)將集合映射到位數(shù)組中,那么應(yīng)該選擇幾個(gè)哈希函數(shù)才能使元素查詢時(shí)的錯(cuò)誤率降到最低呢?這里有兩個(gè)互斥的理由:如果哈希函數(shù)的個(gè)數(shù)多,那么在對(duì)一個(gè)不屬于集合的元素進(jìn)行查詢時(shí)得到0的概率就大;但另一方面,如果哈希函數(shù)的個(gè)數(shù)少,那么位數(shù)組中的0就多。為了得到最優(yōu)的哈希函數(shù)個(gè)數(shù),我們需要根據(jù)上一小節(jié)中的錯(cuò)誤率公式進(jìn)行計(jì)算。
?
先用p和f進(jìn)行計(jì)算。注意到f = exp(k ln(1 ? e?kn/m)),我們令g = k ln(1 ? e?kn/m),只要讓g取到最小,f自然也取到最小。由于p = e-kn/m,我們可以將g寫(xiě)成
根據(jù)對(duì)稱性法則可以很容易看出當(dāng)p = 1/2,也就是k = ln2· (m/n)時(shí),g取得最小值。在這種情況下,最小錯(cuò)誤率f等于(1/2)k?≈?(0.6185)m/n。另外,注意到p是位數(shù)組中某一位仍是0的概率,所以p = 1/2對(duì)應(yīng)著位數(shù)組中0和1各一半。換句話說(shuō),要想保持錯(cuò)誤率低,最好讓位數(shù)組有一半還空著。
?
需要強(qiáng)調(diào)的一點(diǎn)是,p = 1/2時(shí)錯(cuò)誤率最小這個(gè)結(jié)果并不依賴于近似值p和f。同樣對(duì)于f’ = exp(k ln(1 ? (1 ? 1/m)kn)),g’ = k ln(1 ? (1 ? 1/m)kn),p’ = (1 ? 1/m)kn,我們可以將g’寫(xiě)成
同樣根據(jù)對(duì)稱性法則可以得到當(dāng)p’ = 1/2時(shí),g’取得最小值。
位數(shù)組的大小
下面我們來(lái)看看,在不超過(guò)一定錯(cuò)誤率的情況下,Bloom Filter至少需要多少位才能表示全集中任意n個(gè)元素的集合。假設(shè)全集中共有u個(gè)元素,允許的最大錯(cuò)誤率為?,下面我們來(lái)求位數(shù)組的位數(shù)m。
?
假設(shè)X為全集中任取n個(gè)元素的集合,F(X)是表示X的位數(shù)組。那么對(duì)于集合X中任意一個(gè)元素x,在s = F(X)中查詢x都能得到肯定的結(jié)果,即s能夠接受x。顯然,由于Bloom Filter引入了錯(cuò)誤,s能夠接受的不僅僅是X中的元素,它還能夠? (u - n)個(gè)false positive。因此,對(duì)于一個(gè)確定的位數(shù)組來(lái)說(shuō),它能夠接受總共n + ? (u - n)個(gè)元素。在n + ? (u - n)個(gè)元素中,s真正表示的只有其中n個(gè),所以一個(gè)確定的位數(shù)組可以表示
個(gè)集合。m位的位數(shù)組共有2m個(gè)不同的組合,進(jìn)而可以推出,m位的位數(shù)組可以表示
???
個(gè)集合。全集中n個(gè)元素的集合總共有
???
個(gè),因此要讓m位的位數(shù)組能夠表示所有n個(gè)元素的集合,必須有
???
即:
???
上式中的近似前提是n和?u相比很小,這也是實(shí)際情況中常常發(fā)生的。根據(jù)上式,我們得出結(jié)論:在錯(cuò)誤率不大于?的情況下,m至少要等于n log2(1/?)才能表示任意n個(gè)元素的集合。
?
上一小節(jié)中我們?cè)愠霎?dāng)k = ln2· (m/n)時(shí)錯(cuò)誤率f最小,這時(shí)f = (1/2)k?= (1/2)mln2 / n。現(xiàn)在令f≤?,可以推出
這個(gè)結(jié)果比前面我們算得的下界n log2(1/?)大了log2?e?≈?1.44倍。這說(shuō)明在哈希函數(shù)的個(gè)數(shù)取到最優(yōu)時(shí),要讓錯(cuò)誤率不超過(guò)?,m至少需要取到最小值的1.44倍。
總結(jié)
在計(jì)算機(jī)科學(xué)中,我們常常會(huì)碰到時(shí)間換空間或者空間換時(shí)間的情況,即為了達(dá)到某一個(gè)方面的最優(yōu)而犧牲另一個(gè)方面。Bloom Filter在時(shí)間空間這兩個(gè)因素之外又引入了另一個(gè)因素:錯(cuò)誤率。在使用Bloom Filter判斷一個(gè)元素是否屬于某個(gè)集合時(shí),會(huì)有一定的錯(cuò)誤率。也就是說(shuō),有可能把不屬于這個(gè)集合的元素誤認(rèn)為屬于這個(gè)集合(False Positive),但不會(huì)把屬于這個(gè)集合的元素誤認(rèn)為不屬于這個(gè)集合(False Negative)。在增加了錯(cuò)誤率這個(gè)因素之后,Bloom Filter通過(guò)允許少量的錯(cuò)誤來(lái)節(jié)省大量的存儲(chǔ)空間。
?
自從Burton Bloom在70年代提出Bloom Filter之后,Bloom Filter就被廣泛用于拼寫(xiě)檢查和數(shù)據(jù)庫(kù)系統(tǒng)中。近一二十年,伴隨著網(wǎng)絡(luò)的普及和發(fā)展,Bloom Filter在網(wǎng)絡(luò)領(lǐng)域獲得了新生,各種Bloom Filter變種和新的應(yīng)用不斷出現(xiàn)。可以預(yù)見(jiàn),隨著網(wǎng)絡(luò)應(yīng)用的不斷深入,新的變種和應(yīng)用將會(huì)繼續(xù)出現(xiàn),Bloom Filter必將獲得更大的發(fā)展。
參考資料
[1] A. Broder and M. Mitzenmacher.?Network applications of bloom filters: A survey. Internet Mathematics, 1(4):485–509, 2005.
[2] M. Mitzenmacher.?Compressed Bloom Filters. IEEE/ACM Transactions on Networking 10:5 (2002), 604—612.
[3]?www.cs.jhu.edu/~fabian/courses/CS600.624/slides/bloomslides.pdf
[4]?http://166.111.248.20/seminar/2006_11_23/hash_2_yaxuan.ppt
原文:http://blog.csdn.net/jiaomeng/article/details/1495500
總結(jié)
以上是生活随笔為你收集整理的HBase总结(九)Bloom Filter概念和原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: HBase phoenix二级索引
- 下一篇: Hbase总结(十)Hhase性能调优