• 聊聊FLINK25631贡献


    从入行做数据库开发,到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!

  • 相关阅读:
    (转)Web自动化测试中的接口测试
    Redis在.net中的应用学习
    Redis学习第八课:Redis高级实用特性(一)
    Redis学习第七课:键值命令和服务器命令
    Redis学习第六课:Redis ZSet类型及操作
    先验概率 vs 后验概率
    cout格式化输出
    python练习linux下创建路径
    把“苹果中国首发”视为扬眉吐气是自卑的表现
    字符串处理算法(三)按指定位置交换字符串两部分的位置
  • 原文地址:https://www.cnblogs.com/codetouse/p/16266970.html
Copyright © 2020-2023  润新知