start
二八定律:头部20%的数据占据80%的访问流量;
但热点无法预测,只能监测;
预判的方案基本分为:
小数据量情况下,应用实例在本地缓存全部信息,定时推送更新,缺点是不同业务需要实现各自的local cache相关逻辑;
通过计数判断热点,即为上一时刻的热点提供本地缓存,同样需要实现不同业务各自的逻辑;
热点检测与治理框架:
热点检测+本地缓存;
- 实现监控热点;
- 识别突发热点,并字段将其放入本地缓存;
- 高效本地缓存策略,提供缓存命中率;
- 支持提前将数据添加到本地缓存(白名单);
- 通过配置开启热点检测与本地缓存,非侵入式接入;
热点检测算法(用于数据流中的频繁元素检测的算法,topk大象流识别):
1、Lossy Counting(admit-all-count-some)
核心流程:
将数据流切分成大小一致的窗口(size取决于期望错误率);
分别统计每个窗口中元素出现的频率,切换计算下一个窗口时,将所有元素的频率-1,并且删除计数值为0的元素,直到到达数据检查点或者窗口处理完成,排序内存中的剩余元素得到top k;
核心理念:
高频元素遵循 长尾分布(也叫帕累托分布)。即,少数元素频率非常高,占据了总频率的较大部分,而大量低频元素几乎可以忽略不计,
通过引入一个错误边界 ε ,有意识地进行近似计算,允许一定范围的误差。这个错误率是通过算法[1]中定义的桶和窗口大小来控制的。错误率的上限是可以事先设定的,控制在一个可接受的、预先定义的阈值内;
2、Count-Min Sketch
核心流程:
通过多个哈希函数,将元素映射到多个计数器数组中,可将其看为一个二维计数器数组,d行w列,有d个独立的哈希函数,w个计数器[2],映射关系为idx = h(n) % w
;在处理数据流时,通过最小堆维护 topk,对于每个元素,频率估计值取其 d个哈希 后得到的 多个计数器 的最小值,f(x) = min1≤i≤dC[i][hi(x)]
;
核心理念:
数学上可证明多增加一行(一个哈希函数),会使bad estimate(错误估计)的几率减半,且长度为 w 的sketch,错误率与 w 成反比;通常 w 设为 ⌈eϵ⌉ ,ϵ 是允许的误差范围,ϵ =(Cmax−Cest) / Cest
,Cest为估计值, Cmax为实际计数值;
3、HeavyKeeper
核心流程:
在CM sketch的基础上,在每一个bucket里,额外存储哈希指纹,遇到哈希冲突时不再是+1,而是将计数值进行衰减,衰减概率:Pdecay = b-C
(b > 1);(b为衰减因子,C为计数值)
核心理念:
计数值增大时,衰减概率降低,大象流可保持稳定,淘汰鼠流;
参考文章:
[2] Data Sketching笔记
[3] Count-Min Sketch
[4] 论文阅读笔记:HeavyKeeper: An Accurate Algorithm for Finding Top-k Elephant Flows