1. 為什么要流式計(jì)算
- 業(yè)務(wù)需求:業(yè)務(wù)需要更及時(shí)計(jì)算結(jié)果,而流數(shù)據(jù)處理可以獲得更低的延時(shí)
- 數(shù)據(jù)特點(diǎn):海量的無邊界數(shù)據(jù)在現(xiàn)代企業(yè)中越來越普遍,而流數(shù)據(jù)處理系統(tǒng)就是為此而生的
- 硬件資源:流數(shù)據(jù)處理可以在時(shí)間維度上進(jìn)行負(fù)載均衡,同時(shí)也使得資源消耗更具有一致性和可預(yù)測(cè)性
2. 什么是流式計(jì)算
- 誤解:近似或推到計(jì)算、低延遲。
- 設(shè)計(jì)良好的流式系統(tǒng)具備的能力:正確性、一致性、可重復(fù)結(jié)果。
3. 術(shù)語
- Streaming System
一種處理無界數(shù)據(jù)的計(jì)算引擎 - 數(shù)據(jù)集的定義形態(tài):Cardinality(基數(shù))和Constitution(組成)
a. 基數(shù) - 有界數(shù)據(jù)
一種大小確定的數(shù)據(jù)集 - 無界數(shù)據(jù)
一種大小是不確定的數(shù)據(jù)集(至少理論上是無限的)
b. 組成 - Table(表)
數(shù)據(jù)集在某個(gè)特定時(shí)間點(diǎn)的整體視圖。SQL一般就是用于處理表。 - Stream(流)
指在隨時(shí)間演變的數(shù)據(jù)集的一個(gè)接著一個(gè)的元素視圖。
4. 被夸大的Streaming限制
- Lambda架構(gòu),本文觀點(diǎn)就是你執(zhí)行一個(gè)流式系統(tǒng)的同事還有一個(gè)批處理系統(tǒng),兩者都使用一樣的計(jì)算方式。其中流式系統(tǒng)提供了低延遲、非準(zhǔn)確的結(jié)果(可能是因?yàn)槭褂昧私朴?jì)算,或者流式系統(tǒng)本身就不提供正確性),然后一段時(shí)間后批處理系統(tǒng)逐步的提供準(zhǔn)確的輸出。維護(hù)一個(gè)Lambda架構(gòu)非常復(fù)雜。你需要構(gòu)建、規(guī)定以及維護(hù)兩個(gè)獨(dú)立版本的數(shù)據(jù)管道并且知道怎么最終合并兩個(gè)數(shù)據(jù)管道的結(jié)果。
- 一個(gè)設(shè)計(jì)良好的流式系統(tǒng)實(shí)際上在功能上是批處理的一個(gè)超集。例如并且Apache Flink認(rèn)真吸取了這一想法并且構(gòu)建了一個(gè)即使在“批處理”模式下也是完全流式的系統(tǒng)。
- 批處理和流式處理的效率差異:批處理的高延遲、高效率,得益于增加了打包以及更有效的shuffle傳輸。流式處理低延遲、低吞吐。將處理無界數(shù)據(jù)納入到批系統(tǒng)設(shè)計(jì)中。Google Dataflow(Beam)模型提供了在相同的統(tǒng)一模型下的批處理和流式處理兩種運(yùn)行方式,將兩者好的地方予以保留而又不失選擇適當(dāng)效率級(jí)別的靈活性。
- 替換掉批處理所需要的兩件事情
a. Correctness(正確性)
具備這點(diǎn)可持平批處理。核心在于,正確性問題可以歸結(jié)為一致性的存儲(chǔ)。流式系統(tǒng)需要一種能將持久化狀態(tài)的快照化的方法。強(qiáng)一致性是有且只有一次正確處理的必備條件,同時(shí)強(qiáng)一致也是對(duì)于任一系統(tǒng)來說能與批處理系統(tǒng)齊平或者超越批處理的必要條件。
b. Tools for reasoning about time(時(shí)間推理工具)
具備這點(diǎn)可超過批處理。針對(duì)無界無序數(shù)據(jù)的可變事件時(shí)間數(shù)據(jù),批系統(tǒng)和流式系統(tǒng)中對(duì)于處理有界和無界數(shù)據(jù)的共通方法,
5. 事件時(shí)間VS處理時(shí)間:事件時(shí)間和處理時(shí)間關(guān)系的兩個(gè)特點(diǎn)。
處理時(shí)滯:也就是處理時(shí)間一定比事件事件晚
事件時(shí)間偏差:處理時(shí)間-事件時(shí)間的時(shí)間差,并不固定。
事件時(shí)間與處理時(shí)間
6. 數(shù)據(jù)處理模式
-
有界數(shù)據(jù)
image.png - 無界數(shù)據(jù):批
傳統(tǒng)的批處理引擎,通過切片的方式,將無界數(shù)據(jù)流,切分成一個(gè)個(gè)有界數(shù)據(jù)集,再進(jìn)行計(jì)算。
固定窗口(FIXED)
固定窗口(FIXED)
必須有機(jī)制能夠使這些遲到的數(shù)據(jù)重新計(jì)算,才能保證結(jié)果的正確性。
會(huì)話(SESSION)
會(huì)話
在批處理中,每個(gè)窗口的數(shù)據(jù),可能分布在兩個(gè)小批中。如下圖紅色區(qū)域所示??梢酝ㄟ^增大每批數(shù)據(jù)條數(shù),來減少被階段的會(huì)話窗口,但是會(huì)增加延時(shí)。當(dāng)然也可以在分批的時(shí)候,把同一會(huì)話窗口的數(shù)據(jù)都分在一批,但這會(huì)大大增加系統(tǒng)設(shè)計(jì)的復(fù)雜度。
- 無界數(shù)據(jù):流
真實(shí)數(shù)據(jù)有兩個(gè)特點(diǎn):高度無序性、處理時(shí)間和事件時(shí)間偏差不定。
可分為4類方法處理處理:時(shí)間無關(guān)、近似計(jì)算、處理時(shí)間窗口、事件時(shí)間窗口
a. 時(shí)間無關(guān): 例如Filter、Inner Joins
過濾(Filter)
過濾(Filter)
內(nèi)關(guān)聯(lián)(Inner Joins)
內(nèi)關(guān)聯(lián)(Inner Joins)
當(dāng)兩條流做內(nèi)關(guān)聯(lián)時(shí),需要把兩條流的數(shù)據(jù)都持久化到狀態(tài)中。當(dāng)兩邊的數(shù)據(jù)join上時(shí),就輸出。當(dāng)然這種方式要考慮數(shù)據(jù)buffer大小的問題,一般都會(huì)按時(shí)間來配數(shù)據(jù)過期策略。所以會(huì)存在數(shù)據(jù)完整性問題。
b. 近似算法
比如近似TopN算法流式、K-means算法]。通過近似算法對(duì)無界數(shù)據(jù)進(jìn)行計(jì)算,性能很好,但是可擴(kuò)展性差,因?yàn)樗惴ǘ继珡?fù)雜了。這些算法中通常都基于處理時(shí)間,所以無法應(yīng)對(duì)基于事件時(shí)間處理的需求?;谶@個(gè)原因,其實(shí)近似算法是另一種形式的時(shí)間無關(guān)型操作。

