聊聊流計算系統中的核心問題:狀態管理

来源:https://www.cnblogs.com/tree1123/archive/2020/05/06/12834464.html
-Advertisement-
Play Games

本文選自《實時流計算系統設計與實現》 文末有驚喜 狀態管理是流計算系統的核心問題之一。在實現流數據的關聯操作時,流計算系統需要先將視窗內的數據臨時保存起來,然後在視窗結束時,再對視窗內的數據做關聯計算。在實現時間維度聚合特征計算和關聯圖譜特征計算時,更是需要創建大量的寄存用於記錄聚合的結果。而CEP ...


本文選自《實時流計算系統設計與實現》 文末有驚喜

狀態管理是流計算系統的核心問題之一。在實現流數據的關聯操作時,流計算系統需要先將視窗內的數據臨時保存起來,然後在視窗結束時,再對視窗內的數據做關聯計算。在實現時間維度聚合特征計算和關聯圖譜特征計算時,更是需要創建大量的寄存用於記錄聚合的結果。而CEP的實現,本身就與常說的有限狀態機(Finite-state machine,FSM)是密切相關的。不管是為了關聯計算而臨時保存的數據,還是為了保存聚合計算的數據,抑或是CEP里的有限狀態機,這些數據都是流計算應用開始運行之後才創建和積累起來。如果沒有做持久化操作,這些數據在流計算應用重啟後會被完全清空。正因為如此,我們將這些數據稱之為流計算應用的“狀態”。從各種開源流計算框架的發展歷史來看,大家對實時流計算中的“狀態”問題也是一點點逐步弄清楚的。

我們將流在執行過程中涉及到的狀態分為兩類:流數據狀態和流信息狀態。

  • 流數據狀態。在流數據處理的過程中,可能需要處理事件視窗、時間亂序、多流關聯等問題,在解決這些問題的過程中,通常會涉及到對部分流數據的臨時緩存,併在處理完後將其清理。我們將臨時保存的部分流數據稱為“流數據狀態”。
  • 流信息狀態。在對流數據的分析過程中,會得到一些我們感興趣的信息,比如時間維度的聚合數據、關聯圖譜中的一度關聯節點數、CEP中的有限狀態機等,這些信息可能會在後續的流數據分析過程中被繼續使用,從而需要將這些信息保存下來。同時在後續的流數據處理過程中,這些信息還會被不斷地訪問和更新。我們將這些分析所得並保存下來的數據稱為“流信息狀態”。

圖1: 流數據狀態和流信息狀態

為什麼區分這兩種狀態非常重要?思考這麼一個問題,如果我們要計算“用戶過去7天交易的總金額”,該如何做?一種顯而易見的方法,是直接使用在各種流計算框架中都提供的視窗函數來實現。比如在Flink中如下:

userTransactions.keyBy(0)// 滑動視窗,每1秒鐘計算一次7天視窗內的交易金額.timeWindow(Time.days(7), Time.seconds(1)).sum(1);

上面的Flink示例代碼使用timeWindow視窗,每1秒鐘計算一次7天視窗內的總交易金額。其它流計算平臺如Spark Streaming、Storm等也有類似的方法。但這樣做有以下幾點非常不妥:

  • 這個計算是每1秒鐘才能輸出結果,而如果是需要每來一個事件就要計算一次該事件所代表的用戶在“過去7天交易的總金額”,這種做法顯然就不可行。
  • 視窗為7天,滑動步長為1秒,這兩個時間相差的數量級也太大了。這也意味著需要在“7天除以1秒”這麼多個視窗中被重覆計算!當然,這裡設置1秒是因為要儘可能地“實時”。如果覺得1秒太“過分”,也可以設置滑動步長為30秒、60秒等,但這並不能改變重覆計算的本質,且滑動步長越長,離“實時計算”越遠。
  • 視窗為7天,就需要在實時流計算系統中緩存7天的流數據。而我們想要得到的其實只是一個聚合值而已,所以保存7天完整的流數據似乎有些殺雞用牛刀。當然,Flink對諸如sum、max、min之類的視窗聚合計算做了優化,可以不用保存視窗里的全部數據,只需要保留聚合結果即可。但是如果用戶需要做些定製化操作(比如自定義Evictor)的話,就需要保存視窗內的全量數據了。
  • 如果要在一個事件上,計算幾十個類似於“用戶過去7天交易的總金額”這樣的特征,按照timeWindow的實現方法,每個特征可能會有不同的時間視窗和滑動步長,該怎樣同步這幾十個特征計算的結果呢?

