數棧技術分享:開源·數棧-擴充套件FlinkSQL實現流與維表的join
一、擴充套件FlinkSQL實現流與維表的join
二、 為什麼要擴充套件FlinkSQL?
1、實時計算需要完全SQL化
SQL是資料處理中使用最廣泛的語言。它允許使用者簡明扼要地宣告他們的業務邏輯。大資料批計算使用SQL很常見,但是支援SQL的實時計算並不多。其實,用SQL開發實時任務可以極大降低資料開發的門檻,在袋鼠雲數棧-實時計算模組,我們決定實現完全SQL化。
資料計算採用SQL的優勢
☑ 宣告式。使用者只需要表達我想要什麼,至於怎麼計算那是系統的事情,使用者不用關心。
☑ 自動調優。查詢最佳化器可以為使用者的 SQL 生成最有的執行計劃。使用者不需要了解它,就能自動享受最佳化器帶來的效能提升。
☑ 易於理解。很多不同行業不同領域的人都懂 SQL,SQL 的學習門檻很低,用 SQL 作為跨團隊的開發語言可以很大地提高效率。
☑ 穩定。SQL 是一個擁有幾十年歷史的語言,是一個非常穩定的語言,很少有變動。所以當我們升級引擎的版本時,甚至替換成另一個引擎,都可以做到相容地、平滑地升級。
參考連結: https://blog.csdn.net/weixin_33827965/article/details/86723623
2、實時計算還需要流與維表的JOIN
在實時計算的世界裡不只是流與流的JOIN,還需要流與維表的JOIN。在去年,袋鼠雲數棧V3.0版本研發期間,當時最新版本——flink1.6中FlinkSQL,已經將SQL的優勢應用到Flink引擎中,但還未支援流與維表的JOIN。
FlinkSQL於2017年7月開始面向阿里巴巴集團開放流計算服務的,雖然是一個非常年輕的產品,但是到雙11期間已經支撐了數千個作業,在雙11期間,Blink 作業的處理峰值達到了5+億每秒,而其中僅 Flink SQL 作業的處理總峰值就達到了3億/秒。
參考連結:
裡先解釋下什麼是維表;維表是動態表,表裡所儲存的資料有可能不變,也有可能定時更新,但是更新頻率不是很頻繁。在業務開發中一般的維表資料儲存在關係型資料庫如mysql,oracle等,也可能儲存在hbase,redis等nosql資料庫。
三、FlinkSQL實現流與維表的join分步走
1、用Flink api實現維表的功能
要實現維表功能就要用到 Flink Aysnc I/O 這個功能,是由阿里巴巴貢獻給Apache Flink的。
Async I/O 是由阿里巴巴貢獻給社群的,於1.2版本引入,主要目的是為了解決與外部系統互動時網路延遲成為了系統瓶頸的問題。
具體介紹可以看這篇文章: http://wuchong.me/blog/2017/05/17/flink-internals-async-io/
對應到Flink 的api就是RichAsyncFunction 這個抽象類,繼層這個抽象類實現裡面的open(初始化),asyncInvoke(資料非同步呼叫),close(停止的一些操作)方法,最主要的是實現asyncInvoke 裡面的方法。
流與維表的join會碰到兩個問題:
1)第一個是效能問題。
因為流速要是很快,每一條資料都需要到維表做下join,但是維表的資料是存在第三方儲存系統,如果實時訪問第三方儲存系統,不僅join的效能會差,每次都要走網路io;還會給第三方儲存系統帶來很大的壓力,有可能會把第三方儲存系統搞掛掉。
所以解決的方法就是維表裡的資料要快取,可以全量快取,這個主要是維表資料不大的情況,還有一個是LRU快取,維表資料量比較大的情況。
2)第二個問題是流延遲過來的資料這麼跟之前的維表資料做關聯。
這個就涉及到維表資料需要儲存快照資料,所以這樣的場景用HBase 做維表是比較適合的,因為HBase 是天生支援資料多版本的。
2、解析流與維表join的SQL語法轉化成底層的FlinkAPI
因為FlinkSQL已經做了大部分SQL場景,我們不可能在去解析SQL的所有語法,在把他轉化成底層FlinkAPI。
所以我們做的就是解析SQL語法,來找到join表裡有沒有維表,如果有維表,那我們會把這個join的維表的語句單獨拆來,用Flink的TableAPI和StreamAPi 生成新DataStream,在把這個DataStream與其他的表在做join這樣就能用SQL來實現流與維表的join語法了。
SQL解析的工具就是用Apache calcite,Flink也是用這個框架做SQL解析的。所以所有語法都是可以解析的。
1)DEMO SQL
2)Calcite解析Insert into語句,拆分出子語句
3) Calcite繼續解析select語句
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69995740/viewspace-2774935/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 數棧技術分享:用短平快的方式告訴你Flink-SQL的擴充套件實現SQL套件
- 擴充套件實現Unity協程的完整棧跟蹤套件Unity
- 數棧技術分享:數棧如何保障企業資料安全和隱私?
- 數棧技術分享:產品經理線上官方解答數棧小知識
- STL中的棧的擴充套件 (轉)套件
- 擴充套件Linux網路棧套件Linux
- flinkSql join redis的hash結構維表簡單實現SQLRedis
- 推薦一個有趣的Chrome擴充套件程式-檢視任意網站的開發技術棧Chrome套件網站
- CONNECT BY 擴充套件用法,實現獲取bom級聯擴充套件數量套件
- 開源共建 | Dinky 擴充套件批流統一資料整合框架 ChunJun 的實踐分享套件框架
- 現代前端開發技術棧前端
- 袋鼠雲數棧技術團隊入選開源中國“2021年度優秀開源技術團隊”
- INFORMIX表的預設初始擴充套件、下一個擴充套件資料塊以及一個表允許的最大擴充套件數。ORM套件
- Android技術棧(三)依賴注入技術的探討與實現Android依賴注入
- 從容器化到資源池化,數棧雲原生技術實踐探索之路
- .NET 技術棧 思維導圖
- 數棧技術分享:詳解FlinkX中的斷點續傳和實時採集斷點
- 數棧技術大牛分享:雲原生大資料系統架構的實踐和思考大資料架構
- 數棧產品分享:Kafka—實時離不開的那個TAKafka
- Tarjan中棧的分析與SLT棧的實現
- 擴充套件叢集blk數套件
- 數論分塊擴充套件套件
- 數棧技術分享:解讀MySQL執行計劃的type列和extra列MySql
- 《深入react技術棧》之表單React
- 擴充套件表套件
- 順序棧與鏈式棧的圖解與實現圖解
- Molecule實現數棧至簡前端開發新體驗前端
- ELK技術棧實踐(一)
- es6-數值擴充套件套件
- ES6數字擴充套件套件
- 聊聊真實的 Android TV 開發技術棧Android
- 數棧技術分享:到底什麼是資料中臺?終於有人說清楚了!
- [轉] 細數Javascript技術棧中的四種依賴注入JavaScript依賴注入
- 基於 Web 引擎擴充套件技術的 RTC 混合開發框架實踐Web套件框架
- 開源 | FLUI : Flutter 的元件擴充套件集UIFlutter元件套件
- 開源 | SOFAMesh 的通用協議擴充套件協議套件
- 擴充套件JAAS,XMLPolicyFile實現套件XML
- 快速創業之全棧技術棧創業全棧