本文整理自阿里云的高级技术专家、Apache Flink PMC 成员李麟老师在 Flink Forward Asia 2025 新加坡[1]站 —— 实时 AI 专场中的分享。将带来关于 Flink 2.1 版本中 SQL 在实时数据处理和 AI 方面进展的话题。


Tips:点击「阅读原文」跳转阿里云实时计算 Flink~

Flink 2.1 SQL 的关键进展

本篇将探讨三个部分:

Data + AI:在 Flink SQL 中连接实时数据处理与AI能力

首先,将介绍 Flink SQL 2.1 如何连接实时数据处理与AI能力。您将看到我们如何增强对 AI 函数的支持,从模型注册到通过 ML_PREDICT 与 SQL 的无缝集成,支持大模型文本生成和RAG工作流等任务。

优化 Join:解决 Flink 流式 Join 中的关键挑战

接下来,了解一下解决流式连接中的一个关键挑战。深入探讨两个关键改进:Delta Join,通过结合索引和变更日志处理来消除状态存储;以及 Multi-way Join,在保持低延迟的同时减少多流连接中的冗余。

未来展望:Flink SQL 在数据与 AI 方面的持续增强和路线图

最后,将分享未来的路线图,包括 RAG 管道中的向量搜索支持和扩展的AI函数支持。

接下来我将展示 Flink 2.1 如何让您无缝构建可扩展的实时 AI 管道。在深入 Flink AI 函数之前,让我们先从一个现实世界的问题开始。

案例:实时产品合规性

想象一下您正在运营一个全球电商平台。平台卖家每天会发布数百万个产品。但问题是:您需要确保每一个产品发布都符合您运营的每个国家的当地法律。

例如,一个标题为"含微量酒精的葡萄汁饮料"的产品在特定国家违反了政策,因为它包含"酒精"。

目前,团队使用 Flink SQL 构建管道来帮助人工审核:

  1. 首先从 Kafka 主题读取产品列表数据

  2. 使用自定义 UDF 如 keyword_match,根据禁用关键词列表检查标题

  3. 输出风险列表供人工审核

但问题是——基于规则的系统非常僵化。

基于规则的关键词匹配的挑战:误报和漏报

好的,让我们看两个基于规则的关键词匹配失败的具体例子。

案例1:过度阻拦案例(误报)

想象一个标题为"葡萄汁(无酒精)"的产品。关键词"酒精"触发了规则,系统将其标记为风险。但它明确说了"无酒精"!这是一个误报——我们阻拦了一个安全的产品,浪费了人工审核时间,并可能导致客户不满。

案例2:阻拦不足案例(漏报)

现在,看看这个标题:"天然香草提取物"。我们的关键词列表包括"酒精"和"酒",但香草提取物通常含有酒精!规则完全遗漏了它——这是一个漏报。这可能导致严重的处罚。

那么...我们如何解决这个问题?这就需要比关键词匹配更智能的检测能力。

利用AI的语义分析实现更智能的合规性

让我们测试一下 AI 是否更优秀。这里有一个 ChatGPT 的简单例子——这可以是您训练的任何 LLM 或自定义模型。

步骤1:教AI任务

我们给模型一个清晰的提示,包括角色、规则和示例。

步骤2:用我们的问题案例测试

当我们输入棘手的"天然香草提取物"案例时,AI推导出它"含有酒精"。这正是我们需要的。

现在,让我们尝试将其集成到 UDF 中。

Flink 自定义 AI UDF 的隐性成本

我们构建了一个直接连接到 LLM 的新 UDF,管道看起来几乎和以前一样。相同的流程:

  1. Kafka 输入(产品标题流入)

  2. 升级到新 UDF 后,决策现在更加智能

  3. Kafka 输出(结果进入相同的审核主题——下游无需更改)

看起来完美...但是等等。

虽然这对小规模测试有效,但现实的挑战很快就会出现。

