泰拳-Flink SQL 系列 | 5 个 TableEnvironment 我该用哪个?

本文为 Flink SQL 系列文章的第二篇,前面临 Flink 1.9 Table 新架构及 Planner 的运用进行了详细阐明,本文详细解说 5 个 TableEnvironment 及其适用场景,并介绍 Flink 社区对 TableEnvironment 的未来规划。首要内容如下:

  1. TableEnvironment 简介
  2. 5 个 TableEnvironment 整理
  3. 怎么运用 TableEnvironment
  4. 社区未来规划

1. TableEnvironment 简介

TableEnvironment 是用来创立 泰拳-Flink SQL 系列 | 5 个 TableEnvironment 我该用哪个?Table & SQL 程序的上下文履行环境 ,也是 Table & SQL 程序的进口,Table & SQL 程序的一切功用都是环绕 TableEnvironment 这个中心类打开的。TableEnvironment 的首要功用包含:对接外部体系,表及元数据的注册和检索,履行SQL句子,供给更详细的装备选项。

在 Flink 1.8 中,一共有 7 个 TableEnvironment ,在最新的 Flink 1.9 中,社区进行了重构和优化,只保留了 5 个TableEnvironment 。本文详细解说 泰拳-Flink SQL 系列 | 5 个 TableEnvironment 我该用哪个?5 个 TableEnvironment 及其适用场景,并介绍 Flink 社区对 TableEnvironment 的未来规划。

2. 5 个 TableEnvironment 整理

Flink 1.9 中保留了 5 个 TableEnvironment,在完成上是 5 个面向用户的接口,在接口底层进行了不同的完成。5 个接口包含一个 TableEnvironment 接口,两个 BatchTableEnvironment 接口,两个 StreamTableEnvironment 接口,5 个接口文件完好途径如下:

  • org/apache/flink/table/api/TableEnvironment.java
  • org/apache/flink/table/api/java/BatchTableEnvironment.java
  • org/apache/flink/table/api/scala/BatchTableEnvironment.scala
  • org/apache/flink/table/api/java/StreamTableEnvironment.java
  • org/apache/flink/table/api/scala/StreamTableEnvironment.scala

结合文件的途径,整理这 5 个接口,咱们会发现 TableEnvironment 是尖端接口,是一切 TableEnvironment 的基类 ,BatchTableEnvironment 和 StreamTableEnvironment 都供给了 Java 完成和 Scala 完成 ,别离有两个接口。

5 个 TableEnvironment

其间,TableEnvironment 作为一致的接口,其一致性体现在两个方面,一是关于一切依据JVM的言语(即 Scala API 和 Java API 之间没有差异)是一致的;二是关于 unbounded data (无界数据,即流数据) 和 bounded data (有界数据,即批数据)的处理是一致的。TableEnvironment 供给的是一个纯 Table 生态的上下文环境,适用于整个作业都运用 Table API & SQL 编写程序的场景。TableEnvironment 现在还不支撑注册 UDTF 和 UDAF,用户有注册 UDTF 和 UDAF 的需求时,能够挑选运用其他 TableEnvironment。

两个 StreamTableEnvironment 别离用于 Java 的流核算和 Scala 的流核算场景,流核算的目标别离是 Java 的 DataStream 和 Scala 的 DataStream。比较 TableEnvironment,St泰拳-Flink SQL 系列 | 5 个 TableEnvironment 我该用哪个?reamTableEnv泰拳-Flink SQL 系列 | 5 个 TableEnvironment 我该用哪个?ironment 供给了 DataStream 和 Table 之间彼此转化的接口,假如用户的程序除了运用 Table API & SQL 编写外,还需求运用到 DataStream API,则需求运用 StreamTableEnvironment。

两个 BatchTableEnvironment 别离用于 Java 的批处理场景和 Scala 的批处理场景,批处理的目标别离是 Java 的 DataSet 和 Scala 的 DataSet。比较 TableEnvironment,BatchTableEnvironment 供给了 DataSet 和 Ta许晴女儿ble 之间彼此转化的接口,假如用户的程序除了运用 Table API & SQL 编写外,还需求运用到 DataSet API,则需求运用 BatchTableEnvironment。

从这五个 TableEnvironment 支撑的作业类型 ( Stream 作业和 Batch 作业),支撑的 API 类型(DataStream API 和 DataSet API),以及对 UDTF/UDAF 的支撑这 5 个方面进行比照,各个TableEnvironment 支撑的功用能够归纳如下:

TableEnvironment 支撑功用比照

