想法记录---实时计算的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
總結
以上是生活随笔為你收集整理的想法记录---实时计算的TopN的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 短信微信等消息发送系统的架构设计
- 下一篇: 刚买的ubuntu服务器 为什么没有文件