想法記錄 實時計算的TopN的實現

2021-08-28 06:50:40 字數 1376 閱讀 8978

topn就是找出時間段內出現頻率最高的n個

topn的計算是個老生常談的話題,比如微博的熱搜,都是隔段時間就統計一次topn

現在想做乙個實時計算的topn.

先說說離線計算的topn,再說實時topn

離線topn一般出現在大資料的應用場景,使用hadoop的map reduce,網上有很多案例

實時的計算,相比離線計算,會有如下問題

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

離線計算與實時計算的對比

就是在計算開始前已知所有輸入資料,輸入資料不會產生變化,一般計算量級較大,計算時間也較長。例如今天早上一點,把昨天累積的日誌,計算出所需結果。最經典的就是hadoop的mapreduce方式 一般是根據前一日的資料生成報表,雖然統計指標 報表繁多,但是對時效性不敏感。從技術操作的角度,這部分屬於批處...

收視率的實時計算

尼爾森和索福瑞 收視率的起源是應廣告主們為知曉花錢值不值而誕生。這活就交予市場調查公司完成。走的仍是市場調查的路子。收視率調查和所有市場調查如人口普查沒什麼兩樣。了解了人口普查的操作方式,您就知道樣本汙染是怎麼回事了,雖然索福瑞也想極力杜絕,換調查人員 頻繁換樣本戶都是一些補救措施。曾經,全球有無數...

基於HDFS的實時計算和wordcount程式

基於hdfs檔案的實時計算,其實就是,監控乙個hdfs目錄,只要其中有新檔案出現,就實時處理。相當於處理實時的檔案流。streamingcontext.filestream datadirectory streamingcontext.filestream keyclass,valueclass,i...