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