Yahoo!S4分布式流處理引擎分析總結


  S4(Simple Scalable Streaming System)是一個分布式流處理引擎,開發者可以在這個引擎基礎上開發面向無界的,不間斷的流數據處理應用。

  什么是流數據處理應用?例如,為了個性化搜索廣告,系統需要實時處理來自幾百萬唯一用戶每秒成千上萬次的查詢,並即時分析用戶的會話特征來提高廣告相關性預測模型的准確度。流數據處理應用要求我們的系統可以接受大量的,不間斷的數據(稱為流式數據),並可以迅速做出數據處理,S4正是完成這樣一個需求。

  S4的設計思想

  S4將一個流抽象為由(K,A)形式的元素組成的序列,這里K和A分別是鍵和屬性。在這種抽象的基礎上S4設計了能夠消費和發出這些(K,A)元素的組件,也就是Process Element。Process Element在S4中是最小的數據處理單元,每個PE實例只消費事件類型,屬性key,屬性value都匹配的事件,並最終輸出結果或者輸出新的(K,A)元素。下面這張S4論文內的圖很好的詮釋了上面說的內容。

clip_image002

  圖中節點表示PE,有向邊表示一個(K,A)元素及其流向。流初始化為一個Key為null,事件類型為Quote的(K,A)元素,按照上文的說法,S4中需要定義一個能消費相應事件類型,屬性key,屬性value事件的PE,也就是圖中的PE1。當PE1完成處理后,它發出新的(K,A)元素,即圖中的事件類型為WordEvent,key為word=”x”,屬性為count=x的邊,最后經過多個PE處理和(K,A)事件轉換得到最終結果(這里不介紹上圖的處理過程,詳細看論文介紹)。

  實際上,我認為S4最核心的部分就是上面的設計,它將流的處理分為多個流事件,抽象為處理圖中的有向邊,並且每個流事件都用(K,A)的形式表示,這種表示方式使得事件間的轉換傳遞很方便,這是一種借鑒了MapReduce的(key,value)的設計。同時因為流被分為多個流事件,那么就需要對應多個處理單元,每個PE唯一處理一種事件,並且PE間獨立,這也大大降低了概念復雜性和系統復雜性。我們開發者要做的就是定制個性化的PE。

  PE間有事件傳遞的依賴性,很自然的,我們希望可以有一個PE集群,S4使用Processing Element Container的概念,將多個PE包含到同一個容器中,PEC接收源event,並最終發送結果event。PEC加上通信處理模塊就形成了PE的邏輯主機Processing Node。如下圖所示:

clip_image003

  PN負責監聽事件,在到達事件上執行操作(PE完成),然后通過通信層Communication Layer的協助分發事件,也可以發出輸出事件。

  S4通過一個hash函數,將事件路由到目標PN上,這個hash函數作用於事件的所有已知屬性值上(需要配置),所以一個事件可能被路由到多個PN上。然后PN中的事件監聽器會將到來的事件傳遞給PEC,PEC以適當的順序調用適當的PE(每個編鍵keyed的PE都會被映射到一個確定的PN上,即圖中的PE並不是物理存在一個PN相關,而是邏輯相關)。處理完成后,PN可能發出輸出事件,也可以向Communication Layer請求協助向指定邏輯節點發送消息。

最后是通信層的介紹,它提供了“集群管理”,“故障恢復到備用節點”,“邏輯節點到物理節點映射”的作用。同時通信層還使用一個插件式的架構來選擇網絡協議,使用zookeeper在S4集群節點之間做一致性協作!

S4的其他特點總結(摘自網絡)

S4

S4是一個通用的、分布式的、可擴展的、分區容錯的、可插拔的流式系統。基於S4框架,開發者可以輕松開發面向持續流數據處理的應用。

S4的設計特點有以下幾個方面。

  • Actor Model

為了能在普通機型構成的集群上進行分布式處理,並且集群內部不使用共享內存,S4架構采用了Actor模式,這種模式提供了封裝和地址透明語義,因此在允許應用大規模並發的同時,也提供了簡單的編程接口。S4系統通過處理單元(Processing Elements,PEs)進行計算,消息在處理單元間以數據事件的形式傳送,PE消費事件,發出一個或多個可能被其他PE處理的事件,或者直接發布結果。每個PE的狀態對於其他PE不可見,PE之間唯一的交互模式就是發出事件和消費事件。框架提供了路由事件到合適的PE和創建新PE實例的功能。S4的設計模式符合封裝和地址透明的特性。

  • Decentralized and Symmetric Architecture

除了遵循Actor模式,S4也參照了MapReduce模式。為了簡化部署和運維,從而達到更好地穩定性和擴展性,S4采用了對等架構,集群中的所有處理節點都是等同的,沒有中心控制。這種架構將使得集群的擴展性很好,處理節點的總數理論上無上限;同時,S4將沒有單點容錯的問題。

Pluggable Architecture

S4系統使用Java開發,采用了極富層次的模塊化編程,每個通用功能點都盡量抽象出來作為通用模塊,而且盡可能讓各模塊實現可定制化。

  • Partial Fault-Tolerance

基於Zookeeper服務的集群管理層將會自動路由事件從失效節點到其他節點。除非顯式保存到持久性存儲,否則節點故障時,節點上處理事件的狀態會丟失。

  • Object Oriented

節點間通信采用“Plain Old Java Objects”(POJOs)模式,應用開發者不需要寫Schemas 或用哈希表來在節點間發送Tuples。

S4的功能組件分3大類,Clients、Adapters和PNode Cluster,圖2顯示了S4系統框架。

clip_image005

圖2 Yahoo! S4流式系統框架結構圖

S4提供Client Adapter,允許第三方客戶端向S4集群發送事件和接收事件。Adapter實現了基於JSON的API,支持多語言實現的客戶端驅動。

Client通過Driver組件與Adapter進行交互,Adapter也是一個Cluster,其中有多個Adapter結點,Client可以通過多個Driver與多個Adapter進行通信,這樣可以保證單個Client在分發大數據量時Adapter不會成為瓶頸,也可以確保系統支持多個Client應用並發執行的快速、高效和可靠性。

在Adapter中,真正與Client交互的是其Stub組件,該組件實現了管理Client與Adapter之間通過TCP/IP協議進行通信的功能。GenericJsonClientStub這個類支持將事件在Client與Adapter之間以JSON的形式轉換,從而支持更多種類型的Client應用。不同的Client可以配置不同的Stub來與Adapter進行通信,用戶可以定義自己的Stub來實現自己想要的業務邏輯,這樣也使得Client的行為更加多樣性、個性化。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM