Storm實戰_構建大資料實時計算
Storm實戰 構建大資料實時計算
ZeroMQ
sudo yum install maven
1簡介
使用場景
- 實時分析
- 線上機器學習
- 持續計算
- 分散式RPC
- ETL
保證每個訊息都得到處理,速度快每個節點每秒百萬次訊息.
實體
- 工作程序:每臺機器上多個
- exector:每個程序多個
- 任務:每個exector多個任務
spot bolt
storm 0.7版本引入事物拓撲解決,嚴格要求每個事物僅處理一次.
- 多語言協議,每個tuple處理時需要進行JSON編解碼.吞吐量有影響
- ZeroMQ作為底層訊息對列,訊息快速處理.
ZeroMQ是一個為可伸縮的分散式或併發應用程式設計的高效能非同步訊息庫。但是與面向訊息的中介軟體不同,ZeroMQ的執行不需要專門的訊息代理(message broker)。該庫設計成常見的套接字風格的API。ZeroMQ是由iMatix公司和大量貢獻者組成的社群共同開發的。ZeroQ通過許多第三方軟體支援大部分流行的程式語言,從Java和Python到Erlang和Haskell。
- 支援動態增加節點,但是現有的任務不會自動負載均衡.
- 圖形化監控
中間狀態查詢與儲存
- 處理流的結果,無法直接取得.匯入MySQL或HBase中.
- 計算邏輯類的快照,便於錯誤恢復.
但是有些業務需要儲存中間狀態,利用MySQL實時儲存中間狀態.崩潰從最近狀態恢復.將資料來源儲存到HBase中,恢復後取出未處理的結果.利用HBase支援前後定位.
2Storm初體驗
節點型別
- 主控節點master
Nimbus的後臺程式,分發程式碼,分配任務,監控狀態. - 工作節點 worker
執行一個Supervisoer後臺程式,監聽Nimbus分配的任務.啟動或停止程序.
一個Topology由分佈在不同工作節點上的多個工作程序組成.
Nimbus和Supervisoer間協調通過zookeeper
Nimbus和Supervisoer是快速失敗和無狀態.結束後,要麼在zookeeper要麼在硬碟上,擁有不可思議的穩定性.
- 主控節點master
3構建Topology
- Topology
Topology不會結束,MR會結束.
Topology時Thrift(跨語言框架). - 流
一個訊息流就是一個沒有邊界的tuple抽象. sqout
- 方法
nextTuple()
發射一個tuple到topology中.nextTuple()
不能被阻塞,UI個exector呼叫所有訊息源的spout
方法. ack()
tuple成功處理fail()
tubples處理失敗.
只對可靠的spout呼叫ack和fail
- 方法
Bolts
所有的訊息處理邏輯.- 過濾
- 聚合
查詢資料庫
OutputFieldsDeclarer.declareStream()
定義stream.OutputCollector.emit()
選擇發射的Stream- execute處理tuple.
- OutputCollector發射tuple.為每個處理的tuple呼叫ack方法.通知storm該tuple處理完畢.
Stream Grouping
Stream Grouping 定義一個stream如何分配bolts上面的多個task.
7種類型的Stream Grouping
- shuffle 隨機,每個bolt數目大致相同
- fields 欄位分組
- all 廣播發送,每個tuple所有的bolts收到
- global 全域性分組,tupe分配到id值最低的task
- non 隨機,放到bolt的同一個exector執行.
- direct 直接,特備.指定接受者的task
local or shuffle bolt有1個或多個task在同一個程序中,隨機分.否則和shuffle grouping 行為一致.
可靠性
tasks
workers
一個topology有多個worker(程序)
- 每個worker是一個物理JVM
- 並行度300的topology 50個程序的話.每個程序處理6個tasks.均分.
4Topology並行度
一臺機器為多個topology執行多個程序.
一個程序屬於一個特定的topology
一個程序為topology啟動多個exector.
每個exector會為**特定**spout/bolt 執行一個或多個任務.
預設每個exector執行一個任務.
設定每個spout/bolt啟動幾個executor.預設啟動1個exector.
配置任務數,每個bolt/spout執行多少個任務.
- 動態增加或減少exector數或程序數.不需要重啟叢集或者topology
5訊息的可靠處理
確保spout發出的每個訊息都被完整處理.
tuple tree超時值預設30s.
讀取訊息,訊息設定為 “pending”狀態.只有得到客戶端的應答後,ack fail呼叫後才會從佇列中真正刪除.
錨定:指定的節點增加了一個新節點.
多重錨定 ???
P79-81
高效實現tupletree
- acker跟蹤DAG中每個訊息,可以設定並行度.通過引數設定,大量訊息時應提高並行度
- acker可以有多個.使用雜湊演算法,確定spout id 對於的acker.
- 20位元組跟蹤一棵樹.
6一致性任務
保證tuple只被處理一次.
一致性事物元件
- 簡單設計1:強順序流
簡單設計2”強順序batch流
使用CoordinateBolt7DRPC
8Trident