聊聊FLINK-25631貢獻

從入行做資料庫開發,到2018年過渡到大數據開發,可以說我已經與sql朝夕相處了七八年了,經常驚訝於簡單的語法就能產生複雜的操作,而且還能根據索引等統計資訊自動優化,不禁很想實現自己的sql語法,卻不知道這是怎麼做到的,繁忙的工作、龐大的語法解析及優化的儲備知識讓我遲遲難以行動起來,但只要出現契機並敢於把握,這些困難都不算什麼。

一個契機

我在搗鼓Flink發行版時,建了很多庫和表,每次要看一個庫的表時都要切到對應的庫,切過去以後也只能在200多個表的庫中肉眼尋找想要的表,記得在使用mysql時可以很方便地使用 `show tables from … like …` 語法完美解決這個問題,心想如果Flink也支援這個特性就好了,在經過短暫的思想鬥爭後終於下決心解決這個心頭刺。然後我就開始研究Flink sql模組的語法解析部分,發現Calcite使用freemaker模板引擎,並在底層藉助JavaCC做語法解析器,而定義新的sql語法必然要用到語法解析器,很快大致方案便定了下來:

  • 背景知識鞏固:語法解析原理,freemaker模板引擎,JavaCC
    • 相關JavaCC和Calcite的開發程式碼可以在//github.com/liyubin117/JavaTest程式碼倉庫里看到
  • 熟悉Flink sql與Calcite集成
    • 參考社區`show columns`語法的實現,//issues.apache.org/jira/browse/FLINK-22885
  • 參考spark、mysql等流行引擎定義語法格式
    • SHOW TABLES [ ( FROM | IN ) [catalog_name.]database_name ] [ [NOT] LIKE <sql_like_pattern> ]
  • 開發Flink sql新語法

雖然事後看來這個方案理所當然,但其實中間遇到了很多坎,尤其是沒有人可以請教。

行動起來

在經過半個多月的細節敲定和反覆驗證後,終於按方案完成了功能,然後美滋滋地編譯打包進行驗證,卻發現結果與預料的不一樣,不管`from`子句後面跟哪個庫,都只會顯示當前庫的表,心裡有些發虛,好消息`like`子句經驗證是正常的,又壯了壯信心。我回頭看了下所有的實現,都沒發現問題,會不會是調用的底層介面有問題。我在實現時使用了內核提供的CatalogManager.listTables介面,一查果然有bug,只是由於之前Flink不支援我實現的這個功能,所以問題沒暴露出來,很快我把這個問題修復後,向社區提了JIRA(//issues.apache.org/jira/browse/FLINK-25369),社區的人很熱情,很快就對我回復了,然後我提交了程式碼被合到了master分支。

FLINK-25369被社區合入後,重頭戲來了,我終於向社區提了`show tables`高級語法特性(//issues.apache.org/jira/browse/FLINK-25631),這是一個涉及近千行程式碼的大工程,雖然之前也做過一些貢獻,但沒貢獻過這麼複雜的功能,有些擔心。雲邪老師人很nice,很耐心地幫我review程式碼並提了些我之前未意識到的問題,高手確實是高手。

終於在2022年3月4號那天FLINK-25631被合進官方程式碼倉庫,oh yeah!

Tags:
Exit mobile version