易并行聚合算法
有些聚合分析的算法是很容易并行的,比如说max函数,如图
比如说,现在一共有三个shard,一个查询最大值的搜索请求过来了,那么coordinate node(协调节点)会把请求打到这三个shard上
这个时候,3个shard把他们各自的最大值返回给coordinate node,然后coordinate node再取到这三个里面的最大值,返回给客户端就可以了
有些聚合分析的算法是不好并行的,比如说count(distinct) 找去重后的数据量,并不是说在所有shard上去重之后返回给coordinate node的,因为数据可能会有很多
如图,还是3个shard,每个shard去重后有100W条数据返回给coordinate node,这时候,就要占用大量的内存,最少也需要100W条数据的内存, 他不像上面的max一样,只要保留一个long值的内存,每个shard返回数据的时候对比一下,大于就替换这种, 他需要占用大量的内存, 那么还用这种算法就不是很合适了
es会采用近似聚合的方式,就是采用在每个node上进行近估计的方式,得到最终的结论,但是这个结果跟实际是有一定的偏差的,比如说count(distinct)去重后,是有100W的数据,但是es估计的值是105万或者95万,就有5%左右的错误率
三角选择原则
- 精准
- 实时
- 大数据
在这三个中只能选择两个,比如
- 精准+实时:没有大数据,适合数据量很小的情况,一般就是单机跑,随便怎么玩儿
- 精准+大数据:比如hadoop,批处理,非实时,可以处理海量数据,保证精准,但是可能会跑个几分钟几小时的
- 大数据+实时:比如es,不精准,近似估计,可能会有百分之几的错误率
近似聚合算法
如果采取近似估计的算法,延迟大概在100ms左右,0.5%的错误率
如果采用100%精准的算法,延时一般在几秒到几十秒甚至几十分钟几小时, 0%的错误率