Flink-1.12.1源码阅读之table
Flink的核心工程之一便是table,虽然flink不像spark那样有sql专门为一个核心点,但是这个table其实就是sql,就是基于sql来执行流或批处理.
Flink和hive一样,使用calcite来解析sql,同时加入了自己的一些额外的优化,至于calcite是如何解析sql的这里不再展开,可以参照其apache的官网,上面有详细的解释.所以这里就是类似于解释spark的sql那样,主要就是为了弄清楚flink的sql执行逻辑.
1 调试
这里依然使用examples工程中的类,在table的目录下,首先来看一下stream相关的table的例子.
可见,在table目录下,有两个stream相关的例子,这里以第二个为例,其实和第一个是类似的,读者也可以以第一个为例.断点设置如下
2 main方法分析
此处main方法的代码较少,这里完整看一下计算的逻辑.main方法全貌如下
首先设置env,接着设置输入数据,再设置计算逻辑,此处在toAppendStream处打上断点,进入该方法
调用的是tEnv的toAppendStream方法,进入该方法
最终调用的是toDataStream方法,进入该方法
可以看到,有关sql的操作就是在第一步转换transformation完成的,此处使用了planner的translate方法,该方法就是完成sql解析中的主要解析功能,只是借助calcite来完成,最终返回的是DataStream类型,这又回到了flink最初的流处理过程.
所以在经过tanslate过程后,把sql解析为最终的流处理对应的算子,就像spark sql最终会被解析为rdd的操作一样,进入固定的模式完成执行.
期间flink是如何使用calcite来解析sql的有兴趣的读者可以参考calcite的官网和flink的源码进行更进一步的解读,由于之前本人已经解析过spark sql,只不过spark是使用antlr4来完成sql解析的,所以这里是同样相同的情景,只不过flink换成了calcite,此处略过.
3 对大数据中sql的一些总结
不论是之前的spark,还是这里的flink,又或者是hive,它们都使用了sql,并且都是作为一个核心点来设计和实现的,这说明sql不仅是在传统的数据库中得到广泛使用,在大数据的范畴中也是不可或缺的.
Sql作为一整套搜索的设计和实现,使其作为大数据范畴内的不二选择也是理所当然的.各种大数据在使用sql时无不是按照其设计的那一套来严格实现的,只是最终的执行阶段换成了自己的计算方式,比如rdd算子,流算子以及mr.
同样,影响sql运行的还是最终得到执行的这些算子,特别是在大数据范畴内,数据量大的特点也决定了sql不会像传统数据库那样运行的很快,但是这确实是一种有效的能够得到计算结果的方式,或者说也是一种捷径.
4 总结
Flink的table其实就是sql,来处理流和批的计算,使用了calcite来解析sql并最终映射到最基础的算子,按照固定的流程来执行.