窗口
其余兩種流計(jì)算中常用的處理無界數(shù)據(jù)的方式,都是窗口的變體。簡(jiǎn)單來說,窗口是獲得(有界或無界)數(shù)據(jù)源的概念,窗口將數(shù)據(jù)源沿著時(shí)間邊界,切分成有界的數(shù)據(jù)塊,然后對(duì)各個(gè)數(shù)據(jù)塊進(jìn)行處理。下圖表示了三種窗口類型:

- 固定窗口(Fixed Window)又稱為滾窗(Tumbling Window)
固定窗口在時(shí)間維度上,按照固定長(zhǎng)度將無界數(shù)據(jù)流切片,是一種對(duì)齊窗口。 - 滑動(dòng)窗口(Sliding Window)又稱為Hop Window,是固定窗口的推廣。由窗口長(zhǎng)度和窗口間隔兩個(gè)參數(shù)確定。如果窗口長(zhǎng)度小于窗口間隔,那么兩個(gè)窗口會(huì)重合,如上圖中Sliding Window所示。如果窗口長(zhǎng)度等于窗口間隔,那么就是固定窗口。如果窗口長(zhǎng)度小雨窗口間隔,那么就會(huì)是一個(gè)比較奇怪的采樣窗口,也就是僅對(duì)數(shù)據(jù)集的某些數(shù)據(jù)做窗口。
- 會(huì)話窗口(Session):是一種動(dòng)態(tài)窗口。會(huì)話窗口由一系列事件序列組成,兩個(gè)會(huì)話窗口之間由沒有任何事件的一段時(shí)間間隔。比如,某個(gè)用戶1分鐘內(nèi)連續(xù)來了多次用戶點(diǎn)擊事件,等了3分鐘,又來了幾個(gè)連續(xù)的點(diǎn)擊事件,則每次連續(xù)的點(diǎn)擊事件,都是一個(gè)會(huì)話窗口。兩個(gè)會(huì)話窗口的間隔是3分鐘。會(huì)話窗口通常通過將一系列臨時(shí)相關(guān)的事件聚合,來分析用戶行為。每個(gè)會(huì)話窗口的大小都是不固定的,窗口間的間隔也是不固定的。是一種非常典型的非對(duì)齊窗口。
c. 處理時(shí)間窗口

