文章目录
- 分享
- 说明
- 资料
- 架构
- 优势
- maven导包
- tabel API和SQL
- 本地环境配置
- 优化
- stream支持scala
- 支持自定义格式或函数
- 程序结构
- Blink(新)和flink(旧)计划器区别
- 程序结构
- 总结
分享
- 大数据博客列表
说明
- Flink Table 相关知识是我一直感兴趣的部分,现决定跨过一些不必要的知识,直接学习 Flink Table ,本文主要介绍 flink table 架构和接口实现。
- Apache Flink 有两种关系型 API 来做流批统一处理:Table API 和 SQL。Table API 是用于 Scala 和 Java 语言的查询API,它可以用一种非常直观的方式来组合使用选取、过滤、join 等关系型算子。Flink SQL 是基于 Apache Calcite 来实现的标准 SQL。这两种 API 中的查询对于批(DataSet)和流(DataStream)的输入有相同的语义,也会产生同样的计算结果。
资料
- 官方Flink 1.12中文版Table API&SQL文档地址
架构
- 1.9版本Blink是阿里提供,Flink 1.12默认Blink实现Tabel API和SQL功能。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RQGfbmaJ-1623385080236)(./…/img/flink/flink-tableApi-sql.png)]
优势
- 声明式:用户只关心做什么,不用关心怎么做。
- 高性能:支持查询优化,可以获得更好的执行性能。
- 流批统一:相同的统计逻辑,既可以流模式运行,也可以批模式运行。
- 标准稳定:语义遵循SQL标准,不易变动。
- 易理解:语义明确,所见即所得。
maven导包
tabel API和SQL
- 针对java和scala语言导入不同包。
<!-- java -->
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-api-java-bridge_2.11</artifactId>
<version>1.12.3</version>
<scope>provided</scope>
</dependency>
<!-- scala -->
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-api-scala-bridge_2.11</artifactId>
<version>1.12.3</version>
<scope>provided</scope>
</dependency>
本地环境配置
- 如果需要在 IDE 本地运行测试程序,需要添加以下模块,具体用哪个取决使用哪个的引擎是 Flink 还是 Blink 。
<!-- flink引擎,1.9版本前默认 -->
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-planner_2.11</artifactId>
<version>1.12.3</version>
<scope>provided</scope>
</dependency>
<!-- Blink 当前默认引擎 -->
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-planner-blink_2.11</artifactId>
<version>1.12.3</version>
<scope>provided</scope>
</dependency>
优化
stream支持scala
- 内部实现上,部分 table 相关代码使用 Scala 开发。不管批式或流式程序,必须添加如下依赖。
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-scala_2.11</artifactId>
<version>1.12.3</version>
<scope>provided</scope>
</dependency>
支持自定义格式或函数
- 如果需要实现自定义格式解析 Kafka 数据,或者自定义函数处理业务,需要添加如下依赖。
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-common</artifactId>
<version>1.12.3</version>
<scope>provided</scope>
</dependency>
程序结构
Blink(新)和flink(旧)计划器区别
- Blink 将批处理作业视作流处理的一种特例。Table 和 DataSet 之间不支持相互转换,并且批处理作业也不会转换成 DataSet 程序而是转换成 DataStream 程序,流处理作业也一样。
- Blink 计划器不支持 BatchTableSource,而是使用有界的 StreamTableSource 来替代。
- 旧计划器和 Blink 计划器中 FilterableTableSource 的实现是不兼容的。旧计划器会将 PlannerExpression 下推至 FilterableTableSource,而 Blink 计划器则是将 Expression 下推。
- 基于字符串的键值配置选项仅在 Blink 计划器中使用。(详情参见 配置 )
- PlannerConfig 在两种计划器中的实现(CalciteConfig)是不同的。
- Blink 计划器会将多sink(multiple-sinks)优化成一张有向无环图(DAG),TableEnvironment 和 StreamTableEnvironment 都支持该特性。旧计划器总是将每个sink都优化成一个新的有向无环图,且所有图相互独立。
- 旧计划器目前不支持 catalog 统计数据,而 Blink 支持
程序结构
- 用于批处理和流处理的 Table API 和 SQL 程序都遵循相同的模式,先创建TableEnvironment,再创建表,继续通过 Table API 或 SQL 操作表,实现业务功能,实例代码如下:
// 创建一个TableEnvironment执行流或批处理
TableEnvironment tableEnv = ...;
// 创建输入表
tableEnv.executeSql("CREATE TEMPORARY TABLE table1 ... WITH ( 'connector' = ... )");
// 创建输出表
tableEnv.executeSql("CREATE TEMPORARY TABLE outputTable ... WITH ( 'connector' = ... )");
// 使用 Table API 执行查询操作
Table table2 = tableEnv.from("table1").select(...);
// 使用 SQL 执行查询操作
Table table3 = tableEnv.sqlQuery("SELECT ... FROM table1 ... ");
// 使用 Table API 获取结果数据
TableResult tableResult = table2.executeInsert("outputTable");
tableResult...
总结
- Table 和 SQL 功能的加入,简化了Flink开发难度,懂 Sql 就能开发自己需要的功能。
- 兴趣是最好的老师,日常除了工作,维护好心底的热情,工作和兴趣分别对待,时刻保持活力。