所以說,直接使用由流計算框架提供的視窗函數來實現諸如“時間維度聚合特征”的計算問題,我們在很多情況下都會遇到問題。究其根本原因,是因為混淆了“對流的管理”和“對數據信息的管理”這兩者本身。因為“視窗”實際上是對“流數據”的分塊管理,我們用“視窗”來將“無窮無盡”的流數據分割成一個個的“數據塊”,然後在“數據塊”上做各種計算。這屬於對流數據的“分而治之”處理。我們不能將這種針對“流數據”本身的分治管理模式,與我們對數據的業務信息分析視窗耦和起來。

因此,我們需要將“對流的管理”和“對數據信息的管理”這兩者分離開來。其中“對流的管理”需要解決諸如視窗、亂序、多流關聯等問題,其中也會涉及對數據的臨時緩存,它緩存的是流數據本身,因此我們稱之為“流數據狀態”。而“對數據信息的管理”則是為了在我們在分析和挖掘數據內含信息時,幫助我們記錄和保存業務分析結果,因而稱之為“流信息狀態”。

流數據狀態管理中,比較重要的就是事件視窗、時間亂序和流的關聯操作。

事件視窗是產生流數據狀態的主要原因。比如“每30秒鐘計算一次過去五分鐘交易總額”、“每滿100個事件計算平均交易金額”、“統計用戶在一次活躍期間點擊過的商品數量”等。對於這些以“視窗”為單元來處理事件的方式,我們需要用一個緩衝區(buffer)臨時地存儲過去一段時間接收到的事件,等觸發視窗計算的條件滿足時,再觸發處理視窗內的事件。當處理完成後,還需要將過期和以後不再使用的數據清除掉。另外,在實際生產環境中,可能會出現故障恢復、重啟等情況,這些“緩衝區”的數據在必要時需要被寫入磁碟,併在重新計算或重啟時恢復。

解決時間亂序問題是使用流數據狀態的另一個重要原因。由於網路傳輸和併發處理的原因,在流計算系統接收到事件時,非常有可能事件已經在時間上亂序了。比如時間戳為1532329665005的事件,比時間戳為1532329665001的事件先到達流計算系統。怎樣處理這種事件在時間上亂序的問題呢?通常的做法就是將收到的事件先保存起來,等過一段時間後亂序的事件到達時,再將其和保存的事件按時間排序,這樣就恢復了事件的時間順序。當然,上面的過程存在一個問題,就是“等過一段時間”到底是怎樣等以及等多久?針對這個問題有一個非常優秀的解決方案,就是水印(watermark)。使用水印解決時間亂序的原理如下,在流計算數據中,按照一定的規律(比如以特定周期)插入“水印”,水印是一個時間戳,當處理單元接收到“水印”時,表示應該處理所有時間戳在該水印之前的事件。我們通常將水印設置為事件的時間戳減去一段時間的值,這樣就給先到的時間戳較大的事件一個等待晚到的時間戳較小的事件的機會,而且確保了不會沒完沒了地等待下去。

流的關聯操作也會涉及流數據狀態的管理。常見的關聯操作有join和union。特別是在實現join操作時,需要先將參與join操作的各個流的相應視窗內的數據緩存在流計算系統內,然後以這些視窗內的數據為基礎,做類似於關係型資料庫中表與表之間的join計算,得到join計算的結果,之後再將這些結果以流的方式輸出。很顯然,流的關聯操作也是需要臨時保存部分流數據的,故而也是一種“流數據狀態”的運用。

除了以上三種“流數據狀態”的主要用途外,還有些地方也會涉及流數據狀態的管理,比如排序(sorting)、分組(group by)等。但不管怎樣,這些操作都有個共同的特點,即它們需要緩存的是部分原始的流數據。換言之,這些操作要保存的狀態是部分“流數據”本身。這也正是將這類狀態取名為“流數據狀態”的原因。流信息狀態是為了記錄流數據的處理和分析過程中獲得的我們感興趣的信息,這些信息會在後續的流處理過程中會被繼續使用和更新。以“實時計算每個交易事件在發生時過去7天交易的總金額”這個計算為例,可以將每小時的交易金額記錄為一條狀態,這樣,當一個交易事件到來時,計算“過去7天的交易總金額”,就是將過去7天每個小時的總交易金額讀取出來,然後對這些金額記錄求總和即可。在上面這個例子中,將每小時的交易金額記錄為一條狀態,就是我們說的“流信息狀態”。