构建自定义 LLM UDF一开始感觉很棒,但现实情况是

  1. 代码重写:如果我们想从 OpenAI 切换到阿里云,我们需要重写 UDF 代码。测试不同的模型?更多的代码更改。这种方法无法扩展。每次新模型或 API 更改时重写 UD F代码是不高效的。

  2. 同步请求 = 交通堵塞:每个产品标题都会触发对 LLM 的同步 API 调用。每次调用需要1-3秒——那么吞吐量将非常低。所以如果我们想要使用异步请求获得更高的吞吐量,我们需要通过使用 AsyncScalarFunction 再次重写 UDF。现在我们应该更多地关注异步回调和错误处理。这不有趣,必须有更好的方法。

让我们看看 Flink 2.1 如何解决这个问题。

Apache Flink SQL 原生 AI 函数:简化AI集成

以下是利用 Flink SQL 原生 AI 函数的工作流程:

使用 CREATE MODEL 通过简单的 SQL 命令注册需要的 LLM。需要切换模型?只需更改 MODEL 参数——无需重写代码。模型管理变得如此简单。

Flink 2.1 中的新 ML_PREDICT()函数已为这些用例做好准备:

  1. 聊天/生成式任务:对于产品合规性检查、情感分析等场景,只需将文本传递给模型,它就会返回分析结果。

  2. embedding:进行特征提取,通过从文本生成向量嵌入来为您的 RAG 管道提供支持。

一切都直接在 SQL 中工作。启用异步处理:只需添加一个简单的参数。切换模型:在 SQL 查询中引用 MODEL名称,无需 UDF 代码更改。

使用 Flink SQL AI 函数的实时产品合规性:具体示例

让我们通过一个具体的示例将所有内容整合在一起。以下是 Flink AI 函数如何解决我们的产品合规性挑战:

首先,我们使用 CREATE MODEL 语法创建一个合规性模型——需要指定提供商(这里是阿里云的百炼平台)、模型名称 qwen-turbo,以及告诉AI其作为产品列表审核专家角色的系统提示。

当像"天然香草提取物"这样的产品标题到达时,Flink 通过 ML_PREDICT 函数将其发送到 AI 模型。这是一个异步请求以确保高吞吐量。模型分析它并返回 JSON 响应。

最后,当 risk_rate超过定义的阈值时,我们将结果插入风险输出 topic。

优化 Flink SQL AI 函数:异步调优和资源规划以提升性能

