时序数据库 druid 简介 之技术点 统计估算算法

来源:互联网 发布:国家统计局进度数据库 编辑:程序博客网 时间:2024/06/06 07:28

在前边介绍时序数据的时候, 我们可能经常会遇到计算基数(Cardinality) 和分位数 (Quantile)。 基数我们可以理解为 count distinct。比如计算页面访问的独立ip, 分位数我们举个我们最常用的第99百分位数例子, 假设我说中国人寿命的第99百分位数是101岁, 这个表示, 99%的中国人的寿命不会超过101岁。


我们看看基数怎么计算。 假设我们要统计独立ip, 则我们需要一行行读入访问日志, 找到对端ip, 然后在内存里建一个map或者set, 测试这个ip是否已经存在, 如果不存在则插入。 最后统计map或者set的元素。 这个方法虽然很准确, 但是要消耗大量的内存。 其实在现实应用中, 这个数据往往允许一定范围的误差, 所以我们可以用统计方法来计算这个基数。 思路如下,首先我们把ip地址用一个哈希函数均匀的分散到 一个很大的范围上, 然后再把哈希后的值映射到一组(比如1k个)bucket中。 每个bucket只需要一个bit表示。 如果有数据映射到这个bucket 则标记为1 否则标记为0.  现在假设访问请求都是特定的几个ip产生的, 则在我们的bucket中, 大量bit都是0. 如果访问请求来自众多的不同的ip, 则大量bit位被置1. 所以通过被置1的bit的多少就能估算出独立ip的数量。 

上面我只介绍一个基本原理, 详细的算法请自行翻看论文。


在时序数据处理中, 类似上面这种估算算法被大量使用,一般涉及基数(Cardinality), 分位数(Quantile), topN等运算的时候都可以使用类似估算方法在一定误差范围内得到可接受的结果。限于个人能力以及篇幅, 这里不做一一介绍。


在druid中, 这些估算算法也得到了封装, 用户只要在的定义task的时候加以说明, 就可以直接使用了。


广告插播:

大数据处理招聘:

要求算法,数据结构等基础知识扎实

具有良好的编程功底

了解大数据解决方案

有过高并发高压力系统设计开发经验

熟练使用Linux系统,了解Linux内核


工作地点: 大连

工作内容: line 相关大数据处理

联系方式 简历发送至    dl_server_developer_recruit%nhn.com


喜欢工作上有压力有挑战, 生活上惬意舒适的朋友, 大连欢迎你


0 0
原创粉丝点击