Flink动态表的连续查询动态表的连续查询
越来越多的公司采用流处理,并将现有的批处理应用迁移到流处理,或者对新的用例采用流处理实现的解决方案。其中许多应
用集中在流数据分析上,分析的数据流来自各种源,例如数据库事务、点击、传感器测量或 IoT 设备。
Apache Flink 非常适用于流分析应用程序,因为它支持事件时间语义,确保只处理一次,以及同时实现了高吞吐量和低延迟。
因为这些特性,Flink 能够近实时对大量的输入数据计算出一个确定和精确的结果,并且在发生故障的时候提供一次性语义。
Flink 的核心流处理 API,DataStream API,非常具有表现力,并且为许多常见操作提供了原语。在其他特性中,它提供了高
度可定制的窗口逻辑,不同表现特征下的不同状态原语,注册和响应定时器的钩子,以及高效的异步请求外部系统的工具。另
一方面,许多流分析应用遵循相似的模式,并不需要 DataStream API 提供的表现力级别。他们可以使用领域特定的语言来使
用更自然和简洁的方式表达。众所周知,SQL 是数据分析的事实标准。对于流分析,SQL 可以让更多的人在数据流的特定应
用中花费更少的时间。然而,目前还没有开源的流处理器提供令人满意的 SQL 支持。
为什么流中的 SQL 很重要
SQL 是数据分析使用最广泛的语言,有很多原因:
SQL 是声明式的:你指定你想要的东西,而不是如何去计算;
SQL 可以进行有效的优化:优化器计估算有效的计划来计算结果;
SQL 可以进行有效的评估:处理引擎准确的知道计算内容,以及如何有效的执行;
最后,所有人都知道的,许多工具都理解 SQL。
因此,使用 SQL 处理和分析数据流,可以为更多人提供流处理技术。此外,因为 SQL 的声明性质和潜在的自动优化,它可以
大大减少定义高效流分析应用的时间和精力。
但是,SQL(以及关系数据模型和代数)并不是为流数据设计的。关系是(多)集合而不是无限序列的元组。当执行 SQL 查
询时,传统数据库系统和查询引擎读取和处理完整的可用数据集,并产生固定大小的结果。相比之下,数据流持续提供新的记
录,使数据随着时间到达。因此,流查询需要不断的处理到达的数据,从来都不是“完整的”。
话虽如此,使用 SQL 处理流并不是不可能的。一些关系型数据库系统维护了物化视图,类似于在流数据中评估 SQL 查询。物
化视图被定义为一个 SQL 查询,就像常规(虚拟)视图一样。但是,查询的结果实际上被保存(或者是物化)在内存或硬盘
中,这样视图在查询时不需要实时计算。为了防止物化视图的数据过时,数据库系统需要在其基础关系(定义的 SQL 查询引
用的表)被修改时更新更新视图。如果我们将视图的基础关系修改视作修改流(或者是更改日志流),物化视图的维护和流中
的 SQL 的关系就变得很明确了。
Flink 的关系 API:Table API 和 SQL