flink-sql(流批统一)

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
简介: 流体统一架构演进理解动态表和连续查询动态表转换为数据流三种数据流:仅追加流append-only,撤回流Retract,更新插入流 upsert

流批统一分析与问题


为了了避免批处理理和流处理理维护两套代码,Flink社区⼀一直试图在【批处理理是流处理理的⼀一个特例例】的思想指引下从底层     架构层⾯面实现流批统⼀一,上层通过SQL的⽀支持统⼀一编程模型,但是整个过程是曲折的,最初架构如下:


image.png

上述架构中上层SQL⽀持的不好,底层也存在诸多问题:


  • 从Flink⽤户⻆度


  1. 开发的时候,Flink SQL⽀持的不好,就需要在两个底层API中进⾏选择,甚⾄维护两套代码 不同的语义、
  2. 不同的connector⽀持、不同的错误恢复策略…
  3. Table API也会受不同的底层API、不同的connector等问题的影响


  • 从Flink开发者⻆度


  1. 不同的翻译流程,不同的算⼦实现、不同的Task执⾏…
  2. 代码难以复⽤
  3. 两条独⽴的技术栈需要更多⼈⼒功能开发变慢、性能提升变难,bug变多


流批统一架构演进

阿⾥⼀直是Flink的忠实⽤户和贡献者,⼀度在内部维护了⼀套⾃⼰的Flink衍⽣版本,就是所谓的Blink,其主要的 改进就是流批统⼀。


Bink最初的想法就是:既然批是流的⼀个特例,是否可以统一?


Blink本身就在做去DataSet的⼯作,在 Blink 捐赠给 Apache Flink 之后,社区就致⼒于为 Table API 和 SQL 集成 Blink 的查询优化器和 runtime。第⼀步,我们将 flink-table 单模块重构成了多个⼩模块(FLIP-32)。这对于 Java 和 Scala API 模块、优化器、以及 runtime 模块来说,有了⼀个更清晰的分层和定义明确的接⼝。


image.png

紧接着,社区扩展了 Blink 的 planner 以实现新的优化器接⼝,所以现在有两个插件化的查询处理器来执⾏ Table API 和 SQL:1.9 以前的 Flink 处理器和新的基于 Blink 的处理器。基于 Blink 的查询处理器提供了更好地 SQL 覆盖 率(1.9 完整⽀持 TPC-H,TPC-DS 的⽀持在下⼀个版本的计划中)并通过更⼴泛的查询优化(基于成本的执⾏计 划选择和更多的优化规则)、改进的代码⽣成机制、和调优过的算⼦实现来提升批处理查询的性能。除此之外,基 于 Blink 的查询处理器还提供了更强⼤的流处理能⼒,包括⼀些社区期待已久的新功能(如维表 Join,TopN,去 重)和聚合场景缓解数据倾斜的优化,以及内置更多常⽤的函数。



image.png


注意:Flink1.12之前的版本,Table API和SQL处于活跃开发阶段,并没有实现流批统⼀的所有特性,所以使⽤的时 候需要慎重

注意:从Flink1.12开始,Table API和SQL就已经成熟了,可以在⽣产上放⼼使⽤

下图是Flink Table API/SQL的执⾏过程:

image.png


理解动态表和连续查询


为了在流处理上使⽤关系代数(Table API/SQL),Flink引⼊了动态表(Dynamic Tables)的概念。 因为流处理⾯对的数据是⽆界数据流,这和我们熟悉的关系型数据库中保存的“表” 完全不同,所以⼀个设想就是把 数据流转换成 Table,然后执⾏SQL操作,但是SQL的执⾏结果就不是⼀成不变的,⽽是随着新数据的到来不断更 新的。 可以随着新数据的到来,不断在之前的结果上更新,这样得到的表,在 Flink Table API 概念⾥,就叫做“动态 表”(Dynamic Tables)。


动态表是 Flink 对流数据的 Table API 和 SQL ⽀持的核⼼概念。与表示批处理数据的静态 表不同,动态表是随时间 变化的。动态表可以像静态的批处理表⼀样进⾏查询,查询⼀个动 态表会产⽣持续查询(Continuous Query)。 连续查询永远不会终⽌,并会⽣成另⼀个动态表。 查询(Query)会不断更新其动态结果表,以反映其动态输⼊表 上的更改。


image.png



上图是在数据流上执⾏关系查询时数据流与动态表的转换关系图,主要步骤如下:

  1. 将数据流转换为动态表
  2. 在动态表上进⾏连续查询,并⽣成新的动态表
  3. ⽣成的动态表再转换为新的数据流


动态表

这⾥以⼀个如下schema的点击事件流查询来帮助⼤家理解动态表和连续查询的概念:


CREATE TABLE clicks (
 user VARCHAR, -- ⽤户名
 url VARCHAR, -- ⽤户访问的URL
 cTime TIMESTAMP(3) -- 访问时间
) WITH (...);

为了执⾏关系查询,⾸先得把数据流转换为动态表。下图左侧为点击流,右侧为动态表,流上的新增事件都会对应 动态表上的insert操作


image.png


连续查询



接下来,我们在动态表上执⾏连续查询⽣成⼀个新的动态表(结果表),连续查询不会停⽌,它会根据输⼊表新数 据的到来不断查询计算并更新结果表


image.png


在上图中,我们在click动态表上执⾏了group by count聚合查询,随着时间推移,右边动态结果表随着左测输⼊表 每条数据的变化⽽变化。


image.png



上图稍微复杂⼀些,group by count聚合,另外还加⼊了⼀个翻滚窗⼝,统计1⼩时翻滚窗⼝内每个⽤户的访问次 数。随着时间推移,右边动态结果表随着左测输⼊表数据的变化⽽变化,但是每个窗⼝的结果是独⽴的,且计算是 在每个窗⼝结束时才触发的。



