目录
分布式系统的近似统计算法
-
数据量很大且精准度要求高:Hadoop离线计算
-
精确度要求高且实时性要求高且有限数据计算时:ES可以满足要求
-
数据量很大且实时性要求高采用近似计算牺牲精准度
Min聚合分析的执行流程
- 对索引做一个Min聚合,而且数据是分布在三个分片上的
- Coordinating Nodes收到一个Min聚合的请求时,同时到三个分片上找到三个分片上的最小值
- 在Coordinating Nodes对三个返回的结果求一个最小值
Terms Aggregation
- 在Terms Aggregation的返回中有两个特殊的数值
-
doc_count_error_upper_bound : 被遗漏的term分桶,包含的文档,有可能的最大值
-
sum_other_doc_count : 除了返回结果bucket的terms以外,其他terms的文档总数(总数--返回的总数)
-
Term 聚合的分析流程
- 对索引做一个Terms聚合,而且数据是分布在三个分片上的
- Coordinating Nodes收到一个Terms聚合的请求时,同时到三个分片上找到三个分片上的三个文档
- 在Coordinating Nodes对三个分片上的三个文档取top3
- 以上分析看似合理,其实结果可能不正确
Terms不正确的案例
- Coordinating Nodes对左右两边返回的结果做一个汇总,然后进行排序
- 最终的返回结果是: A:12--> B:6-->C:4
- D真实的总数应该是6,被错误的排除掉
-
doc_count_error_upper_bound : 被遗漏的term分桶,包含的文档,有可能的最大值
-
sum_other_doc_count : 总的文档数(29)-返回的文档数(22)=7
解决Terms不准的问题: 提升shard_size的参数
-
Terms聚合分析不准的原因,数据分散在多个分片上,Coordinating Node无法获取数据全貌
-
解决方案1:当数据量不大时,设置Primary shard为1;实现准确性
-
方案2:在分布式数据上,设置shard_size参数,提高准确度.
-
原理:每次从shard上额外获取数据,提升准确率
-
调整shard size的大小,降低doc_count_error_upper_bound 来提升准确度
-
增加整体计算量,提高了准确度,但会降低相应时间
-
-
Shard Size默认大小设定
-
shard size = size * 1.5 + 10
-
-
- 通过增加shard_size的大小可以保证聚合结果的正确性
打开show_term_doc_count_error
- 发送Term Aggs的时候通过增加参数(show_term_doc_count_error设为true)帮助了解聚合分析的结果是不是精确.