背景
非實(shí)時(shí)計(jì)算幾乎都基于MapReduce計(jì)算框架,但MapReduce并不是萬能的。對(duì)于搜索應(yīng)用環(huán)境中的某些現(xiàn)實(shí)問題,MapReduce并不能很好地解決問題。
商用搜索引擎,像Google、Bing和Yahoo!等,通常在用戶查詢響應(yīng)中提供結(jié)構(gòu)化的Web結(jié)果,同時(shí)也插入基于流量的點(diǎn)擊付費(fèi)模式的文本廣告。為了在頁面上最佳位置展現(xiàn)最相關(guān)的廣告,通過一些算法來動(dòng)態(tài)估算給定上下文中一個(gè)廣告被點(diǎn)擊的可能性。上下文可能包括用戶偏好、地理位置、歷史查詢、歷史點(diǎn)擊等信息。一個(gè)主搜索引擎可能每秒鐘處理成千上萬次查詢,每個(gè)頁面都可能會(huì)包含多個(gè)廣告。為了及時(shí)處理用戶反饋,需要一個(gè)低延遲、可擴(kuò)展、高可靠的處理引擎。然而,對(duì)于這些實(shí)時(shí)性要求很高的應(yīng)用,盡管MapReduce作了實(shí)時(shí)性改進(jìn),但仍很難穩(wěn)定地滿足應(yīng)用需求。因?yàn)镠adoop為批處理作了高度優(yōu)化,MapReduce系統(tǒng)典型地通過調(diào)度批量任務(wù)來操作靜態(tài)數(shù)據(jù);而流式計(jì)算的典型范式之一是不確定數(shù)據(jù)速率的事件流流入系統(tǒng),系統(tǒng)處理能力必須與事件流量匹配,或者通過近似算法等方法優(yōu)雅降級(jí),通常稱為負(fù)載分流(load-shedding)。當(dāng)然,除了負(fù)載分流,流式計(jì)算的容錯(cuò)處理等機(jī)制也和批處理計(jì)算不盡相同。
最近Facebook在Sigmod 11上發(fā)表了利用HBase/Hadoop進(jìn)行實(shí)時(shí)數(shù)據(jù)處理的論文,通過一些實(shí)時(shí)性改造,讓批處理計(jì)算平臺(tái)也具備實(shí)時(shí)計(jì)算的能力。這類基于MapReduce進(jìn)行流式處理的方案有三個(gè)主要缺點(diǎn)。
將輸入數(shù)據(jù)分隔成固定大小的片段,再由MapReduce平臺(tái)處理,缺點(diǎn)在于處理延遲與數(shù)據(jù)片段的長度、初始化處理任務(wù)的開銷成正比。小的分段會(huì)降低延遲,增加附加開銷,并且分段之間的依賴管理更加復(fù)雜(例如一個(gè)分段可能會(huì)需要前一個(gè)分段的信息);反之,大的分段會(huì)增加延遲。最優(yōu)的分段大小取決于具體應(yīng)用。
為了支持流式處理,MapReduce需要被改造成Pipeline的模式,而不是Reduce直接輸出;考慮到效率,中間結(jié)果最好只保存在內(nèi)存中等。這些改動(dòng)使得原有的MapReduce框架的復(fù)雜度大大增加,不利于系統(tǒng)的維護(hù)和擴(kuò)展。
用戶被迫使用MapReduce的接口來定義流式作業(yè),這使得用戶程序的可伸縮性降低。
綜上所述,流式處理的模式?jīng)Q定了要和批處理使用非常不同的架構(gòu),試圖搭建一個(gè)既適合流式計(jì)算又適合批處理計(jì)算的通用平臺(tái),結(jié)果可能會(huì)是一個(gè)高度復(fù)雜的系統(tǒng),并且最終系統(tǒng)可能對(duì)兩種計(jì)算都不理想。
目前流式計(jì)算是業(yè)界研究的一個(gè)熱點(diǎn),最近Twitter、LinkedIn等公司相繼開源了流式計(jì)算系統(tǒng)Storm、Kafka等,加上Yahoo!之前開源的S4,流式計(jì)算研究在互聯(lián)網(wǎng)領(lǐng)域持續(xù)升溫。不過流式計(jì)算并非最近幾年才開始研究,傳統(tǒng)行業(yè)像金融領(lǐng)域等很早就已經(jīng)在使用流式計(jì)算系統(tǒng),比較知名的有StreamBase、Borealis等。
本文簡單介紹幾種業(yè)界使用的流式計(jì)算系統(tǒng),希望流式系統(tǒng)的設(shè)計(jì)者或開發(fā)者們能從中獲得啟示。