动态表转换数据流




与常规的数据库表⼀样,动态表可以通过插⼊(Insert)、更新(Update)和删除(Delete) 更改,进⾏持续的 修改。将动态表转换为流或将其写⼊外部系统时,需要对这些更改进⾏编 码。Flink 的 Table API 和 SQL ⽀持三种 ⽅式对动态表的更改进⾏编码:



1)仅追加流(Append-only stream,即insert-only)


仅通过插⼊INSERT更改来修改的动态表,可以直接转换为“仅追加”流。这个流中发出的数据就是动态表中新增的每 ⼀个事件。

2)撤回流(Retract stream)

插⼊、更新、删除都⽀持的动态表会转换为撤回流。

撤回流包含两类消息:添加(Add)消息和撤回(Retract)消息。

动态表通过将 INSERT 编码为 add 消息、DELETE 编码为 retract 消息、UPDATE 编码为被更改⾏(更改前)的 retract 消息和更新后⾏(新⾏)的 add 消息,转换为 retract 流。


下图显示了将动态表转换为 Retract 流的过程:


image.png


3)更新插⼊流(Upsert流)

Upsert 流包含两种类型的消息:Upsert 消息和 delete 消息。

转换为 upsert 流的动态表, 需要有唯⼀的键 (key)。 通过将 INSERT 和 UPDATE 更改编码为 upsert 消息,将 DELETE 更改编码为 DELETE 消息, 就可以将具有唯⼀键 (Unique Key)的动态表转换为流。

下图显示了将动态表转换为  upsert 流的过程:


image.png






相关实践学习
基于Hologres轻松玩转一站式实时仓库
本场景介绍如何利用阿里云MaxCompute、实时计算Flink和交互式分析服务Hologres开发离线、实时数据融合分析的数据大屏应用。
Linux入门到精通
本套课程是从入门开始的Linux学习课程,适合初学者阅读。由浅入深案例丰富,通俗易懂。主要涉及基础的系统操作以及工作中常用的各种服务软件的应用、部署和优化。即使是零基础的学员,只要能够坚持把所有章节都学完,也一定会受益匪浅。
相关文章
|
7月前
|
SQL Kubernetes 调度
Flink 流批一体在模型特征场景的使用
本文整理自B站资深开发工程师张杨老师在 Flink Forward Asia 2023 中 AI 特征工程专场中的分享。
77723 5
Flink 流批一体在模型特征场景的使用
|
3月前
|
消息中间件 资源调度 API
Apache Flink 流批融合技术介绍
本文源自阿里云高级研发工程师周云峰在Apache Asia Community OverCode 2024的分享,内容涵盖从“流批一体”到“流批融合”的演进、技术解决方案及社区进展。流批一体已在API、算子和引擎层面实现统一,但用户仍需手动配置作业模式。流批融合旨在通过动态调整优化策略,自动适应不同场景需求。文章详细介绍了如何通过量化指标(如isProcessingBacklog和isInsertOnly)实现这一目标,并展示了针对不同场景的具体优化措施。此外,还概述了社区当前进展及未来规划,包括将优化方案推向Flink社区、动态调整算子流程结构等。
433 31
Apache Flink 流批融合技术介绍
|
6月前
|
分布式计算 Serverless 调度
EMR Serverless Spark:结合实时计算 Flink 基于 Paimon 实现流批一体
本文演示了使用实时计算 Flink 版和 Serverless Spark 产品快速构建 Paimon 数据湖分析的流程,包括数据入湖 OSS、交互式查询,以及离线Compact。Serverless Spark完全兼容Paimon,通过内置的DLF的元数据实现了和其余云产品如实时计算Flink版的元数据互通,形成了完整的流批一体的解决方案。同时支持灵活的作业运行方式和参数配置,能够满足实时分析、生产调度等多项需求。
60824 107
|
6月前
|
SQL 搜索推荐 OLAP
Flink 流批一体场景应用及落地情况
本文由阿里云 Flink 团队苏轩楠老师撰写,旨在介绍 Flink 流批一体在几个常见场景下的应用。
68100 11
Flink 流批一体场景应用及落地情况
|
7月前
|
存储 SQL API
读Flink源码谈设计:流批一体的实现与现状
在Dataflow相关的论文发表前,大家都往往认为需要两套API来实现流计算和批计算,典型的实现便是Lambda架构。
632 0
|
7月前
|
消息中间件 Kafka API
2021年最新最全Flink系列教程_Flink原理初探和流批一体API(二.五)
2021年最新最全Flink系列教程_Flink原理初探和流批一体API(二.五)
71 0
|
7月前
|
消息中间件 关系型数据库 MySQL
2021年最新最全Flink系列教程_Flink原理初探和流批一体API(二)
2021年最新最全Flink系列教程_Flink原理初探和流批一体API(二)
152 0
|
SQL 存储 分布式计算
Flink 流批一体在 Shopee 的大规模实践
Shopee 研发专家李明昆在 Flink Forward Asia 2022 流批一体专场的分享。
10327 0
Flink 流批一体在 Shopee 的大规模实践
|
消息中间件 存储 关系型数据库
Flink 流批一体方案在数禾的实践
上海数⽲信息科技有限公司⼤数据架构师杨涵冰,在 Flink Forward Asia 2022 流批一体专场的分享。
Flink 流批一体方案在数禾的实践
|
SQL 存储 消息中间件
Hive SQL on Flink 构建流批一体引擎
阿里巴巴开发工程师罗宇侠&方盛凯,在 Flink Forward Asia 2022 流批一体专场的分享。
19149 3