最近一直在研究S4,所以就想要寫點什麼,不過發現已經有人寫了,於是我就偷個懶,直接轉貼了:)
本文轉自:http://www.cofftech.com/thread-4429-1-1.html
------------------------------------------------
- s4的論文: S4: Distributed Stream Computing Platform
- s4的官網: http://s4.io/
- distributed(分佈式)
- scalable(擴展性)
- partially fault-toleran(部分容錯性)
- pluggable (可插拔)
- Yahoo發起,主要用於解決"cost-per-click“廣告,通過實時計算預測用戶對廣告的可能的點擊行爲。
- 不用hadoop的原因: hadoop主要解決batch處理,基於mapReduce對可控的數據的進行處理。而流計算是針對不可控的點擊事件,對實時性有嚴格要求。
- 業務允許部分容錯性。 (s4沒有嚴格的failover機制,運行節點突然crash時,會導致當前節點中的數據丟失。後續的請求會failover到其他的節點上)
容器概念(http://docs.s4.io/manual/overview.html)
- PE : Processing Elements (處理節點)
* emit one or more events which may be consumed by other PEs,
* publish results, possibly to an external data store or consumer. - Events : message (消息)
* arbitrary Java Objects
* passed between PEs. (send and receive) - PEC : processing element container (處理節點容器)
* invokes the appropriate PEs in the appropriate order - node : a Processing Endpoint (機器節點)
* a jvm instance
* contains a PEC - cluster: a group nodes (節點集羣)
說明:
- 一個cluster包含多個node
- 每個node包含一個PE Container
- 每個PE Container 包含多個PE
- 每個PE消費Events,生成新的Events並傳遞給下一個PE
總體結構圖:
- PE Container/PE
- EventListenter
- Dispatcher, EventEmitter
- Communcation
PE內部概念:(4個部分組成)
- its functionality as defined by a PE class and associated configuration,
- the named stream that it consumes,
- the keyed attribute in those events, and
- the value of the keyed attribute in events which it consumers
PE類關係圖:
說明:
- Persister : 每個PE對應一個Persister,s4中每個PE對應於一個key的value結果。每個value結構都將作爲PE的一個instance
- FrequenceType : 每個PE會定期進行flush output輸出,可選擇的策略(定時,數量閥值)
- Clock : 每個PE的時間控制單元,有幾種時間。(WallClock:基於系統時間處理 , EventClock:基於event事件時間控制)
重點理解一下: Keyless PE概念和PE Prototype
- PE在底層實現了會以多實例存在。存儲的key即爲其keyed對應的value值,內部有個lookupTable概念。
- 針對Keyless PE,其對應的存儲key即爲"*",所以每次通過lookupTable.get(value)返回的即爲同一個節點,單例化
- 針對prototype,其對應的存儲就爲其value,所以每次會根據當前keyed attribute確定返回的PE節點,基於這點可以實現PE節點數據的Join處理
EventListener/EventEmitter:
說明:
- 每個PE Container是一個EventProducer,使用CommLayerListener做爲其事件處理器,處理EventWrapper反序列化。
- 每個PE包含一個Dispatcher,Dispatcher裏包含了一個EventEmitter處理對應的EventWrapper對象的發送
- 底層實際通訊的類: SenderProcess/ListenerProcess
Dispatcher類關係圖:
說明:
- Partitioner, 每個dispatcher針對發送的目標cluster,會根據對應的key進行分區處理,路由到其中的node節點。(node節點的信息可以通過zookeeper進行動態管理)
考慮集羣node節點的管理(node的新增 or 修改)
說明:
-
ProcessMonitor 監控當前運行node節點的狀態,有static/dymaic兩種維護狀態
-
TaskManager 創建node節點,主要是設置lock文件,有static/dymaic兩種維護狀態
運行(PE狀態變化)
S4缺點:
S4產品還是一個半成品,整體代碼結構組織和風格上還是比較亂的,選擇使用時需謹慎。存在的一些問題:
-
failover (運行node節點出現crash,當前node上的PE數據將無法實施failover)
-
persist (目前支持方式過於簡單,需要考慮網絡持久化,類似於nfs,分佈式文件系統等,配合failover機制)
-
communication (只支持udp協議,數據傳輸可靠性上)
-
load balancer (根據系統負載進行智能LB,目前暫時未看到相關實現。系統運行分爲兩種模式static or dymaic模式, static不存在智能調節LB處理)
-
deploy (手工方式介入deploy,無法支持apps的zero deploy模式。系統分爲cluster/node兩概念,node對應於一計算節點實例,cluster爲一組處理相同業務的計算節點)