想法记录---实时计算的TopN的实现

TopN就是找出时间段内出现频率最高的n个
TopN的计算是个老生常谈的话题,比如微博的热搜,都是隔段时间就统计一次TopN
现在想做一个实时计算的TopN.

先说说离线计算的TopN,再说实时TopN

离线TopN

离线TopN一般出现在大数据的应用场景,使用hadoop的map reduce,网上有很多案例

实时TopN

实时的计算,相比离线计算,会有如下问题
1.实时计算的数据不是一次性的,而是随着时间的推移一点点来的,
这就涉及如果一段时间内数据太大,会导致map等存储空间不够
况且还要做排序,拿到TopN,如果直接将所有数据等在内存中,一般内存是不够的
2.实时计算统计一段时间内的TopN,加入统计前5分钟内的TopN,比如0分到5分
那么再过一分钟,我们要的TopN的时间段就是1分到6分,那么如何在原来TopN的数据基础上,
减掉0分到1分的数据

解决:
问题1:先举个例子
假如有一个学校有1000人,10个班级,每个班100人
学校要往市里推送10名学生参加考试,学校当然是希望找到全校最好的10名同学
这就是一个典型的TopN的场景
一般学校都会直接从上次月考考试的结果中,直接取前10名同学
这个就是离线TopN
但是如果说,假如学校没有这个考试结果,只能从每个班的维度抽取学生去考试,那么该怎么办呢
下面就是实时TopN的核心解决思路
如果我们要找到全校学习最好的学生,那么可以直接从每个班先取10个学习最好的
再从这些同学中选出前10名,即是最后的结果
这样可以减少很多的比较,因为在一次考试中,一个班级的第十一名,永远不可能是本次考试全校的前十名
这个看上去很简单的道理,接下来用到实际中,很多人都想不到

回到正式场景,还是统计一段时间内的TopN,比如统计接下来5分钟内出现下订单的sku使用最多的前10个
storm开始实施统计,每下一单,都会记录这个sku以及对应的数量+1
如果将所有sku都放在1个bolt上去统计排序,随着sku的数量增加,一个bolt终究吃不消
所以我们先将这些sku取hash,然后分到多个同级bolt上,每个bolt就是一个jvm,统计bolt有多少个也就是bolt的并行度
取hash可以保证相同的sku总会被分到相同的bolt上
然后在每个bolt上统计前10的sku,最终在后面的bolt上汇总,然后取出前10个,就是要的结果

假如现在是双十一或者618大促,商城假如有1000万个做活动的sku,那么会在接下来的5分钟内预计这些sku都会有人下单
假如我们storm的每个bolt能处理10万的sku,包括统计,排序,选出top10,
极限情况下,我们就可以将这个bolt的并行度设置成100,也就是会有100个jvm同时计算,选出top10

你可能感兴趣的:(大数据)