storm介紹,核心組件,編程模型

1、流式計算概念編程

  利用分佈式的思想和方法,對海量「流」式數據進行實時處理,源自業務對海量數據,在「時效」的價值上的挖掘訴求,隨着大數據場景應用場景的增加,對流式計算的需求愈發增多,流式計算的通常架構圖以下:架構

  

  Flume獲取數據-->Kafka傳遞數據-->Strom計算數據-->Redis保存數據框架

2、storm介紹分佈式

  Apache Storm是一個分佈式實時大數據處理系統。Storm設計用於在容錯和水平可擴展方法中處理大量數據。它是一個流數據框架,具備最高的攝取率。Storm是無狀態的,它經過Apache ZooKeeper管理分佈式環境和集羣狀態。它很簡單,您能夠並行地對實時數據執行各類操做,成爲實時數據分析的領導者。oop

  通俗的說,Storm用來實時處理數據,特色:低延遲、高可用、分佈式、可擴展、數據不丟失。提供簡單容易理解的接口,便於開發。大數據

3、storm應用場景和典型案例搜索引擎

  應用場景:spa

  (1)監控日誌分析:從海量日誌中分析出特定的數據,並將分析的結果用來輔佐決策,或存入外部存儲器。線程

  (2)用戶行爲:實時分析用戶的行爲日誌,將最新的用戶屬性反饋給搜索引擎,可以爲用戶展示最貼近其當前需求的結果。設計

  (3)用戶畫像:收集,維護用戶興趣,並在此基礎上向對應受衆的用戶投放不一樣的數據和信息。

  典型案例:

  (1)廣告投放:爲了更加精準投放廣告,後臺計算引擎須要維護每一個用戶的興趣點(理想狀態是,你對什麼感興趣,就向你投放哪類廣告)。用戶興趣主要基於用戶的歷史行爲、用戶的實時查詢、用戶的實時點擊、用戶的地理信息而得,其中實時查詢、實時點擊等用戶行爲都是實時數據。考慮到系統的實時性,許多廠商使用Storm維護用戶興趣數據,並在此基礎上進行受衆定向的廣告投放

  (2)淘寶:實時分析用戶行爲,將用戶搜索的寶貝反饋給搜索引擎,經過實時數據分析,爲用戶展示最貼近其當前需求的結果,或是賣家在後臺看到本身的店鋪有巨大的用戶訪問量,但實際買單卻不多,則能夠藉助此數據分析進行必定的打折促銷活動。

  (3)大型系統監控:收集和分析系統運行過程當中的各指標和產生的日誌,進行實時分析處理,並做出下一步的決策或告警。

4、storm核心組件

  (1)Nimbus:負責資源分配和任務調度。

  (2)Supervisor:負責接受nimbus分配的任務,啓動和中止屬於本身管理的worker進程。---經過配置文件設置當前supervisor上啓動多少個worker。
  (3)Worker:運行具體處理組件邏輯的進程。Worker運行的任務類型只有兩種,一種是Spout任務,一種是Bolt任務。
  (4)Task:worker中每個spout/bolt的線程稱爲一個task. 在storm0.8以後,task再也不與物理線程對應,不一樣spout/bolt的task可能會共享一個物理線程,該線程稱爲executor。

   

5、storm編程模型及Stream Grouping

   下面講述storm的編程模型,同時也是worker的工做流程

  Topology:Storm中運行的一個實時應用程序的名稱。

  Spout:在一個topology中獲取源數據流的組件。一般狀況下spout會從外部數據源中讀取數據,而後轉換爲topology內部的源數據。
  Bolt:接受數據而後執行處理的組件,用戶能夠在其中執行本身想要的操做。
  Tuple:一次消息傳遞的基本單元,理解爲一組消息就是一個Tuple,一個Tuple單元會包含一個list對象。
  Stream:表示數據的流向。

  

  能夠注意到,一個spout能夠向內部的bolt發送數據,也能夠向外部的bolt發送,這裏即產生一個數據流向的策略問題,Storm裏面有7種類型的stream流向策略Stream Grouping

  (1)Shuffle Grouping: 隨機分組, 隨機派發stream裏面的tuple,保證每一個bolt接收到的tuple數目大體相同。
  (2)Fields Grouping:按字段分組,好比按userid來分組,具備一樣userid的tuple會被分到相同的Bolts裏的一個task,而不一樣的userid則會被分配到不一樣的bolts裏的task。
  (3)All Grouping:廣播發送,對於每個tuple,全部的bolts都會收到。
  (4)Global Grouping:全局分組, 這個tuple被分配到storm中的一個bolt的其中一個task。再具體一點就是分配給id值最低的那個task。
  (5)Non Grouping:不分組,這stream grouping個分組的意思是說stream不關心到底誰會收到它的tuple。目前這種分組和Shuffle grouping是同樣的效果, 有一點不一樣的是storm會把這個bolt放到這個bolt的訂閱者同一個線程裏面去執行。
  (6)Direct Grouping: 直接分組, 這是一種比較特別的分組方法,用這種分組意味着消息的發送者指定由消息接收者的哪一個task處理這個消息。只有被聲明爲Direct Stream的消息流能夠聲明這種分組方法。並且這種消息tuple必須使用emitDirect方法來發射。消息處理者能夠經過TopologyContext來獲取處理它的消息的task的id(OutputCollector.emit方法也會返回task的id)。
  (7)Local or shuffle grouping:若是目標bolt有一個或者多個task在同一個工做進程中,tuple將會被隨機發生給這些tasks。不然,和普通的Shuffle Grouping行爲一致。

6、storm和Hadoop的核心組件對比

  

相關文章
相關標籤/搜索