Flink流計算中SQL表的概念和原理

2022-05-05 19:06:11 字數 1911 閱讀 9126

fink在新發布的1.7版本中,不斷完善和加強了sql&table api方面的功能支援。這使得在流計算過程中,使用者同樣能夠運用熟悉的sql語句來做資料處理,查詢。但是相比於窗體的rdbms而言,流計算過程中的sql處理難免讓人覺得不是很好理解,畢竟資料不是fixed-sized的,而是連續不斷的。所以本文,筆者來聊聊這個略顯抽象的概念:流計算過程中的表以及sql查詢的含義。

在流處理過程中,資料是連續的,所以當我們把這些連續接收到的資料記錄匯聚到一起然後做呈現的時候,它其實是一種「動態」表。當不斷有新的資料來到的時候,這個動態表就不斷擴增。所以動態表在這裡更恰當的比喻應該是一種狀態表資訊。當然鑑於這個表的空間有限(狀態資料儲存受限),後面來的資料要麼會覆蓋早期相同的資料,要麼這個表中過期的資料會被移除。以此維護這個狀態表的資料資訊。當然,在流式計算中,每一條資料都有乙個自帶天然屬性的資訊,就是時間,它可以是process time,又或者說是event time。以下是一張歷史訪問頻率動態表的資料內容資訊,它在flink內部是以state(3個字段域組成)的形式駐留。

select

*from rateshistory;

rowtime currency rate==

====

====

====

====

===09:00 us dollar 102

09:00 euro 114

09:00 yen 1

10:45 euro 116

11:15 euro 119

11:49 pounds 108

既然表是動態的表,那也就會有動態的查詢,這裡我們指的一種連續不斷的查詢(continuous queries)。針對同樣的查詢條件,因為查詢表的資料是在不斷動態變化的,所以每次連續查詢的結果也將會不同。更進一步地來說,連續查詢的結果我們又可以作為另外乙個動態表。最終構成了下圖動態表的處理過程。

);會查出這樣的結果:

rowtime currency   rate==

====

====

====

====

===09:00 us dollar 102

09:00 yen 1

10:45 euro 116

同理,我們也可以做這種動態表之間的join操作,這方面詳細內容可參閱文末引用鏈結處。

相比較於傳統資料庫表的永續性,動態表的資料具有極強的時效性,也不能夠恆定持有所有的表狀態資料。所以在動態表中,我們要好好利用時間屬性在這裡的作用。如上節提到的,時間屬性是流資料中很關鍵的資訊,我們同樣需要利用這個時間屬性資訊,作為表中的乙個關鍵字段值。比如說,我們完全可以利用動態表做天,小時,甚至分鐘級別內的資料訪問、查詢,然後隔天表狀態過期記錄由系統自動清除。這樣我們完全無需借助外部儲存做來表資料的存放。當然,如果空間足夠,我們可以存放週期更長的表狀態資料,然後做更加完備的查詢處理。這裡其實是資源消耗和準確率之間的乙個trade off了。

[1].

[2].

flink計算實時流中的中位數

求1s內的中位數sink es 視窗1s,對資料進行分組 計算每組資料的總數 計算視窗內所有資料的總數 根據視窗內所有資料的總數找到中位數的位置 根據中位數的位置找到中位數 senv 源資料切割,封裝成stat物件 stat elapsedtime,num flatmap 按照stat elapse...

流計算框架 Flink 與 Storm 的效能對比

apache flink 和 apache storm 是當前業界廣泛使用的兩個分布式實時計算框架。其中 apache storm 以下簡稱 storm 在美團點評實時計算業務中已有較為成熟的運用 可參考 storm 的可靠性保證測試 有管理平台 常用 api 和相應的文件,大量實時作業基於 sto...

flink 中connect後,操作兩條流的資料

參考 使用process,自定義coprocessfunction 使用state記錄兩條流的資料,在process1中,判斷資料2是否存在,存在則collect,不存在則開啟timer 文章中timer的時間寫法有問題 應該用context.timestamp time.seconds 5 tom...