一种对海量日志进行实时uv统计的方法及系统的制作方法

文档序号:9814016阅读:1845来源:国知局
一种对海量日志进行实时uv统计的方法及系统的制作方法【
技术领域
】[0001]本发明涉及互联网大数据领域,特别涉及一种对海量日志进行实时UV统计的方法及系统。【
背景技术
】[0002]UV是uniquevisitor的简写,是指通过互联网访问、浏览这个网页或APP的自然人,中文又称独立访问用户。UV是一个反映实际使用者的概念,每个独立用户相对于每个ip,更加准确地对应一个实际的浏览者。使用UV作为统计量,可以更加准确的了解单位时间内实际上有多少个访问者来到了相应的页面,是衡量一个网站或APP的用户使用情况的一个重要指标。[0003]相对于UV,还有一个重要的概念就是PVIV是PageView的简写,即页面浏览量,在一定统计周期内用户每次刷新网页一次即被计算一次PV,和UV—样,PV也是衡量一个网站或APP访问情况的一个重要指标。用户每次刷新网页系统会记录一条访问日志,访问日志又称PVLog,通常以文件的形式存在。每条访问日志一般至少要记录谁在什么时间访问了什么页面,根据实际需求,也会有其它的信息被一起记录。[0004]从PV和UV这两个概念的定义可知,UV是从对PVLog中在一段时间范围内的相同用户进行去重计算而得,此处的一段时间范围是指UV统计的时间周期,可以为天或小时,对应天级UV或小时级UV。[0005]由于,UV的计算可以通过对PVLog(PV日志)中在一段时间范围内的相同用户的去重计算。我们知道,对于大型网站而言,PVLog通常都是海量的,比如国内某知名C2C电商网站搜索页面的日PV达到数十亿级,而且日志都是动态产生并不断生成的。所以UV统计的问题就演变为如何在超大规模数据集中进行有效去重的问题,而实时UV统计则意味着在不断增长的超大数据集中进行实时去重。[0006]传统的进行UV计算的方法是基于哈希表(hashtable)的,这种方案存在如下问题:[0007]1.对于32bit的hashvalue哈希值,hashtable哈希表的元素达到10万级时,插入元素的碰撞概率将高于50%;而要将10亿级hashtable的碰撞概率降低到I%以下,则hashvalue至少为64bit.而此时hashtable的内存占用达20G以上,当数据集继续增长时,内存开销有可能超过单机的限制。[0008]2.10亿级的元素插入,hashtable将resize调整大小数十次,resize的开销呈指数增长,对于某些实时计算的需求,此方案将变得不可用。【
发明内容】[0009]本发明要解决的技术问题是,通过基于布隆过滤器,进而能在超大数据集中进行实时去重,实现快速UV统计。[0010]基于布隆过滤器(BloomFilter)实现了实时UV统计系统,通过选择若干个哈希函数巧妙的把每一条实时的PVLog在常数时间内“映射”到位数组的相应个数的特定的bit位上,再通过简单的判断即可实时计算出当前UV值。具有实现简单、占用系统资源少、运行效率高、实时性等优点。[0011]解决上述技术问题,本发明提供了一种对海量日志进行实时UV统计的方法,包括:[0012]采集PVLog页面浏览量日志,进行分发后等待处理;同时设置UV计数器;[0013]创建BloomFilter布隆过滤器,在当前进程的堆内存中创建BitArray位数组,以及定义k个不同的Hash函数,K为布隆过滤器中Hash函数的个数,每个Hash函数都将元素(PVLog)映射到BitArray中的一个位。[0014]将BitArray中所有位都初始化为O;[0015]接收等待处理的PVLog,并对其中每条PVLog通过k个不同的Hash函数映射到BitArray的k个bit位;[0016]判断上述k个bit位是否全部为I,若不是则所述UV计数器加I,并将这个k个bit位全部置为I;[0017]输出UV计数器的值,完成UV统计。[00?8]更进一步,定义k个不同的Hash函数的方式为:[0019]对每个Hash函数按照均匀随机分布的方式将元素hash到不同位置中,k个不同的Hash函数则将元素hash到k个不同的位置。[0020]更进一步,创建布隆过滤器的方法包括:[0021]在初始状态时,对于长度为m的BitArray中的所有位都被置为O;[0022]对于有η个元素的集合D={dl,d2......dn},通过k个映射函数{fI,f2,......伐},将集合0中的每个元素也(1〈=1〈=11)映射为1^个值{71,72......yk},再将BitArray中相对应的array[yl],array[y2]......array[yk]置位为I。[0023]更进一步,采集PVLog页面浏览量日志的方法为,前端页面js上报、后台服务端上报或者移动端客户端sdk上报。[0024]更进一步,判断上述k个bit位是否全部为I,若是则跳过所述UV计数器,不进行计数,继续接收需要处理的PVLog0[0025]基于上述方法,本发明还提供了对海量日志进行实时UV统计的系统,包括:[0026]布隆过滤器创建与初始化模块,所述布隆过滤器创建与初始化模块用以创建BloomFilter布隆过滤器,在内存中创建BitArray位数组,以及定义k个不同的Hash函数,将BitArray中所有位都初始化为O;[0027]日志实时接收模块,所述日志实时接收模块用以接收等待处理的PVLog;[0028]日志处理模块,所述日志处理模块用以对等待处理的PVLog中每条PVLog通过k个不同的Hash函数映射到BitArray的k个bit位;判断上述k个bit位是否全部为I,若不是则所述UV计数器加I,并将这个k个bit位全部置为I;[0029]结果输出模块,所述结果输出模块用以输出UV计数器的值,完成UV统计。[0030]更进一步,系统还包括,网站PV日志实时采集单元,[0031]用以通过前端页面js上报、后台服务端上报或移动端客户端sdk上报的方式将采集到的PV日志实时传送到所述日志处理模块。[0032]更进一步,系统还包括分发子系统,[0033]用以通过scribe收集日志,并将实时采集的日志分发到所述日志处理模块。[0034]更进一步,所述日志实时接收模块用以实时接收发子系统实时发送过来的PVLog,并将PVLog转发给日志处理模块。[0035]更进一步,所述结果输出模块用以将UV计数器的值实时输出到外部文件、数据库、共享内存以及KV存储引擎。[0036]本发明的有益效果:[0037]I)占用更小的内存资源,即更优的空间复杂度[0038]根据上文对布隆过滤器Falsepositives的推导结论,对于本文的UV统计需求,假设PVLog的记录数为10亿,S卩n=10亿,如果可以接受的错误率为0.01JljBitArray的大小m?10亿*9.585,BitArray的存储空间〈1.2G,即使我们把可以接受的错误率降低到0.0001JljBitArray的大小10亿*19.170,BitArray的存储空间仍小于2.3G.对于UV统计而言,万分之一的误差是一般是可以接受的。[0039]2)占用更少的处理器资源,即更优的时间复杂度[0040]不存在hashtable面临的大规模元素插入时的频繁碰撞以及多次resize问题,k个hash函数的映射与k个bit位的置位都是常数时间,所以整个过程的时间复杂度是O(N),为线性。[0041]3)可以非常方便的进行UV的动态实时计算[0042]一般网站或APP的PV日志时动态实时产生,只要接收到的PVLogFeed给布隆过滤去处理模块即可。【附图说明】[0043]图1是本发明一实施例中的一种对海量日志进行实时UV统计的方法流当前第1页1 2 3 
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1