storm
- storm 是個實時的,分佈式以及具備高容錯的計算框架
storm進程常駐內存
storm數據不經過磁盤,在內存中處理
官網
架構:
- Nimbus 主節點
- Supervisor 從節點
- Worker 從節點上工作進程
###編程模型:
- spout + bolt
- DAG·有向無環圖
對於Storm實時計算邏輯的封裝
即,由一系列通過數據流相互關聯的Spout、Bolt所組成的拓撲結構
生命週期:此拓撲只要啓動就會一直在集羣中運行,直到手動將其kill,否則不會終止
(區別於MapReduce當中的Job,MR當中的Job在計算執行完成就會終止)
tuple
stream中最小數據組成單元
stream 數據流
- 從 spout中源源不斷傳遞數據給 bolt, 以及上一個bolt傳遞數據給下一個bolt, 所以形成的這些數據通道即叫做stream
- stream 聲明時需要給其指定一個id,(默認是default)
- 實際開發中,多使用單一數據流,此時不需要單獨指定streamid
spout 數據源
- 拓撲中數據流的來源。一般會從指定外部的數據源讀取元組(Tuple)發送到拓撲(Topology)中
- 一個Spout可以發送多個數據流(Stream)
- 可先通過OutputFieldsDeclarer中的declare方法聲明定義的不同數據流,發送數據時通過SpoutOutputCollector中的emit方法指定數據流Id(streamId)參數將數據發送出去
- Spout中最核心的方法是nextTuple,該方法會被Storm線程不斷調用、主動從數據源拉取數據,再通過emit方法將數據生成元組(Tuple)發送給之後的Bolt計算
bolt 數據流處理組件
- 拓撲中數據處理均有Bolt完成。對於簡單的任務或者數據流轉換,單個Bolt可以簡單實現;更加複雜場景往往需要多個Bolt分多個步驟完成
- 一個Bolt可以發送多個數據流(Stream)
- 可先通過OutputFieldsDeclarer中的declare方法聲明定義的不同數據流,發送數據時通過SpoutOutputCollector中的emit方法指定數據流Id(streamId)參數將數據發送出去
- Bolt中最核心的方法是execute方法,該方法負責接收到一個元組(Tuple)數據、真正實現核心的業務邏輯
StreamGroup 數據流分組(即數據分發策略)
數據傳輸:
- zmq
- Netty
高可靠性
- 異常處理
- 消息可靠性保障機制ACK
可維護性
- StormUI圖形化監控接口
流式處理
流式處理(異步,同步)
異步服務
- 與客戶端提交數據進行結算,並不會等待數據計算結果
逐條處理
例如:ETL
統計分析
- 例:計算PV、UV、訪問熱點 以及 某些數據的聚合、加和、平均等
客戶端提交數據之後,計算完成結果存儲到Redis、HBase、MySQL或者其他MQ當中,
客戶端並不關心最終結果是多少。
實時請求
實時請求應答服務(同步)
- 客戶端提交數據請求之後,立即取得計算結果並返回給客戶端
Drpc
實時請求處理
storm 和 mapreduce
storm: 進程。線程常駐內存運行,數據不進入磁盤,數據通過網絡傳遞
mapreduce 爲 TB.pb級別數據設計的批處理計算框架
storm 和 spark Streaming
- storm: 純流式處理
- 專門爲流式處理設計
- 數據傳輸模式更爲簡單,很多地方也更高效
- 並不是不能做批處理。也可以做微批處理,來提高吞吐
- spark Streaming 微批處理
- 將rdd做的很小來用小的批處理來接近流失處理
- 基於內存和DAG可以把處理任務做的很快