流式計算 視窗

2022-07-03 17:03:20 字數 2071 閱讀 4173

對於流式計算(streaming)而言,視窗是乙個永遠繞不開的話題,最常見的需求,比如計算某個字段最近一小時的累積量,計算某個字段一天的出現的次數等。本篇文章針對流式計算的視窗模型(window model)進行深入解析。需要注意的是,本篇文章內容沒有考慮容錯問題,也就是預設本地記憶體中的資料不會丟失。

下面直奔主題,如果想更全面的了解流式計算和視窗模型,參考google大神的兩篇部落格。

通常情況下,我們理解視窗最多的是基於時間視窗,比如每過5分級計算某個欄位的累積量,又或者是基於事件的視窗。而我認為,視窗應該是乙個更廣義的模型。

在流式計算中,資料是沒有邊界的,源源不斷的資料從輸入流向輸出,但是計算是需要邊界的,無論是增量計算還是全量計算,都需要乙個範圍。那麼,把無限的資料流劃分成一段一段的資料集,這個計算模型可以稱為視窗模型。

基本的視窗模型,會根據時間來劃分出乙個乙個有範圍的視窗,在此基礎上對一批資料集進行計算。那麼問題來了,劃分視窗的時間從哪來呢。一般情況下,有兩種必定出現的時間,資料的發生時間(event time)和資料處理的時間(process time)。

這兩個時間怎麼選擇呢,先來看乙個例子,比如網頁中乙個事件的觸發從而向後台提交了一條資料,後台把資料發到了kafka,另一端有乙個kafka的消費者把資料取出來進行計算,那麼資料發生時間就是該網頁事件觸發的時間,而資料處理時間則為最終計算這條資料的時刻。理想情況下,這兩個時間是成正比關係的,也就是資料發生的越晚,那麼資料處理的越晚,但現實總是殘酷的,由於網路波動,硬體裝置故障等原因,資料總是會不按順序的被處理,參考圖1(**於引用)。

圖1在這個背景下,對時間的選擇顯得更加複雜。一般而言用的是資料產生的時間,更貼近業務的需求,所見即所得麼,否則採用資料處理的時間會導致結果不穩定。

時間選擇問題暫時解決了,那麼資料不是連續的情況下,怎麼劃分出視窗,比如你想象中每過1分鐘輸出乙個視窗,然而資料在59秒之後再也沒有被接受直到幾分鐘之後。這顯然是不滿足需求的,所以,引入了watermark這個概念,個人認為翻譯為水位線比水印更好理解,水印這概念太抽象了。

watermark用於判定是否到達視窗的閾值,也就是產生乙個視窗,watermark會不斷自我更新(說白了就是有個守護執行緒保證watermark不因為沒有資料而不增長)。當watermark到達視窗的閾值,那麼小於watermark的資料會進入到該視窗。而watermark也分為基於資料產生時間或者資料處理時間得到。

基於資料產生時間,那麼會導致視窗的觸發時間比理想慢很多,也就延遲大,因為資料是亂序進入的,需要等待直到資料的產生時間到達視窗閾值。

基於資料處理時間,那麼會導致視窗內的資料缺失,理由有上面的差不多。

所以這就又引申出了另乙個問題,這個問題可以通過觸發器(trigger)解決。所謂觸發器,其實就是根據不同的場景需求,給出最適合的視窗觸發要求,比如基於watermark的觸發器,基於事件的觸發器,基於會話的觸發器,更多參考streaming 102。觸發器又是另乙個層面的東西了,和實際業務有關,就不再贅述。

視窗的劃分問題解決了,那麼資料的生命週期是不是也得再思考一下?資料從輸入到輸出,可能會經歷乙個或者多個視窗,也可能由於延遲錯過所有的視窗,這就需要定義乙個清晰的範圍來完整的給出資料的生命週期。這引入了乙個新的概念lag,在『watermark大於視窗結束時間+lag』這個前提下,該視窗滿足『資料的時間小於watermark-lag』的資料可以被釋放,這個定義彌補了資料在生命週期管理的缺口。

基礎視窗介紹了視窗的基本思想和功能特性,可以滿足絕大部分需求。下面說說視窗的其他特性,聚合和撤銷(retracting)。

可能會出現這類需求,每次計算利用上一次計算後的結果,這樣既避免了重複計算,又減少了記憶體快取。但在流式計算中會有個問題,每次視窗計算得到的聚合結果可能不是正確的,再完美的觸發器也會在某個視窗遺漏一些延遲資料,可能到下個視窗這些延遲的資料出現了,這就需要視窗支援撤銷功能,也就是修改上乙個視窗的統計結果,然後把修改後的結果一起傳送到下個視窗。這樣在下個視窗做統計的時候,就會修正之前錯誤的統計,並到達最優結果。

批量計算其實是流式計算的乙個子集,而視窗就是流式計算轉為批量計算的臨界點,所以這是及其重要的概念,另外更多的例子和實戰參考apache beam,乙個高度抽象的統一程式設計模式。

流式計算框架

s4s4會將資料裡的每一條記錄包裝成event事件,每個事件是乙個kv對,同時有eventtype來標示這個事件的型別。pe是s4中的基本運算單元。每個pe只負責處理自己所關心的eventtype,並且只處理自己所對應的key值的event。pe處理後可能輸出乙個或多個event。就像hadoop上...

流式計算簡介

日常工作中,我們一般會先把資料儲存在一張表中,然後對這張表的資料進行加工 分析。那這裡是先儲存在表中,那就會涉及到時效性這個概念。如果我們處理以年,月為單位的級別的資料處理,進行統計分析,個性化推薦,那麼資料的的最新日期離當前有幾個甚至上月都沒有問題。但是如果我們處理的是以天為級別,或者以小時甚至更...

Storm流式計算

下面以水廠加工的例子進行講解。人們要想喝到自來水。1 是不是需要水幫浦在水源地進行抽水 2 將抽到的水放到蓄水池裡作進一步的處理。第乙個蓄水池的實現的功能就是做沉澱。第二個蓄水池的功能就是過濾。第三個蓄水池的功能就是消毒。之後產生蓄水。3 要想上面的過程完美的進行,是不是需要乙個中控室,來告訴這些水...