- 使用和理解都非常簡(jiǎn)單。
- 能直觀判斷窗口是否結(jié)束。
d. 事件時(shí)間窗口


- 只有基于事件時(shí)間進(jìn)行計(jì)算,才能保證數(shù)據(jù)的正確性。
- 需要做數(shù)據(jù)shuffle將其放入正確的窗口中。
- 有力的語義少有不需付出代價(jià)的,事件時(shí)間窗口也不例外。事件時(shí)間窗口有兩個(gè)顯著的弱點(diǎn)。
* 緩存:事件時(shí)間窗口需要存儲(chǔ)更長(zhǎng)時(shí)間內(nèi)的數(shù)據(jù)。幸運(yùn)的是存儲(chǔ)很便宜,將持久化狀態(tài)存入存儲(chǔ)中,另外類似求和、求平均這樣的聚合操作可以進(jìn)行增量計(jì)算,不需要存儲(chǔ)所有的數(shù)據(jù)
* 完整性:基于事件時(shí)間的窗口,我們也不能判斷什么時(shí)候窗口的數(shù)據(jù)都到齊了。很多系統(tǒng)使用Watermark來推斷相對(duì)精確的窗口結(jié)束時(shí)間。但是這種方式并不能得到完全正確的結(jié)果。因此,解決這個(gè)問題的更好的方式,應(yīng)該是讓用戶能定義何時(shí)輸出窗口結(jié)果,并且定義當(dāng)遲到數(shù)據(jù)到來時(shí),如何更新之前窗口計(jì)算的結(jié)果。
7. 總結(jié)
本文主要討論了幾個(gè)問題:
- 澄清了一些術(shù)語的定義,專注于‘流’的定義,而不是已有流計(jì)算系統(tǒng)的實(shí)現(xiàn)
- 研究了目前批/流系統(tǒng)的能力,強(qiáng)調(diào),在功能上,流是批的超集。
- 提出了如果流系統(tǒng)在功能上要超越批系統(tǒng),需要具備的兩個(gè)能力,分別是:正確性和在各時(shí)間域處理數(shù)據(jù)的能力。
- 強(qiáng)調(diào)了事件時(shí)間和處理時(shí)間的巨大區(qū)別。提出了基于這兩個(gè)時(shí)間處理數(shù)據(jù)的難點(diǎn)。
- 調(diào)查了主流數(shù)據(jù)處理系統(tǒng)處理有界和無界數(shù)據(jù)的方式。將無界數(shù)據(jù)處理分為四類:時(shí)間無關(guān),近似估計(jì),基于處理時(shí)間的窗口和基于事件時(shí)間的窗口





