大資料下的實時熱點功能實現討論(實時流的TopN)

2021-08-18 19:16:30 字數 2041 閱讀 1009

word count

先來看下word count的部分如何做,如何解決資料熱點,如何減少對後面的壓力,我直接上topo圖。

其實在bolt中加cache就可以大大減少發出去的訊息量,這裡我還有個step2的bolt,是因為我們在實踐中發現,如果多個bolt對hbase同可以key寫入,雖然可以通過hbase的increment來保證資料的一直性,但在其過程中要對行加鎖,高併發的情況下寫入效能會受影響。所以可以先資料流隨機shuffle到step1,然後對流量做洩壓,然後按key fieldsgrouping到step2,由step2中的bolt對hbase的資料做get add put的三步操作,沒有hbase的加鎖操作,grouping後也沒併發寫乙個rowkey的問題。

topn

如果我們已經有count好的《詞,詞頻》資料,其實我們並不需要全域性排序後擷取前n個來實現topn,其實用最小堆就可以大幅度減少topn的時間複雜度。假設資料量為m,排序的時間複雜度可能到o(mlogm),用最小堆求topn時間複雜度為o(mlogn),實際情況下n遠小於m,這個優化還是非常大的。在實時流topn中我們也可以用最小堆做效能優化,topo圖如下。

在spout方法資料的時候做fieldsgrouping,然後step1中的每個bolt就會維護一部分資料的topn最小堆,緩衝一段時間後把minheap裡的資料全量發給finaltopn,finaltopn拿到資料後和自己的minheap已合併就可以拿到正真的topn了。

最終實現

要實現實時熱點功能,其實講上面兩個 word count和topn的topo合併起來後就好了,最終的topo如下。

spout收到訊息後隨機shuffle,step1中的bolt講一部分統計結果寫入cache,待cache失效的時候按key fieldsgrouping到step2,這樣可以減少對發出的訊息量。 step2中的bolt不僅有個cache還有個minheap,cache中存的是每個key的wordcount,minheap其實是維護的改bolt拿到部分資料的topn。step2中cache資料會失效,失效的時候需要資料更新到hbase中,同時也更新minheap。step2中的minheap超時後,全量資料丟到finaltopn中,再由finaltopn彙總。

在最後一步finaltopn中,同乙個key可能由step2多次傳下來,所以finaltopn更新其minheap的時候不能只是簡單的和根節點做對比,heap中有的話要更新其值。

其它問題

1. 各過程中cache和minheap的失效機制什麼設?

cache失效機制我有遇到過相關的例子,一般是資料量或是cache大小觸發的,其實這個是做成引數配置的,在不同的業務環境下可能有不同的適合配置。minheap只能以超時時間為觸發條件,超時事件設多少得看具體情況了。感覺都是超參,需要調。

2. 如何保證資料不丟?

storm的acker機制就可以保證資料at least once,就是保證資料不丟,但不保證資料不重複,如果真的需要exactly once,還是放棄jstorm吧,可以用flink試試。但我覺得其實在這種非資料強一致性的情況下,ack機制都不需要開,比較storm的ack還是要消耗一定效能的(有看過別人的資料,開啟acker要消耗10%以上效能,參考下)。 在我上圖topo設計下,如果集群中有一台機器宕了,cache裡的資料就全丟了,其實可能損失也不小,但是機器宕機畢竟還是個小概率事件。

3. 最終資料如何盡可能準確?

對乙個時間視窗的維護時間越長,越可能拿到全量資料,結果就越準確。這個肯定的最後那個finaltopn的bolt來做了,資料量越大,finaltopnbolt 的挑戰也就越大,我覺得可以起多個bolt,按時間視窗grouping,然後還得對minheap所有資料做持久化,還得支援持久化後的更新,可以對minheap序列化後放到hbase裡。

socket實現簡單的實時通訊功能

伺服器端 import socket print 我是服務端!host port 50007 s socket.socket socket.af inet,socket.sock stream 建立tcp socket物件 s.bind host,port 繫結位址 s.listen 1 監聽tcp...

PHP JS實現的實時搜尋提示功能

效果圖如下 如下 html 該 用兩種方法實現,一種jquery,一種原生js php 如下 php不僅可以考慮直接使用陣列,也可以xgdori考慮直接查詢資料庫,獲取資料庫內容,本 使用的是陣列。shandong anhui shanxi guangzhou yunnan hainan xizan...

實力打造實時大資料的平台

物聯網火熱到什麼程度?實時大資料又是乙個什麼概念?筆者想用乙個調查機構的話來回答 據估計,接入物聯網中的裝置在2020年將達到260億,假設這些感測器中有1 1000的感測器每秒傳回乙個狀態,則每秒同時要處理的實時資料將達0.26億。geoevent server登場 實時資料的連續接入 處理和輸出...