Sketch介紹
爲何要用Sketch
- 網絡流主要根據五元組、主機地址、包的大小來分類。在網絡中存在各類各樣的包,若是按照上述分類方法,對每一種包都分配一個計數器來儲存,雖然測量準確,那麼存放計數器的空間開銷會很是大。因此使用哈希的方法,根據哈希值的範圍來肯定的所需的存儲空間,各類包根據哈希值再次歸類,能夠大大減小存儲空間。這樣使用哈希來估計流的方法稱爲Sketch-based方法。
Count-min sketch
如何處理包
- 使用哈希的方法會產生衝突,多個種類的包哈希到同一個桶內,那麼這個桶的計數值就會偏大,爲了減小偏差,設計了count-min sketch
- 設置多個哈希函數,開闢一個二維地址空間,包通過不一樣哈希函數的處理,獲得對應的哈希值,而這個哈希值就是sketch(概要)。這些哈希值可能產生衝突,多個種類的包可能有相同的哈希值,則根據哈希值來肯定包出現的次數則會偏大,因此設立多個哈希函數,取最小的哈希值,則最接近實際包數據。
![](http://static.javashuo.com/static/loading.gif)
count-min sketch 某種實現
class CountMinSketch {
long estimators[][] = new long[d][w] // d and w are design parameters
long a[] = new long[d]
long b[] = new long[d]
long p // hashing parameter, a prime number. For example 2^31-1
void initializeHashes() { //初始化hash函數family,不一樣的hash函數中a,b參數不一樣
for(i = 0; i < d; i++) {
a[i] = random(p) // random in range 1..p
b[i] = random(p)
}
}
void add(value) {
for(i = 0; i < d; i++)
estimators[i][ hash(value, i) ]++ //簡單的對每一個bucket經行疊加
}
long estimateFrequency(value) {
long minimum = MAX_VALUE
for(i = 0; i < d; i++)
minimum = min( //取出最小的估計值
minimum,
estimators[i][ hash(value, i) ]
)
return minimum
}
hash(value, i) {
return ((a[i] * value + b[i]) mod p) mod w //hash函數,a,b參數會變化
}
}
Count-min sketch分析
- 空間利用率和1/ε成比例(從1/ε^2降到1/ε);
- 亞線性的更新時間
- 只須要構建相互獨立的哈希函數,簡單方便部署
- 這個sketch能夠應用於多種應用和查詢
- 全部常量都是精細且小的
- 缺點: 對於大量重複的element或top的element比較準確,但對於較少出現的element準確度比較差
現有方法及其改進
- 現有sketch方法大可能是針對某個特定問題的求解,不具備廣泛性
![](http://static.javashuo.com/static/loading.gif)
- SketchVisor能夠選擇多種sketch方法以應對不一樣種類的問題,對於過載流量,則將它導入fast path
sketch的優缺點
- 瓶頸:hash的計算開銷和堆的維護開銷,更新計數器和對包的頭部的處理
- 優點:節省內存,理論上的可靠性
經過哈希函數的設置、減小開銷html
sketch檢測大流
- 對流的大小設定一個閾值,當超過這個閾值時,報出大流。可是這個閾值一般是不可預知的,爲了防止誤報,須要檢測全部可能出現的流大小,以肯定這個閾值。因爲須要檢測的流很是多,因此在肯定閾值上要花費不少時間。
總結
- Sketch是使用哈希來進行估計網絡流的一種測量方法,能夠減小存儲開銷
- Count-Min Sketch取多個哈希函數的最小哈希值做爲網絡流的估計,實現簡單,空間開銷較少
- SketchVisor能夠選擇多種sketch方法以應對不一樣種類的問題,對於過載流量,則將它導入Fast path
- 瓶頸主要在hash的計算開銷、堆的維護開銷、更新計數器、對包的頭部的處理
- 優點主要在理論上的可靠性,節省內存
參考文獻