圖1 數(shù)據(jù)分析系統(tǒng)整體組成示意圖
圖1從整個(gè)分析系統(tǒng)的架構(gòu)角度,給出了實(shí)時(shí)計(jì)算子系統(tǒng)所處的位置。實(shí)時(shí)計(jì)算系統(tǒng)和批處理計(jì)算系統(tǒng)同屬于計(jì)算這個(gè)大的范疇,批處理計(jì)算可以是MapReduce、MPI、SCOPE等,實(shí)時(shí)計(jì)算可以是S4、Storm等,批處理和實(shí)時(shí)都可以或不依賴統(tǒng)一的資源調(diào)度系統(tǒng)。另外,計(jì)算系統(tǒng)的輸入、輸出,包括中間過程的輸入、輸出,都與存儲(chǔ)系統(tǒng)交互,可以是塊存儲(chǔ)系統(tǒng)HDFS,也可以是K-V存儲(chǔ)系統(tǒng)Hypertable等。計(jì)算層的上層是數(shù)據(jù)倉庫,或者直接和用戶交互,交互方式可以是SQL-like或者M(jìn)R-like等。
系統(tǒng)
S4
S4是一個(gè)通用的、分布式的、可擴(kuò)展的、分區(qū)容錯(cuò)的、可插拔的流式系統(tǒng)?;赟4框架,開發(fā)者可以輕松開發(fā)面向持續(xù)流數(shù)據(jù)處理的應(yīng)用。
S4的設(shè)計(jì)特點(diǎn)有以下幾個(gè)方面。
Actor Model
為了能在普通機(jī)型構(gòu)成的集群上進(jìn)行分布式處理,并且集群內(nèi)部不使用共享內(nèi)存,S4架構(gòu)采用了Actor模式,這種模式提供了封裝和地址透明語義,因此在允許應(yīng)用大規(guī)模并發(fā)的同時(shí),也提供了簡單的編程接口。S4系統(tǒng)通過處理單元(Processing Elements,PEs)進(jìn)行計(jì)算,消息在處理單元間以數(shù)據(jù)事件的形式傳送,PE消費(fèi)事件,發(fā)出一個(gè)或多個(gè)可能被其他PE處理的事件,或者直接發(fā)布結(jié)果。每個(gè)PE的狀態(tài)對(duì)于其他PE不可見,PE之間唯一的交互模式就是發(fā)出事件和消費(fèi)事件??蚣芴峁┝寺酚墒录胶线m的PE和創(chuàng)建新PE實(shí)例的功能。S4的設(shè)計(jì)模式符合封裝和地址透明的特性。
Decentralized and Symmetric Architecture
除了遵循Actor模式,S4也參照了MapReduce模式。為了簡化部署和運(yùn)維,從而達(dá)到更好地穩(wěn)定性和擴(kuò)展性,S4采用了對(duì)等架構(gòu),集群中的所有處理節(jié)點(diǎn)都是等同的,沒有中心控制。這種架構(gòu)將使得集群的擴(kuò)展性很好,處理節(jié)點(diǎn)的總數(shù)理論上無上限;同時(shí),S4將沒有單點(diǎn)容錯(cuò)的問題。
Pluggable Architecture
S4系統(tǒng)使用Java開發(fā),采用了極富層次的模塊化編程,每個(gè)通用功能點(diǎn)都盡量抽象出來作為通用模塊,而且盡可能讓各模塊實(shí)現(xiàn)可定制化。
Partial Fault-Tolerance
基于Zookeeper服務(wù)的集群管理層將會(huì)自動(dòng)路由事件從失效節(jié)點(diǎn)到其他節(jié)點(diǎn)。除非顯式保存到持久性存儲(chǔ),否則節(jié)點(diǎn)故障時(shí),節(jié)點(diǎn)上處理事件的狀態(tài)會(huì)丟失。
Object Oriented
節(jié)點(diǎn)間通信采用“Plain Old Java Objects”(POJOs)模式,應(yīng)用開發(fā)者不需要寫Schemas 或用哈希表來在節(jié)點(diǎn)間發(fā)送Tuples。
S4的功能組件分3大類,Clients、Adapters和PNode Cluster,圖2顯示了S4系統(tǒng)框架。

圖2 Yahoo! S4流式系統(tǒng)框架結(jié)構(gòu)圖
S4提供Client Adapter,允許第三方客戶端向S4集群發(fā)送事件和接收事件。Adapter實(shí)現(xiàn)了基于JSON的API,支持多語言實(shí)現(xiàn)的客戶端驅(qū)動(dòng)。
Client通過Driver組件與Adapter進(jìn)行交互,Adapter也是一個(gè)Cluster,其中有多個(gè)Adapter結(jié)點(diǎn),Client可以通過多個(gè)Driver與多個(gè)Adapter進(jìn)行通信,這樣可以保證單個(gè)Client在分發(fā)大數(shù)據(jù)量時(shí)Adapter不會(huì)成為瓶頸,也可以確保系統(tǒng)支持多個(gè)Client應(yīng)用并發(fā)執(zhí)行的快速、高效和可靠性。