或许咱们会疑问为什么在 API 需求区别 Java 和 Scala 的两个 StreamTableEnvironment(或BatchTableEnvironment ),运用的 DataStream也分为 Java DataStream 和 Scala DataStream。

原因首要是 TableEnvironment 的 registerTableFunction办法(用于注册UDTF) 和 registerAggregateFunction 办法(用户注册UDAF) 需求抽取泛型,而现有的 Java 泛型抽取和 Scala 的泛型抽取机制是不一样的,Java 的抽取是经过反射机制 完成,而 Scala 是经过 Scala macro 完成。此外,由于抽取泛型机制的不一致,作为一致进口的 TableEnvironment 现阶段也不支撑注册 UDTF 和 UDAF。针对这个问题,社区现已在方案引进一套新的类型抽取机制来一致 Java 和 Scala 的类型抽取,完成 Java API 和 Scala API 的一致。

5 个 TableEnvironment 详细完成

结合 Flink planner 和 Blink planner, 进一步整理 TableEnvironment 的组织关系,咱们能够注意到一些风趣的细节:

  • 完成流批一致的 Blink泰拳-Flink SQL 系列 | 5 个 TableEnvironment 我该用哪个? planner 中由于没有了 DataSet 的概念,现已不再运用 BatchTableEnvironment,只会运用 TableEnvironment 和 StreamTableEnvironment,而 Flink planner(即 Old planner) 则支撑 5 个 TableEnvironment。
  • BatchTableEnvironment 的完成都放到了 Old planner (flink-table-palnner模块) 中,这个模块在社区的未来规划中是会被逐渐删去的。

3. 怎么运用 TableEnvironment

依据用户运用的 planner 和作业的类型,能够把各个 TableEnvironment 的运用场景分为 4 类,下面结合代码来阐明在不同的场景下怎么运用 TableEnvironment 。

场景一:

用户运用 Old planner,进行流核算的 Table 程序(运用 Table API 或 SQL 进行开发的程序 )的开发。这种场景下,用户能够运用 StreamTableEnvironment 或 TableEnvironment ,两者的差异是 StreamTableEnvironment 额定供给了与 DataStream API 交互的接口。示例代码如下:

场景二:

用户运用 Old planner,进行批处理的 Table 程序的开发。这种场景下,用户只能运用 BatchTableEnvironment ,由于在运用 Old planner 时,批处理程序操作的数据是 DataSet,只要 BatchTableEnvironment 供给了面向DataSet 的接口完成。示例代码如下:

场景三:

用户运用 Blink planner,进行流核算的 Table 程序的开发。这种场景下,用户能够运用 StreamTableEnvironment 或 TableEnvironment ,两者的差异是 StreamTableEnvironment 额定供给与 DataStream API 交互的接口。用户在 EnvironmentSettings 中声明运用 Blink planner ,将履行形式设置为 StreamingMode 即可。示例代码如下:

场景四:

用户运用 Blink planner,进行批处理的 Table 程序的开发。这种场景下,用户只能运用 TableEnvironment ,由于在运用 Blink planner 时,批处理程序操作的数据现已是 bounded DataStream,所以不能运用 BatchTableEnvironment 。用户在 EnvironmentSettings 中声明运用 Blink planner ,将履行形式设置为 BatchMode 即可。值得注意的是,TableEnvironment 接口的详细完成中现已支撑了 StreamingMode 和 BatchMode 两种形式,而 StreamTableEnvironment 接口的详细完成中现在暂不支撑 BatchMode 的装备,所以这种场景不能运用 StreamTableEnvironment。示例代码如下:

4. 社区未来规划

现在,社区正在推进 DataStream 的批处理才能,以完成流批技能栈的一致,到时 DataSet API 会退出前史的舞台,两个 BatchTableEnvironment 也将退出前史的舞台。一起社区也在尽力推进 Java 和 Scala TableEnvironment 的一致。能够预见的是,Flink TableEnvironment 的未来架构会愈加简练。TableEnvironment 会是 Flink 引荐运用的进口类,一起能支撑 Java API 和 Scala API,还能一起支撑流核算作业和批处理作业。只要当需求与 DataStream 做转化时,才需求用到 StreamTableEnvironment。

-----------------------------

本文作者:徐榜江(雪尽)

原文链接:https://yq.aliyun.com/article泰拳-Flink SQL 系列 | 5 个 TableEnvironment 我该用哪个?s/719760?utm_content=g_1000079875

本文为云栖社区原创内容,未经答应不得转载。