【译】用SQL统一所有:一种有效的、语法惯用的流和表管理方法
現(xiàn)在還沒有一個(gè)統(tǒng)一的流式SQL語(yǔ)法標(biāo)準(zhǔn),各家都在做自己的。本文在一些業(yè)界應(yīng)用的基礎(chǔ)上提出了一個(gè)統(tǒng)一SQL語(yǔ)法的建議。Spark同樣存在這個(gè)問題,社區(qū)版本在流式SQL上遲遲沒有動(dòng)作。EMR Spark在今年上半年提供了自己設(shè)計(jì)版本的流式SQL支持,也會(huì)在后續(xù)的更新中吸收和支持這些優(yōu)秀的設(shè)計(jì)建議。
原文:https://blog.acolyer.org/2019/07/03/one-sql-to-rule-them-all/
資料:One SQL to rule them all: an efficient and syntactically idiomatic approach to management of streams and tables Begoli et al., SIGMOD’19
在數(shù)據(jù)處理方面,似乎最終都會(huì)回歸到SQL上!今天選擇的這篇文章作者來(lái)自于Apache Beam,Apache Calcite以及Apache Flink的專家們,闡述了他們?cè)跇?gòu)建流式處理SQL接口的經(jīng)驗(yàn)。最終整理了一些SQL標(biāo)準(zhǔn)的擴(kuò)展建議。
The thesis of this paper, supported by experience developing large open-source frameworks supporting real-world streaming use cases, is that the SQL language and relational model as-is and with minor non-intrusive extensions, can be very effective for manipulation of streaming data.
這篇文章的論點(diǎn)是,在開發(fā)使用大規(guī)模開源框架解決現(xiàn)實(shí)世界的實(shí)際流式場(chǎng)景經(jīng)驗(yàn)下,SQL語(yǔ)言及關(guān)系性模型在當(dāng)前及非侵入式擴(kuò)展后,對(duì)于流數(shù)據(jù)的操作非常有效。
文章中很多觀點(diǎn)已經(jīng)在Apache Beam,Apache Calcite以及Apache Flink中實(shí)現(xiàn),或者作為眾多選擇之一。Streaming SQL已經(jīng)在阿里巴巴,華為,Lyft,Uber及其他一些公司中應(yīng)用。下面是一些他們的反饋,為啥做這樣的選擇:
- 開發(fā)和應(yīng)用成本相對(duì)于那些非聲明性流處理 API要低得多。
- 比起非標(biāo)準(zhǔn)化的查詢語(yǔ)言,熟悉SQL更容易開發(fā)應(yīng)用。
- 常見的窗口聚合及join等處理任務(wù),基于event-time可以更方便的表達(dá)及更高效的執(zhí)行。
- 當(dāng)應(yīng)用出錯(cuò)或者服務(wù)中斷時(shí),可以很方便地使用同一個(gè)查詢語(yǔ)句對(duì)記錄存儲(chǔ)的數(shù)據(jù)進(jìn)行處理。
1. 基本原則
Combined, tables and streams cover the critical spectrum of business operations ranging from strategic decision making supported by historical data to near- and real-time data used in interactive analysis… We believe, based on our experience and nearly two decades of research on streaming SQL extensions, that using the same SQL semantics in a consistent manner is a productive and elegant way to unify these two modalities of data…
總的來(lái)說,表和流覆蓋了業(yè)務(wù)運(yùn)營(yíng)的關(guān)鍵范圍,從歷史數(shù)據(jù)支持的戰(zhàn)略決策到交互式分析中使用到的近實(shí)時(shí)數(shù)據(jù)。我們相信,基于我們的經(jīng)驗(yàn)和近 20 年對(duì)流式 SQL 擴(kuò)展的研究,以一致的方式使用相同的 SQL 語(yǔ)義是統(tǒng)一這兩種數(shù)據(jù)模式的高效和優(yōu)雅方式。
正如作者指出的一樣,過去許多年里已經(jīng)進(jìn)行了很多前期工作,文章中也借鑒了很多其中大部分。最重要的是,它們是基于使用Apache Flink、Beam以及Calcite所獲得的經(jīng)驗(yàn)教訓(xùn)。
相比于傳統(tǒng)的關(guān)系性視圖,流式應(yīng)用多了一個(gè)Time概念。請(qǐng)注意,在一個(gè)用戶多次查詢中,一個(gè)可變的數(shù)據(jù)表實(shí)際上就是一個(gè)隨時(shí)間變化的表,即time-varying relation (TVR)。也就是說,任何一次查詢結(jié)果,都只是代表了那個(gè)時(shí)間點(diǎn)的表數(shù)據(jù)。
A time-varying relation is exactly what the name implies: a relationship whose contents may vary over time… The key insight, stated but under-utilized in prior work, is that streams and tables are two representations for one semantic object.
一個(gè)時(shí)變表就像它的名字所蘊(yùn)含的一樣:表的數(shù)據(jù)內(nèi)容可能隨著時(shí)間變化而變化。在以前的工作中,指出但未充分利用的觀點(diǎn)是,流和表是一個(gè)語(yǔ)義對(duì)象的兩個(gè)表示形式。
按照定義,TVR支持所有的關(guān)系型操作,即使在涉及時(shí)變關(guān)系數(shù)據(jù)的場(chǎng)景中也是如此。所以文中提出的第一個(gè)建議實(shí)際上就是no-op!所以讓我們使用它們,并明確說明SQL是在TVRs上操作的。
我們確實(shí)需要做一些擴(kuò)展來(lái)支持event-time。我們尤其需要小心地區(qū)分event-time和processing-time。我們還需要理解,事件并不一定是按照事件時(shí)間順序呈現(xiàn)的。
We propose to support event time semantics via two concepts: explicit event timestamps and watermarks. Together, these allow correct event time calculation, such as grouping into intervals (or windows) of event time, to be effectively expressed and carried out without consuming unbounded resources.
我們提出通過兩個(gè)概念來(lái)支持event-time語(yǔ)義:顯式的時(shí)間時(shí)間戳以及watermarks。兩相結(jié)合,就可以正確地支持event-time計(jì)算,例如按時(shí)間窗口group,這樣可以高效的表達(dá)和計(jì)算,而無(wú)需消耗大量的資源。
Watermark可以追溯至Millwheel,?Google Cloud Dataflow,直到Apache Beam and Apache Flink。在處理時(shí)間的每一刻,watermark確定了一個(gè)時(shí)間戳,這個(gè)時(shí)間戳確定在處理時(shí)間上事件完整性的時(shí)間界限。
文章第三塊講述了控制關(guān)系型數(shù)據(jù)如何呈現(xiàn)以及何時(shí)物化數(shù)據(jù)行。例如:查詢結(jié)果是立刻更新來(lái)反映任何輸入的新數(shù)據(jù),還是在一個(gè)時(shí)間窗口末尾處展示完整的數(shù)據(jù)更新。
2. 示例
NEXmark(一個(gè)流式查詢的benckmark) Query7實(shí)現(xiàn)了一個(gè)監(jiān)控競(jìng)拍中最高價(jià)物品的邏輯。每10分鐘,查詢返回最高的bid及相關(guān)的itemid。
下面這張圖展示了如何使用Streaming SQL來(lái)表達(dá)。我沒有對(duì)業(yè)務(wù)邏輯做過多的描述,而是對(duì)查詢本身進(jìn)了注釋。希望這已經(jīng)足夠讓你們理解要點(diǎn)了。
輸入以下數(shù)據(jù):
8:21分查詢時(shí),會(huì)得到如下TVR:
但如果在8:13分查詢時(shí),結(jié)果又不一樣:
注意,正如目前所表達(dá)的,查詢返回時(shí)間點(diǎn)結(jié)果,但是如果我們?cè)敢?#xff0c;我們可以使用物化延遲的方式來(lái)改變結(jié)果的展示方式。例如“SELECT ... EMIT AFTER WATERMARK;”,查詢結(jié)果只會(huì)在watermark到達(dá)了時(shí)間窗口末尾時(shí)才更新。
所以,在8:16,我們會(huì)看到:
然后到了8:21,會(huì)看到:
如果希望看到不帶watermark的窗口行,但只要得到周期性的局和結(jié)果,我們可以使用“SELECT ... EMIT STREAM AFTER DELAY”(這里STREAM表示我們希望流式地展示查詢結(jié)果)。
3. SQL擴(kuò)展
希望這能給你帶來(lái)幫助。目前,該建議包含對(duì)標(biāo)準(zhǔn)SQL的7個(gè)擴(kuò)展:
- Watermarked event time column:關(guān)系型表中帶有watermark的類型為TIMESTAMP的列。watermark由系統(tǒng)進(jìn)行維護(hù)。
- Grouping on event timestamps:當(dāng)“Group By”字句作用于時(shí)間列時(shí),只包含那些key小于時(shí)間列定義的watermark的groups。
- Event-time windowing functions:以Tumble和Hop開頭,參數(shù)包括數(shù)據(jù)表和時(shí)間列描述符,返回一個(gè)添加了時(shí)間列的數(shù)據(jù)表。Tumble產(chǎn)生間距相等的不相交窗口,Hop生成同等大小的滑動(dòng)窗口。
- Stream materialization:“EMIT STREAM”會(huì)產(chǎn)生一個(gè)按時(shí)間變化的結(jié)果表,區(qū)別于傳統(tǒng)的查詢結(jié)果。新增一個(gè)列來(lái)指明一個(gè)數(shù)據(jù)行是否是上一行的撤回,該行的日志更新處理時(shí)間偏移量以及相對(duì)于同一事件時(shí)間分組的其他更新的序列號(hào)。
- Materialization delay: 當(dāng)查詢帶有“EMIT AFTER WATERMARK”修飾語(yǔ),只有完整的結(jié)果行才會(huì)物化。
- Periodic materialization: 當(dāng)查詢帶有“EMIT AFTER DELAY d”修飾語(yǔ),查詢結(jié)果間隔d個(gè)周期才會(huì)輸出出來(lái)。
- Combined materialization delay: 當(dāng)查詢帶有“EMIT AFTER DELAY d AND AFTER WATERMARK ”修飾語(yǔ),查詢結(jié)果間只會(huì)在隔d個(gè)周期且數(shù)據(jù)完整的時(shí)候才會(huì)輸出出來(lái)。
3.1 Hop示例
3.2 Emit Stream示例
4.經(jīng)驗(yàn)教訓(xùn)
文章中的第5節(jié)列出了從Apache Calcite、Flink和Beam中學(xué)到的經(jīng)驗(yàn)教訓(xùn),這些經(jīng)驗(yàn)教訓(xùn)為設(shè)計(jì)提供了參考。我沒有足夠時(shí)間來(lái)一一介紹,下面節(jié)點(diǎn)比較吸引我的注意:
- 因?yàn)槭录r(shí)間戳只是常規(guī)屬性,可以在普通表達(dá)式中引用,所以表達(dá)式結(jié)果可能不會(huì)與watermark保持一致,這在查詢計(jì)劃中需要考慮。
- 用戶發(fā)現(xiàn)很難推斷查詢中事件時(shí)間的最佳使用情況,這可能導(dǎo)致使用不合預(yù)期的語(yǔ)義執(zhí)行計(jì)劃。
5. 未來(lái)工作
對(duì)我來(lái)說,印象深刻的是用盡量少的改動(dòng)達(dá)到目的。文章中的“future work”部分顯示,文中提出的那些擴(kuò)展還需要進(jìn)一步完善才行。
例如,我注意到的一點(diǎn)是,SQL標(biāo)準(zhǔn)定義中規(guī)定SQL查詢中的time是查詢的時(shí)間點(diǎn)(要么是當(dāng)前時(shí)間,要么是使用“AS OF SYSTEM TIME”指定的時(shí)間)。這意味著您還不能在stream尾上表達(dá)視圖(你可以使用類似“CURRENT_TIME - INTERVAL ‘1’ HOUR”的表達(dá)式,但是查詢執(zhí)行時(shí),“CURRENT_TIME”取一個(gè)固定值)。
原文鏈接
本文為云棲社區(qū)原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。
總結(jié)
以上是生活随笔為你收集整理的【译】用SQL统一所有:一种有效的、语法惯用的流和表管理方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 它是真实的“盗梦空间”?在这里,一切都可
- 下一篇: Archsummit 2019重磅分享|