# 聚合算法讲解
# 易并行算法 max
有些聚合分析的算法,是很容易就可以并行的,比如说 max,流程如下:
- 假设有 3 和 shard 查找最大值
- 每个 shard 查找并返回一个最大值
- 在聚合节点上会拿到 3 个值,然后在这三个值中排序出最大的一个即可
有些聚合分析的算法是不好并行的,比如说 count(distinct)
(去重后统计剩余数量,也就是唯一值个数),
并不是说在每个 node 上直接就出一些 distinct value 就可以的,因为每个 shard 之间可能还有重复的数据,所以就不准的,
这个时候就需要从每个 shard 上把所有相关数据都获取过来,然后计算
如下图
不易并行算法进行聚合的时候,由于数据量可能太大会导致内存占用过多,性能严重影响,甚至内存溢出,
这个时候 es 会采取近似聚合的方式,就是采用在每个 node 上进行近估计的方式,
得到最终的结论,如:cuont(distcint)
本来是 100 万,可能会返回 105 万,
近似估计后的结果,不完全准确,但是速度会很快,一般会达到完全精准的算法的性能的数十倍。
这就会出现一个概念,三角选择原则
# 三角选择原则
精准 + 实时 + 大数据只能选择 2 个
- 精准+实时: 没有大数据,数据量很小,那么一般就是单机跑,随便你则么玩儿就可以
- 精准+大数据:hadoop 批处理,非实时,可以处理海量数据,保证精准,可能会跑几个小时
- 大数据+实时:es,不精准,近似估计,可能会有百分之几的错误率
# 近似聚合算法
- 如果采取近似估计的算法:延时在 100ms 左右,0.5% 错误
- 如果采取 100% 精准的算法:延时一般在 ns~几十s,甚至几十分钟,几小时, 0% 错误
TIP
对于这个错误率不知道是怎么出来的,就是一句话数据量非百分百准确