擴充套件FlinkSQL實現流與維表的join
擴充套件FlinkSQL實現流與維表的join
現在最新版本的flink1.6版本現在還不支援直接用SQL來實現流與維表的join。這裡打個廣告我們團隊已經實現了這個功能並且開源ofollow,noindex" target="_blank">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解析的。所以所有語法都是可以解析的。