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并最终映射到最基础的算子,按照固定的流程来执行.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值