Storm常見模式2——TOP N介紹
導讀問題:
1.TOP N計算的應用場景有哪些?
2.TOP N的實現方法和原理是什麼?
(1)首先,TestWordSpout()是Topology的資料來源Spout,持續隨機生成單詞發出去,產生資料流“word”,輸出Fields是“word”,核心程式碼如下:
(2)接下來,“word”流入RollingCountObjects這個Bolt中進行word count計算,為了保證同一個word的資料被髮送到同一個Bolt中進行處理,按照“word”欄位進行field grouping;在RollingCountObjects中會計算各個word的出現次數,然後產生“count”流,輸出“obj”和“count”兩個Field,核心程式碼如下:
(3)然後,RankObjects這個Bolt按照“count”流的“obj”欄位進行field grouping;在Bolt內維護TOP N個有序的單詞,如果超過TOP N個單詞,則將排在最後的單詞踢掉,同時每個一定時間(2秒)產生“rank”流,輸出“list”欄位,輸出TOP N計算結果到下一級資料流“merge”流,核心程式碼如下:
(4)最後,MergeObjects這個Bolt按照“rank”流的進行全域性的grouping,即所有上一級Bolt產生的“rank”流都流到這個“merge”流進行;MergeObjects的計算邏輯和RankObjects類似,只是將各個RankObjects的Bolt合併後計算得到最終全域性的TOP N結果,核心程式碼如下:
1.TOP N計算的應用場景有哪些?
2.TOP N的實現方法和原理是什麼?
Storm的另一種常見模式是對流式資料進行所謂“streaming top N”的計算,它的特點是持續的在記憶體中按照某個統計指標(如出現次數)計算TOP N,然後每隔一定時間間隔輸出實時計算後的TOP N結果。
流式資料的TOP N計算的應用場景很多,例如計算twitter上最近一段時間內的熱門話題、熱門點選圖片等等。
下面結合Storm-Starter中的例子,介紹一種可以很容易進行擴充套件的實現方法:首先,在多臺機器上並行的執行多個Bolt,每個Bolt負責一部分資料的TOP N計算,然後再有一個全域性的Bolt來合併這些機器上計算出來的TOP N結果,合併後得到最終全域性的TOP N結果。
該部分示例程式碼的入口是RollingTopWords類,用於計算文件中出現次數最多的N個單詞。首先看一下這個Topology結構:
Topology構建的程式碼如下:
(1)首先,TestWordSpout()是Topology的資料來源Spout,持續隨機生成單詞發出去,產生資料流“word”,輸出Fields是“word”,核心程式碼如下:
(2)接下來,“word”流入RollingCountObjects這個Bolt中進行word count計算,為了保證同一個word的資料被髮送到同一個Bolt中進行處理,按照“word”欄位進行field grouping;在RollingCountObjects中會計算各個word的出現次數,然後產生“count”流,輸出“obj”和“count”兩個Field,核心程式碼如下:
(3)然後,RankObjects這個Bolt按照“count”流的“obj”欄位進行field grouping;在Bolt內維護TOP N個有序的單詞,如果超過TOP N個單詞,則將排在最後的單詞踢掉,同時每個一定時間(2秒)產生“rank”流,輸出“list”欄位,輸出TOP N計算結果到下一級資料流“merge”流,核心程式碼如下:
(4)最後,MergeObjects這個Bolt按照“rank”流的進行全域性的grouping,即所有上一級Bolt產生的“rank”流都流到這個“merge”流進行;MergeObjects的計算邏輯和RankObjects類似,只是將各個RankObjects的Bolt合併後計算得到最終全域性的TOP N結果,核心程式碼如下:
關於上述例子的幾點說明:
(1) 為什麼要有RankObjects和MergeObjects兩級的Bolt來計算呢?
其實,計算TOP N的一個最簡單的思路是直接使用一個Bolt(通過類似於RankObjects的類實現)來做全域性的求TOP N操作。
但是,這種方式的明顯缺點在於受限於單臺機器的處理能力。
(2) 如何保證計算結果的正確性?
首先通過field grouping將同一個word的計算放到同一個Bolt上處理;最後有一個全域性的global grouping彙總得到TOP N。
這樣可以做到最大可能並行性,同時也能保證計算結果的正確。
(3) 如果當前計算資源無法滿足計算TOP N,該怎麼辦?
這個問題本質上就是系統的可擴充套件性問題,基本的解決方法就是儘可能做到在多個機器上的平行計算過程,針對上面的Topology結構:
a) 可以通過增加每一級處理單元Bolt的數量,減少每個Bolt處理的資料規模;
b) 可以通過增加一級或多級Bolt處理單元,減少最終彙總處理的資料規模。
相關文章
- Storm常見模式1——BasicBoltORM模式
- Oracle常見等待事件介紹Oracle事件
- Mysql常見儲存引擎介紹MySql儲存引擎
- wireshark、異常資料分析、常見RST介紹
- meterpreter常見指令碼介紹指令碼
- 常見伺服器系統介紹伺服器
- 常見的代理IP型別介紹型別
- Jedis介紹及常見問題分析
- linux常見特殊符號介紹Linux符號
- 代理IP常見錯誤程式碼介紹
- Windows下常見Oracle服務介紹(zt)WindowsOracle
- 網路庫與Rxjava2結合常見使用場景介紹RxJava
- 高匿代理的介紹及常見問題
- 幾種常見網路抓包方式介紹
- 常見的四類HTTP狀態碼介紹HTTP
- iOS 常見的系統檔案目錄介紹iOS
- 常見資料結構及特點介紹資料結構
- Oracle常見SQL分頁實現方案介紹OracleSQL
- 常見dotNet加密保護工具分析介紹加密
- 常見原型設計工具介紹-00-overvuew原型Vue
- 簡單介紹常見的三種架構設計模式及其優缺點!架構設計模式
- 常見啟用函式的介紹和總結函式
- 介紹幾種MySQL常見的圖形化工具MySql
- 開源≠免費 常見開源協議介紹協議
- Python的常見模組:OS和 time模組介紹Python
- C#中Load等常見方法的介紹C#
- 1(5)led燈閃爍、常見ip核介紹
- 模式介紹模式
- Linux top命令介紹Linux
- Storm介紹&實際開發注意事項ORM
- 常見的PAM認證模組簡介(2)(zt)
- 常見的Web安全漏洞及測試方法介紹Web
- 常見的反爬蟲措施與應對方法介紹爬蟲
- 如何進行程式碼混淆?方法與常見工具介紹行程
- Linux /dev 常見特殊裝置介紹與應用Linuxdev
- Linux常見的開發命令有哪些?分類介紹!Linux
- Python的控制語句有哪些?常見內容介紹!Python
- Java命令學習系列(零)——常見命令及Java Dump介紹Java