flink(九):Table&Sql环境搭建和程序结构

说明

  • 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)的输入有相同的语义,也会产生同样的计算结果。

资料

架构

  • 1.9版本Blink是阿里提供,Flink 1.12默认Blink实现Tabel API和SQL功能。

优势

  • 声明式:用户只关心做什么,不用关心怎么做。
  • 高性能:支持查询优化,可以获得更好的执行性能。
  • 流批统一:相同的统计逻辑,既可以流模式运行,也可以批模式运行。
  • 标准稳定:语义遵循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(旧)计划器区别

  1. Blink 将批处理作业视作流处理的一种特例。Table 和 DataSet 之间不支持相互转换,并且批处理作业也不会转换成 DataSet 程序而是转换成 DataStream 程序,流处理作业也一样。
  2. Blink 计划器不支持 BatchTableSource,而是使用有界的 StreamTableSource 来替代。
  3. 旧计划器和 Blink 计划器中 FilterableTableSource 的实现是不兼容的。旧计划器会将 PlannerExpression 下推至 FilterableTableSource,而 Blink 计划器则是将 Expression 下推。
  4. 基于字符串的键值配置选项仅在 Blink 计划器中使用。(详情参见 配置 )
  5. PlannerConfig 在两种计划器中的实现(CalciteConfig)是不同的。
  6. Blink 计划器会将多sink(multiple-sinks)优化成一张有向无环图(DAG),TableEnvironment 和 StreamTableEnvironment 都支持该特性。旧计划器总是将每个sink都优化成一个新的有向无环图,且所有图相互独立。
  7. 旧计划器目前不支持 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 就能开发自己需要的功能。
  • 兴趣是最好的老师,日常除了工作,维护好心底的热情,工作和兴趣分别对待,时刻保持活力。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章