擴展FlinkSQL實現流與維表的join

現在最新版本的flink1.6版本現在還不支持直接用SQL來實現流與維表的join。這裏打個廣告我們團隊已經實現了這個功能並且開源 https://github.com/DTStack/flinkStreamSQL

這裏先解釋下什麼是維表;維表是動態表,表裏所存儲的數據有可能不變,也有可能定時更新,但是更新頻率不是很頻繁。在業務開發中一般的維表數據存儲在關係型數據庫如mysql,oracle等,也可能存儲在hbase,redis等nosql數據庫。

所以要用FlinkSQL實現流與維表的join 分兩步;第一是用flink api實現維表的功能:
要實現維表功能就要用到 flink Aysnc I/O 這個功能,是由阿里巴巴貢獻給apache flink的。具體介紹可以看這篇文章 http://wuchong.me/blog/2017/05/17/flink-internals-async-io/,這裏不做介紹。
對應到flink 的api就是RichAsyncFunction 這個抽象類,繼層這個抽象類實現裏面的open(初始化),asyncInvoke(數據異步調用),close(停止的一些操作)方法,最主要的是實現asyncInvoke 裏面的方法。流與維表的join會碰到兩個問題,一個是性能問題,因爲流速要是很快,每一條數據都需要到維表做下join,但是維表的數據是存在第三方存儲系統,如果實時訪問第三方存儲系統,一個是join的性能會差,每次都要走網絡io;還有就是對第三方存儲系統帶來很大的壓力,有可能會把第三方存儲系統搞掛掉。所以解決的方法就是維表裏的數據要緩存,可以全量緩存,這個主要是維表數據不大的情況,還有一個是LRU緩存,維表數據量比較大的情況。第二個問題是流延遲過來的數據這麼跟之前的維表數據做關聯;這個就涉及到維表數據需要存儲快照數據,所以這樣的場景用hbase 做維表是比較適合的,因爲hbase 是天生支持數據多版本的。

第二是解析流與維表join的sql語法轉化成底層的flinkAPI
因爲flinkSQL已經做了大部分sql場景,我們不可能在去解析sql的所有語法,在把他轉化成底層flinkAPI。所以我們做的就是解析sql語法,來找到join表裏有沒有維表,如果有維表,那我們會把這個join的維表的語句單獨拆來,用flink的tableAPI和streamAPi 生成新DataStream,在把這個DataStream與其他的表在做join這樣就能用SQL來實現流與維表的join語法了。sql解析的工具就是用apache calcite,flink也是用這個框架做sql解析的。所以所有語法都是可以解析的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章