让我们深入了解两个关键优化:异步配置和资源设置。

  1. 异步执行是首选:在 ML_PREDICT()调用中启用异步执行可以是首选。与增加任务并行度相比,这更具成本效益。对于仅追加的流,使用 allow_unordered output_mode,这样 Flink 可以处理得更快。设置 max-concurrent-operations 以匹配您的 LLM 容量。如果您不想触发任务失败,可以将异步超时参数设置得比 AI 的最大延迟更大。有关异步操作的更多详细信息,请参考 Flink文档[2]。

  2. 基于 Little 定律进行资源规划:应用此公式进行容量规划:

  • L:队列槽位(对应 max-concurrent-operations

  • λ:请求速率(对应预期的 QPS)

  • W:平均延迟(对应模型的响应时间)

例如:对于目标100 QPS和1.2秒的99百分位延迟,我们需要120个最大并发请求(max-concurrent-operations)。此外,考虑到队列长度和平均行大小,我们需要更多关注 TaskManager 中的内存设置。适当的调优可能显著提升运行 AI 函数的吞吐量和稳定性。

JSON 无处不在:从大数据到AI工作流

在深入了解 Join 之前,先聊一聊一个基础的数据类型:JSON。

让我们从一个简单的事实开始:JSON 无处不在。从传统数据管道到新的 AI 工作流,JSON 是表示结构化和半结构化数据的重要格式。我们在事件日志、搜索文档、API 负载中看到它。RAG 管道依赖 JSON 来存储和查询文档。甚至 LLM 提示和输出通常也格式化为 JSON。

到目前为止,Flink SQL 已经支持许多内置的 JSON 函数。但随着 JSON 变得更深入和更动态,这里有一个性能挑战。

过去 Flink 中 JSON 解析的隐性成本

表面上,JSON_VALUE 和类似的函数使得访问 JSON 字符串内的数据变得容易。但在底层,每次调用都会触发完整的 JSON 解析。每次都是如此,对每一行都是如此。这对简单情况可能工作得很好,但在处理大型数据集、嵌套结构或深度查询路径时——比如 JSON 路径 $.metadata.device——性能会快速下降。

没有 schema 感知,JSON 内部没有索引,所以 SQL 优化器无法优化访问。

Flink SQL 的新 VARIANT 类型:高效的半结构化数据处理

Flink 2.1 引入了新的 VARIANT 类型,这是一个原生的、二进制编码的半结构化类型。与普通的 JSON 字符串不同,VARIANT以结构化方式存储元数据和值。因此访问 data.metadata.device 只是一个直接的偏移查找,不再是完整的解析。

因为它是感知 schema 的,SQL 规划器可以在未来版本中应用查询优化。这使其非常适合数据管道。VARIANT为大规模处理 JSON 解锁了性能和灵活性。了解更多关于 Flink VARIANT 类型[3]的信息。

优化连接:解决 Flink 流处理中的关键挑战

现在让我们转向流式连接,这是实时处理中的另一个核心挑战。Flink SQL 支持丰富的连接类型:Regular Join、Interval Join、Temporal Join、Lookup Join 等等。每种都是为特定用例设计的。其中,regular join 是最直观的——它看起来完全像传统的 SQL 连接,使其易于编写和理解。

Flink 流式连接的限制:大规模可扩展性

让我们看看 Regular Join 是如何工作的:我们有两个输入流:页面浏览和订单从 Kafka 到达,它们将通过 product_id 列实现 Join。Join 操作符有两个状态存储,左状态和右状态,都按 product_id 分组存储。当新事件到达时,Flink 在对端的状态表中查找匹配的条目,执行连接逻辑并输出。

Regular Join 严重依赖 Flink 的状态后端来缓冲输入流。当正确使用时,这提供了高吞吐量和低延迟,特别是对于小到中等大小的数据流。但随着流大小的增长,Regular Join 开始出现问题。连接节点每一侧维护的状态变得越来越大。最终,这导致状态访问缓慢、检查点时间长和恢复时间长。您可能开始看到延迟峰值、背压,甚至检查点失败。这是一个经典的权衡——简单性和灵活性以可扩展性为代价。

那么我们如何解决  Regular Join 的大状态问题呢?

Delta Join:无状态 Join 的全新范式

这就是 Delta Join 的用武之地——它带来了一种截然不同的设计思路。与传统 Join 方式将所有数据缓存在 Flink 状态后端不同,Delta Join 转而依赖外部存储系统(例如基于 RocksDB 构建的  Apache Fluss),将数据存于外部,实现真正的无状态计算。

其工作原理如下:

Fluss 会持续发送变更日志(changelog)更新,确保 Join 数据始终最新。每当有新事件到达时,Delta Join 只需在 Fluss 中执行一次索引查询——就像访问一个键值存储(key-value store)一样简单高效。

可以看到,现在的 Delta Join 已经完全无状态。此前困扰流处理的各种“大状态”问题也随之消失。这使得过去难以实现的大规模 Join 任务,如今成为可能。

Delta Join 实战表现:真实场景下的性能飞跃

在生产环境中的实际表现印证了 Delta Join 的巨大价值。

传统的流式 Join 在数据规模扩大后迅速变得难以维系:状态体积膨胀至 100TB 以上,检查点耗时极长,故障恢复复杂且耗时。而通过 Delta Join,我们将状态外卸至 Fluss 等外部存储系统,实现了秒级检查点,CPU 与内存使用降低超 80%,启动冷启时间缩短 87%,并首次实现了 Join 算子的实时可追溯性。这使得 Flink 在处理超大规模 Join 任务时,变得更加稳定、高效、可扩展。

级联 Regular Join vs. Multi-way Join:从冗余中突围

让我们深入看看传统 Join 的一个“隐形陷阱”——尤其是在多流关联场景下的性能瓶颈。

Flink 的 Regular Join 是一个二元操作:一次只能连接两条流。如果我们想关联 T1、T2 和 T3 三张表,系统必须构建一个级联式执行计划:先将 T1 与 T2 关联,再将结果与 T3 关联。

这种模式带来了严重的效率问题:

每个 Join 阶段都需要维护自己完整的状态;

中间结果(如 T1 与 T2 的关联结果)会被重复存储;

整体状态体积呈倍数增长,检查点时间急剧上升。

虽然 FLIP-415 的 mini-batch join[4] 能缓解部分中间结果输出的压力,但无法解决状态重复存储的根本问题。

那么,如何破局?

答案就是:Multi-Way Join。

流式 Multi-Way Join:高效 Join 的新范式

Multi-Way Join 是一种全新的 Join 策略,从设计源头就杜绝了冗余。

它允许使用同一个关联键,在单个算子内同时关联多条流。不同于级联式的二元 Join,Multi-Way Join 为每条输入流维护一个独立的索引状态表,不再生成中间 Join 结果,也无需嵌套存储。

这意味着:

  • 没有中间状态复制

  • 没有嵌套检查点延迟

关联的流越多,优势越明显。尤其在复杂事件处理、多维事实表关联等场景下,性能提升显著。

未来展望:Flink SQL 的 AI 与数据融合之路

接下来,让我们看看 Flink SQL 的未来发展方向。

Flink SQL 支持端到端 RAG 流水线

一个重要的短期目标是:在 SQL 中原生支持端到端的 RAG(检索增强生成)流程。

目前,用户可以使用 Flink 生成嵌入向量并写入 Milvus 等系统,但检索环节仍无法通过 SQL 直接处理。

未来,我们将引入 VECTOR_SEARCH 函数,直接在 Flink SQL 中实现向量检索,并结合 ML_PREDICT 完成嵌入与生成,实现完全声明式的 RAG 流水线:

  • 数据摄入与向量化

  • 通过向量检索获取 top-k 相似结果

  • 将检索结果用于下游模型推理

整个流程无需编写 Java/Python 代码,真正实现“用 SQL 写 AI 流水线”。

AI 能力扩展:支持多模态与评估函数

我们也在持续拓展 Flink SQL 的 AI 能力边界。除了现有的文本处理和嵌入函数,未来将支持:

  • 多模态处理:支持图像、音频等非文本输入;

  • 评估函数(Evaluation Functions):在流水线执行过程中,实时评估模型输出的质量(如相关性、毒性、重复率等)。

这些能力将帮助用户在数据流中直接集成、监控和调优模型行为,实现更完整的智能处理。

持续优化:流式 Join 性能再突破

Join 性能始终是流式计算的核心课题。Delta Join 已通过解耦了 Flink Task 与本地状态的强绑定,有效解决了大数据量 Join 的扩展性难题。未来,我们将进一步支持更多存储引擎(如 Apache Paimon),以实现近实时 Delta Join。同时,我们也在增强对复杂多流 Join 的支持,包括:

  • 放宽 Schema 对齐要求;

  • 支持更丰富的查询模式;

目标是让 Flink 在面对复杂关联场景时,更加灵活、高效、易用。

要点总结:Flink 2.1 SQL 的三大关键点

最后,总结本次分享的三大关键点:

  1. Flink SQL 融合 AI:让数据与智能无缝集成 原生支持模型管理与 AI 函数,让 AI 流水线在 SQL 中更统一、更易用; 新增 VARIANT 类型,高效处理 JSON 等半结构化数据,为未来 Planner 优化奠定基础。

  2. 攻克流式 Join 顽疾 Delta Join:通过状态卸载,彻底摆脱本地大状态束缚,提升稳定性与资源效率; Multi-Way Join:消除多流关联中的冗余状态,实现更轻量、更快速的 Join 处理。

  3. 未来路线图:更智能、更灵活 扩展 AI 支持:集成向量检索、多模态处理; 持续优化 Join 性能:支持更多存储、更复杂查询。

所有这些努力,都是为了一个目标:让 Flink SQL 成为构建实时、智能数据流水线的终极利器。

[1] https://asia.flink-forward.org/singapore-2025

[2] https://nightlies.apache.org/flink/flink-docs-master/docs/dev/table/sql/queries/model-inference/#configuration-options

[3] https://nightlies.apache.org/flink/flink-docs-master/docs/dev/table/types/#variant

[4] https://cwiki.apache.org/confluence/display/FLINK/FLIP-415:+Introduce+a+new+join+operator+to+support+minibatch

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/92671.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/92671.shtml
英文地址,请注明出处:http://en.pswp.cn/web/92671.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

运维巡检单(文档)

1 运维巡检表格 1.1 每日巡检记录单 1.2 周巡检报告 1.3 季度巡检报告 1.4 远程服务记录单 1.5 现场维护记录单 1.6 现场运维巡检服务单 1.7 服务器巡检记录 1.8 网络设备巡检记录 1.9 视频会议系统检测表 1.10 机房巡检报告 1.11 运维服务统计表 1.12 运维服务交接…

BLDC直流无刷电机工作原理

1.介绍什么是BLDC?BLDC(Brushless Direct Current Motor,无刷直流电机)是一种采用电子换向替代传统机械电刷和换向器的直流电机,兼具直流电机的调速性能和交流电机的结构优势在这之前我们先了解一般电机的分类以及直流…

Rust 实战四 | Traui2+Vue3+Rspack 开发桌面应用:通配符掩码计算器

往期回顾 Rust 实战三 | HTTP 服务开发及 Web 框架推荐Rust 实战二 | 开发简易版命令行工具 grepRust 实战一 | 用 RustRover 开发猜数字游戏Rust 安装与版本更新 代码开源地址:https://github.com/0604hx/rust-journey、通配符掩码计算器 学习一门编程语言&#…

大型语言与进化算法潜在研究方向与挑战

[1] WANG C, ZHAO J, JIAO L, 等. When Large Language Models Meet Evolutionary Algorithms: Potential Enhancements and Challenges[A/OL]. arXiv, 2025[2025-08-07]. http://arxiv.org/abs/2401.10510. DOI:10.48550/arXiv.2401.10510. 这篇文章《当大型语言模型遇到进化算…

计算二分类误差时的常见错误及解决方案

计算二分类误差时的常见错误及解决方案 在二分类任务中使用 error sum(y ! (y_hat > 0.5)) 计算分类错误时,可能遇到以下问题及解决方案: 1. 数据类型不匹配错误 问题:真实标签 y 和预测值 y_hat 的数据类型不一致(如 y 是整数…

uniapp-vue2导航栏全局自动下拉变色

全局自动下拉变色解决方案 雀语文章地址 📖 项目简介 这是一个基于 Vue.js 和 uni-app 的全局自动下拉变色解决方案,通过全局 mixin 实现页面滚动时导航栏的自动颜色变化效果。 ✨ 核心特性 ● 🎯 全局自动生效:无需在每个页面手动…

自有域名功能详解——安全可控的企业级访问方案

ZeroNews 推出自有域名穿透功能,支持用户将已备案域名与内网服务绑定,实现专业级访问控制。本文将系统解析其核心能力与操作逻辑。功能价值1. 所有权掌控使用企业自有域名而非第三方子域名,强化品牌一致性及管理权限。2. 安全合规强制 TLS 加…

Python驱动的无人机多光谱-点云融合技术在生态三维建模与碳储量/生物量/LULC估算中的全流程实战

随着生态学、林学、地理信息科学等多个学科对“结构—功能”一体化研究的共同推进,无人机多光谱与结构光摄影测量(SfM)技术已经从早期实验室验证阶段,走向区域尺度精细生态监测与资源清查的主流工具。过去十年,厘米级空…

JDY-31蓝牙SPP串口透传模块

一、产品简介与应用 JDY-31蓝牙基于蓝牙3.0 SPP设计,这样可以支持Windows、Linux、android数据透传, 工作频段2.4GHZ,调制方式GFSK,最大发射功率8db,最大发射距离30米,支持用户通过 AT命令修改设备名、波特…

模块--继电器

继电器模块详解 继电器,是一种常见的电控置装置,其应用几乎无处不在。在家庭生活中,继电器被广泛应用于照明系统,电视机,空调等电器设备的控制,在工业领域,它们用于控制电机,泵站,生产等高功率设备的运行;继电器还在通信网络,交通系统以及医疗设备中发挥着重要作用。…

Error: error:0308010C:digital envelope routines::unsupported at new Hash

1.报错 这个错误通常与 Node.js 的版本有关。从报错信息中可以看到,使用的 Node 版本是 v22.2.0。 该错误是因为 Node.js v17 及以上版本使用了 OpenSSL 3.0,而一些旧的加密算法或方式在 OpenSSL 3.0 中不再支持。 在项目中,通常是因为 webpa…

OpenAI开发者平台快速入门与API实践指南

OpenAI开发者平台快速入门与API实践指南 一、平台简介 OpenAI开发者平台为开发者提供了强大的人工智能API接口,能够在短时间内实现文本生成、图像识别、音频处理等多种AI能力。本文将详细介绍如何快速上手,发起API请求,并讨论模型选型、功能…

从 GPT‑2 到 gpt‑oss:解析架构的迭代

From GPT-2 to gpt-oss: Analyzing the Architectural Advances 原文 https://magazine.sebastianraschka.com/p/from-gpt-2-to-gpt-oss-analyzing-the OpenAI 本周刚发布了两款新的开放权重的大语言模型:gpt-oss-120b 和 gpt-oss-20b,这是自 2019 年 GP…

一周学会Matplotlib3 Python 数据可视化-线条 (Line)

锋哥原创的Matplotlib3 Python数据可视化视频教程: https://www.bilibili.com/video/BV1UhtuzcEqX/ 课程介绍 本课程讲解利用python进行数据可视化 科研绘图-Matplotlib,学习Matplotlib图形参数基本设置,绘图参数及主要函数,以及…

09-netty基础-手写rpc-原理-01

netty系列文章: 01-netty基础-socket02-netty基础-java四种IO模型03-netty基础-多路复用select、poll、epoll04-netty基础-Reactor三种模型05-netty基础-ByteBuf数据结构06-netty基础-编码解码07-netty基础-自定义编解码器08-netty基础-自定义序列化和反序列化09-n…

Windows 小知识:Winodws 文件与文件夹名不区分大小写

专栏导航 上一篇:Windows 编程辅助技能:速览定义 回到目录 下一篇:无 本节前言 本节来分享一个小的知识点,具体地,我们在下面来细说。 一. Windows 系统的文件与文件夹的名字,不区分大小写 请大家…

嵌套-列表存储字典,字典存储列表,字典存储字典

字典存储列表aliens []for alien in range(10):new_alien {"id": alien, "color": "green", "speed": "slow" , "points": 20}aliens.append(new_alien)for alien in aliens[:5]:print(alien) print("...&…

个人笔记Mybatis2

4.配置解析4.1核心配置文件mybatis-config.xmlMyBatis配置包含对MyBatis行为方式有显著影响的设置和属性在 MyBatis 中有两种类型的事务管理器 (也就是 type"[JDBC|MANAGED]”configuration(配置) properties(属性) settings(设置) typeAliases(类型别名) typeHandlers(类…

使用 Maxwell 和 RabbitMQ 监控 Mysql Flowable 表变更

为什么需要监控数据库变化?当 Flowable 表中的数据发生变化(例如插入新任务、更新状态或删除记录),我们可能需要触发其他操作,比如通知用户、更新仪表盘或启动新流程。Maxwell 可以读取 MySQL 的二进制日志&#xff08…

MySQL面试题及详细答案 155道(041-060)

《前后端面试题》专栏集合了前后端各个知识模块的面试题,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs&…