• 聊聊FLINK-25631贡献


    从入行做数据库开发,到2018年过渡到大数据开发,可以说我已经与sql朝夕相处了七八年了,经常惊讶于简单的语法就能产生复杂的操作,而且还能根据索引等统计信息自动优化,不禁很想实现自己的sql语法,却不知道这是怎么做到的,繁忙的工作、庞大的语法解析及优化的储备知识让我迟迟难以行动起来,但只要出现契机并敢于把握,这些困难都不算什么。

    一个契机

    我在捣鼓Flink发行版时,建了很多库和表,每次要看一个库的表时都要切到对应的库,切过去以后也只能在200多个表的库中肉眼寻找想要的表,记得在使用mysql时可以很方便地使用 `show tables from ... like ...` 语法完美解决这个问题,心想如果Flink也支持这个特性就好了,在经过短暂的思想斗争后终于下决心解决这个心头刺。然后我就开始研究Flink sql模块的语法解析部分,发现Calcite使用freemaker模板引擎,并在底层借助JavaCC做语法解析器,而定义新的sql语法必然要用到语法解析器,很快大致方案便定了下来:

    • 背景知识巩固:语法解析原理,freemaker模板引擎,JavaCC
      • 相关JavaCC和Calcite的开发代码可以在https://github.com/liyubin117/JavaTest代码仓库里看到
    • 熟悉Flink sql与Calcite集成
      • 参考社区`show columns`语法的实现,https://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(https://issues.apache.org/jira/browse/FLINK-25369),社区的人很热情,很快就对我回复了,然后我提交了代码被合到了master分支。

    FLINK-25369被社区合入后,重头戏来了,我终于向社区提了`show tables`高级语法特性(https://issues.apache.org/jira/browse/FLINK-25631),这是一个涉及近千行代码的大工程,虽然之前也做过一些贡献,但没贡献过这么复杂的功能,有些担心。云邪老师人很nice,很耐心地帮我review代码并提了些我之前未意识到的问题,高手确实是高手。

    终于在2022年3月4号那天FLINK-25631被合进官方代码仓库,oh yeah!

  • 相关阅读:
    C++(20):atomic_ref原子的操作非原子变量
    使用香橙派学习 Linux的守护进程
    伪标签汇总
    gcc -c/-o的作用
    Android Studio 引入Xui框架-简单应用
    网友提问:HTML CSS JS很低级吗?
    Python这些冷门特性,当初也没教啊
    Vue入门与介绍(初学必看)
    配置pod拉取harbor容器镜像仓库私有镜像:secret保存账号密码
    二叉树习题-小记
  • 原文地址:https://www.cnblogs.com/codetouse/p/16266970.html