流信息狀態的管理通常依賴於資料庫完成。這是因為對於從流分析出來的信息,我們可能需要保存較長時間,而且數據量會很大,如果將這些信息狀態放在記憶體中,勢必會占用過多的記憶體,這是不必要的。對於保存的流信息狀態,我們並不是在每次計算中都會用到,它會存在冷數據和過期淘汰的問題。所以,對於流信息狀態的管理,交給專門的資料庫是非常明智的。畢竟目前為止,各種資料庫的選擇十分豐富,而且許多資料庫對熱數據緩存和TTL機制都有非常好的支持。

實時流計算應用中的“流數據狀態”和“流信息狀態”。可以說是分別從兩個不同的維度對“流”進行了管理。前者“流數據狀態”是從“時間”角度對流進行管理,而後者“流信息狀態”則是從“空間”角度對流的管理。“流信息狀態”彌補了“流數據狀態”彌補了“流數據狀態”只是對事件在時間序列上做管理的不足,將流的狀態擴展到了任意的空間。

作者簡介:周爽,本碩畢業於華中科技大學,先後在華為2012實驗室高斯部門和上海行邑信息科技有限公司工作。開發過實時分析型記憶體資料庫RTANA、華為公有雲RDS服務、移動反欺詐MoFA等產品。目前但任公司技術部架構師一職。著有《實時流計算系統設計與實現》一書。

本次聯合【機械工業出版社華章公司】為大家送上1本作者的正版書籍《實時流計算系統設計與實現》

請在關註“實時流式計算” 併在後臺回覆 “抽獎”參與活動

更多實時數據分析相關博文與科技資訊,歡迎關註 “實時流式計算”


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 第三天MySQL學習 :分組函數、分組查詢、連接查詢(等值連接、非等值連接、自連接) ...
  • 學習視頻:https://www.bilibili.com/video/BV1tJ411r7EC?p=75 游標cursor:用於存放多條數據的容器。需要開始open和關閉close。游標下移使用“fetch...into...”。 declare cursor myCursor is select ...
  • /* *周一作為一周的開始 *當年的1月1號所在的周算作第一周 */ CREATE function GetWeekIndexFirstDate ( @date datetime ) returns int as begin /* *計算邏輯 *1.先找出當年的1月1號@firstDate *2.計 ...
  • Kylin on HBase 方案經過長時間的發展已經比較成熟,但也存在著局限性,因此,Kyligence 推出了 Kylin on Parquet 方案。通過標準數據集測試,與仍採用 Kylin on HBase 方案的 Kylin 3.0 相比,Kylin on Parquet 的構建引擎性能有... ...
  • 一開始我就以為 oplog 應該就類似於 mysql bin-log 而事實上,確實差不多。oplog 也是用於複製集間由 Primary 記錄,Secondary 用來同步。從而保持數據一致。 最近遇到了誤刪db(刪庫不能跑路)的事情,所以,實驗了N多次的 oplog 恢複數據。 特地記錄一下,以 ...
  • 4.1 字典數據結構 typedef struct dict{ //類型特定函數 dictType *type; //私有數據 void *privateata; //哈希表 dictht ht[2]; //rehash 索引,rehash未進行時,值為-1 int rehashidx;}dict; ...
  • 表結構 student(StuId,StuName,StuAge,StuSex) 學生表 teacher(TId,Tname) 教師表 course(CId,Cname,C_TId) 課程表 sc(SId,S_CId,Score) 成績表 問題四:查詢姓“李”的老師的個數 SELECT COUNT( ...
  • 一、什麼是事務? 資料庫事務(Transaction)是訪問並可能操作各種數據項的一個資料庫操作序列,這些操作要麼全部執行,要麼全部不執行,是一個不可分割的工作單位。事務由事務開始與事務結束之間執行的全部資料庫操作組成。 例如:從A賬號給B賬號轉帳,對應於如下兩條sql語句 update from ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...