每天:
1) 訊息量:傳送和接收的訊息數超過60億
2) 將近1000億條資料的讀寫
3) 高峰期每秒150萬左右操作
4) 整體讀取資料占有約55%,寫入占有45%
5) 超過2pb的資料,涉及冗餘共6pb資料
6) 資料每月大概增長300千兆位元組。
在日常生活中,包括在設計計算機軟體時,我們經常要判斷乙個元素是否在乙個集合中。比如在字處理軟體中,需要檢查乙個英語單詞是否拼寫正確(也就是要判斷它是否在已知的字典中);在 fbi,乙個嫌疑人的名字是否已經在嫌疑名單上;在網路爬蟲裡,乙個**是否被訪問過等等。最直接的方法就是將集合中全部的元素存在計算機中,遇到乙個新元素時,將它和集合中的元素直接比較即可。
一般來講,計算機中的集合是用雜湊表(hash table)來儲存的。它的好處是快速準確,缺點是費儲存空間
。當集合比較小時,這個問題不顯著,但是當集合巨大時,雜湊表儲存效率低的問題就顯現出來了。比如說,乙個像 yahoo,hotmail 和
gmai
那樣的公眾電子郵件(
)提供商,總是需要過濾來自傳送垃圾郵件的人(
spamer
)的垃圾郵件。乙個辦法就是記錄下那些發垃圾郵件的
位址。由於那些傳送者不停地在註冊新的位址,全世界少說也有幾十億個發垃圾郵件的位址,將他們都存起來則需要大量的網路伺服器。如果用雜湊表,每儲存一億個
位址, 就需要
1.6gb
的記憶體(用雜湊表實現的具體辦法是將每乙個
位址對應成乙個八字節的資訊指紋
,然後將這些資訊指紋存入雜湊表,由於雜湊表的儲存效率一般只有
50%,因此乙個
位址需要占用十六個位元組。一億個位址大約要
1.6gb
, 即十六億位元組的記憶體)。因此存貯幾十億個郵件位址可能需要上百
gb 的記憶體。除非是超級計算機,一般伺服器是無法儲存的。
布隆過濾器只需要雜湊表 1/8 到
1/4
的大小就能解決同樣的問題。
bloom filter是一種空間效率很高的隨機資料結構,它利用位陣列很簡潔地表示乙個集合,並能判斷乙個元素是否屬於這個集合
。bloom filter的這種高效是有一定代價的:
在判斷乙個元素是否屬於某個集合時,有可能會把不屬於這個集合的元素誤認為屬於這個集合(false positive)。因此,bloom filter不適合那些「零錯誤」的應用場合。而在能容忍低錯誤率的應用場合下,bloom filter通過極少的錯誤換取了儲存空間的極大節省。
下面我們具體來看bloom filter是如何用位陣列表示集合的。初始狀態時,
bloom filter
是乙個包含
m位的位陣列,每一位都置為
0,如圖
9-5所示。
圖9-5
為了表達s=
這樣乙個
n個元素的集合,
bloom filter使用k
個相互獨立的雜湊函式(
hash function
),它們分別將集合中的每個元素對映到
的範圍中。對任意乙個元素x,第
i個雜湊函式對映的位置
hi(x)
就會被置為1(
1≤i≤
k)。注意,如果乙個位置多次被置為
1,那麼只有第一次會起作用,後面幾次將沒有任何效果。如圖
9-6所示,
k=3,且有兩個雜湊函式選中同乙個位置(從左邊數第五位)。
圖9-6
在判斷y是否屬於這個集合時,我們對y應用k次雜湊函式,如果所有hi(y)的位置都是1(1≤i≤k),那麼我們就認為y是集合中的元素,否則就認為y不是集合中的元素。如圖9-7所示y1就不是集合中的元素。y2或者屬於這個集合,或者剛好是乙個false positive。
圖9-7
· 為了add乙個元素,用k個
hash function
將它hash
得到bloom filter中k
個bit
位,將這k個
bit位置1。
· 為了query乙個元素,即判斷它是否在集合中,用k個
hash function
將它hash得到k
個bit
位。若這
k bits全為1
,則此元素在集合中;若其中任一位不為
1,則此元素比不在集合中(因為如果在,則在
add時已經把對應的k個
bits
位置為1
)。· 不允許remove元素,因為那樣的話會把相應的k個
bits
位置為0
,而其中很有可能有其他元素對應的位。因此
remove
會引入false negative
,這是絕對不被允許的。
布隆過濾器決不會漏掉任何乙個在黑名單中的可疑位址。但是,它有一條不足之處,也就是它有極小的可能將乙個不在黑名單中的電子郵件位址判定為在黑名單中,因為有可能某個好的郵件位址正巧對應乙個八個都被設定成一的二進位制位。好在這種可能性很小,我們把它稱為誤識概率。
布隆過濾器的好處在於快速,省空間,但是有一定的誤識別率,常見的補救辦法是在建立乙個小的白名單,儲存那些可能個別誤判的郵件位址。
布隆過濾器具體演算法高階內容,如錯誤率估計,最優雜湊函式個數計算,位陣列大小計算,請參見
。
hbase 布隆過濾器
前幾天,和同事聊天發現他們對於hbase的的過濾器只知道查詢過濾器,並不知道布隆過濾器什麼,所以今天的文章就來說說特殊的過濾器 布隆過濾器。基本理論 首先要知道布隆過濾器的作用在 hbase的中我們查詢乙個rowkey時,hbase的會通過一下三個步驟查詢我們匹配的 rowkey。1,先查詢mems...
布隆過濾器
布隆過濾器 bloom filter 是1970年由布隆提出的。它實際上是乙個很長的二進位制向量和一系列隨機對映函式。布隆過濾器可以用於檢索乙個元素是否在乙個集合中。它的優點是空間效率和查詢時間都遠遠超過一般的演算法,缺點是有一定的誤識別率和刪除困難。如果想要判斷乙個元素是不是在乙個集合裡,一般想到...
布隆過濾器
布隆過濾器的概念 如果想要判斷乙個元素是不是在乙個集合裡,一般想到的是將所有元素儲存起來,然後通過比較確定。鍊錶,樹等等資料結構都是這種思路.但是隨著集合中元素的增加,我們需要的儲存空間越來越大,檢索速度也越來越慢 o n o logn 不過世界上還有一種叫作雜湊表 又叫 雜湊表,hash tabl...