最近再看bloom filter的刪除問題,偶然間看到cuckoo filter的資料結構。bloom filter的思想是通過多維hash的辦法,降低hash衝突的概率.。basic bloom filter僅儲存位圖資訊,只能判斷乙個key是否在集群內,可能存在假陽性(false positive),不存在假陰性(false negtive)。counting bloom filter還可以做統計計數,支援刪除,但是空間消耗比較大。cuckoo hash則是一種高效的hash表實現,也是通過多維hash的辦法降低hash桶的衝突提高hash表的儲存效率。
cuckoo filter的思想是結合cuckoo hash和bloom filter思想一起:
本文想引出的是基於cuckoo filter的分布式儲存系統中資料消重的應用。
分布式儲存系統中的離線削重,有以下幾個難點
解決思路
方案一,簡單的思路,以資料分片指紋為key,分片id和位置資訊的value,建立乙個分布式key-value儲存,作為反向索引。缺點是占用大量的記憶體空間,需要維護乙個分布式key-value儲存,問題更為複雜。
方案二,通過bloom filter對指紋的key進行過濾,因為重複資料畢竟少數,可以通過bloom filter過濾掉大部分非重複的資料,缺點是如果資料有重複時,並無法索引到檔案分片的位置資訊,這個時候需要查詢分片位置比較困難;如果採用counting bloom filter,也可能存在假陰性,降低刪重效率。
利用改進的cuckoo filter,在指紋中增加分片位置資訊,這樣即保證了效率,即大部分非重複資料的請求被cuckoo filter過濾掉,而命中的請求可以通過指紋中的節點位置資訊定位到分片位置。cuckoo filter的儲存效率也非常搞,節點數量不大,增加6個bit作為索引就可以記錄64個節點,10億的記錄,hash表的空間利用率80%的情況下,而外增加的總的空間也不超過1byte*1g/0.8,幾個g的空間,單點完全放的下,可以接受。
備註:筆者以前的系統是通過方案二實現的。查詢分片位置的時候比較麻煩,採用了在元資料集群中廣播查詢的方式。現在看來用cuckoo filter比較合適。
另外再插一句,bloom filter/cuckoo filter的高效實現過程中還需要考慮cpu cache optimization。cuckoo filter14年cmu的**有提到,github上也c++實現。
cuckoo-conext2014.pdf
後記:用roaring bitmap/bit map encode也可以解決hash指紋的索引問題。例如採用sha128雜湊摘要,如果原始的bitmap,記憶體占用太大了,資料hight cardinality的資料。但是分布式系統中chunk的數量遠沒有這麼大,如果64m乙個chunk,4t盤,3t的資料,乙個盤也就6w個chunk,1w個盤,也就600m個chunk。也就是chunk的數量不會太多。這種情況下用roaring bitmap不錯。roaring bitmap的空間佔用量跟key的所有可能空間沒關係,只跟unique key的sum成比例。這樣的話不用bloom filter也可以接受的。跟boomfiter對比,占用的儲存空間會更大,但是避免了假陽性的問題。
海量資料檢索的利器
檢索 解決的最大問題就是如何做到低延遲 快速匹配 採用區域性敏感雜湊 lsh facebook的開源資料報 pysparnn 解決問題 稀疏資料的近鄰搜尋!源 測試原始碼 test import osimport pysparnn.cluster index as ci from sklearn.f...
Ambari 大資料平台的搭建利器
ambari 是什麼 ambari 跟 hadoop 等開源軟體一樣,也是 apache software foundation 中的乙個專案,並且是頂級專案。目前最新的發布版本是 2.0.1,未來不久將發布 2.1 版本。就 ambari 的作用來說,就是建立 管理 監視 hadoop 的集群,但...
大資料時代的「找油利器」
能源行業邁入大資料時代 隨著資料總量的持續增長和急速膨脹,大資料時代已經來臨,石油 電力等能源細分行業紛紛拉開了大資料開發應用的序幕。如何從海量資料中高效獲取資訊,有效地深加工並最終得到有用資料是能源企業涉足大資料的目的。對石油行業來說,眾多企業正在把更多的新技術應用於戰略決策 科技研發 生產經營和...