Fluss: First Impression

简介: 本文由Flink PMC Member徐榜江翻译自Yaroslav Tkachenko的文章《Fluss: First Impression》,介绍了阿里巴巴开源的新一代流存储系统Fluss。文章分为七个部分,涵盖Fluss简介、Table作为核心概念、PrimaryKey Table、一体化集成、Flink SQL的Delta Join、Fluss实现细节及总结。Fluss通过表结构组织数据流,支持主键表和高效的点查,深度集成LakeHouse,并计划与Flink深度集成,提供实时数据分析能力。

本文由 Flink PMC Member&Committer,Flink CDC 项目负责人徐榜江(雪尽)老师翻译自 Yaroslav Tkachenko 的原创文章《Fluss: First Impression》[1],内容分为以下7个部分:

  1. Fluss 简介
  2. Table(表) 作为核心概念
  3. PrimaryKey Table(主键表)
  4. 更深层次的一体化
  5. Flink SQL 的 Delta Join
  6. Fluss 实现细节
  7. Fluss 总结

Fluss 简介

Fluss [2] 是阿里巴巴前几周开源的一个新一代流存储,请查看其公告文章[3]。Fluss 与其他流存储(如 Apache Kafka、Apache Pulsar、Redpanda 等)非常相似,但在某些方面也存在显著差异(并且确实具备一些独特的功能),比如Fluss被设计成与 LakeHouse(如 Apache Iceberg 和 Apache Paimon)紧密集成。

目前,Fluss 还没有支持 Kafka 协议,但这已被列入Fluss 的 Roadmap 中。这使得我们的评估较为困难 —— 目前,你需要使用 Apache Flink或 Apache Paimon与之交互。不过,从架构上看,Fluss 的模型设计和 Kafka 比较类似:使用 Table 而不是 Topic;使用 Bucket 而不是 Partition等。

Fluss 架构[4]

Table (表) 作为核心概念

在查看Fluss文档时,最引人注目的一个点是,Fluss 将数据流组织为结构的 Table,而不是 Topic。在 Kafka 中,通常使用 Avro 或 Protobuf 格式配合 Schema Registry 一起来管理数据的 schema,但这并不是必需的。对于 Kafka 来说,每一条记录的值只是一个字节数组,这使得它能够处理半结构化或非结构化数据。

Fluss 要求在写入任何数据之前必须先定义 Schema,我个人认为这使得处理半结构化数据或需要频繁演变 Schema 的数据流更加困难。

将Table作为核心概念,也表明 Fluss 更像是一个数据库,而不是单纯的流存储。这与其宣传的用例非常契合:为实时数据提供快速摄取,并与 LakeHouse 实现 Union Read(下文会提到)以进行实时分析。

PrimaryKey Table(主键表)

Fluss 支持普通的 Append-only 日志表(Log Table)[5],以及主键表(PrimaryKey Table)[6]。第一眼看上去,主键表是 Fluss 最令人印象深刻的特性。点查(lookup query)一直是 Kafka 的痛点:在几乎所有 Kafka 兼容的产品中,从某个Topic中查找一条特定的消息是非常通用的一个需求,而实现这一点几乎总是需要从头开始扫描整个Topic……这可能需要数小时。分层存储(Tiered storage) 可以改善这个问题,但改善幅度极其有限。

Fluss 的主键表通过 RocksDB 支持,用于支持更新、删除和高效的点查!因此,用户可以在 Flink SQL 中对Fluss中的表,执行类似于 “SELECT * FROM users_table WHERE user_id = 123” 的查询,并且能够相对快速地获取结果。

主键表同时支持完整的 Changelog 生成(changelog semantics)和 部分列更新(Partial Update )功能。 当然,天下没有免费的午餐,我认为Fluss 主键表的性能可能会比日志表低一个数量级。

更深层次的一体化

我在 2023 年写过一篇题为《展望 2030 的数据平台》文章[7],在那篇文章中,我预测在 2030 年,数据平台将会统一,流存储( streaming log, 如 Kafka )、湖仓(lakehouse, 如 Iceberg)和 OLAP 数据库(如 ClickHouse)三者将变得更加统一,形成一个易于使用和管理的“一体化数据引擎”,而不是三个独立的系统。现在看来我可能预测错了,因为我们可能会更早看到这一变化 。多个厂商已经宣布将 Kafka 与 Iceberg API 集成(Redpanda 已经在 Beta 版本中支持 Iceberg[8]),Fluss 也不例外,它深度集成了 LakeHouse(Paimon,Iceberg*[9]),并突出了 Union Read 的用户案例(在 Apache Flink 中也被称为 Hybrid Source10])。

Fluss 除了很好地在流存储和Lakehouse两个维度实现一体化之外,其主键表的抽象更是超越了这两个维度。因为 Fluss底层的 RocksDB 数据库不仅可以支持高效的点查(lookup query),还可以用于聚合查询(aggregation query)!Fluss 文档中提供了一个小示例[11]。你们需要知道,RocksDB 也被 Rockset 用作其 OLAP 引擎的底层存储[12],因此,在 Fluss 上支持这些 OLAP 功能是完全可行的,起码在一定规模下是可行的。

Flink SQL 的 Delta Join

Delta Join 是我几年前就一直期待在 Flink 中支持的功能,这可能终于要实现了!

这个想法非常简单:

  • 在经典的 "无窗口" 的双流 JOIN 中,左右两条流都需要在state中保存全量数据,这在大规模下变得极具挑战,我之前也对这个挑战写过一篇文章[13]。

  • 流处理平台可以提供一种类似分层存储 (Tired Storage)的实现,保留永不过期的 state 数据 。

  • 因此,相比于保存数据到State中,不如在需要时通过点查直接查询分层存储。某种形式的批处理可能是必需的。

  • 在典型的分层存储实现中,这些点查在 Apache Kafka、Confluent 或 Redpanda 中并不那么高效。但在 Fluss 中,主键表使得这变得可能。我想 Fluss 的贡献者也可以决定去增加二级索引功能来加快点查速度。

请随时查看 Flink 社区的 Delta Join 的 FLIP [14]设计了解更多详情。

Fluss 实现

Fluss 是用 Java 实现的,目前需要 Zookeeper 来进行协调。Table 的数据分区和复制类似于 Kafka 的 Topic。数据存储在本地磁盘上。总体而言,这种设计虽然可靠,但稍显过时(这是2019年的设计吗?Rust 到哪里去了呢?!😜)。不过,Fluss 的 Roadmap 已经提到一些计划中的改进,如去除 Zookeeper 和 Zero-Disk 架构。

在阅读部分源代码时,我不禁产生一种印象:Fluss 就是 Flink(参考了其类型系统)、Paimon(参考了部分设计)和 Kafka(类似的设计抽象、配置等)的结合体。不过这一点都不令人惊讶,因为 Fluss 的核心开发团队同时也是 Flink 和 Paimon 的贡献者。

Fluss 使用 Apache Arrow 这一列格式作为主要的数据交换协议,这使得 Fluss 非常有趣。生产者将 Arrow 向量进行攒批,并通过 Arrow IPC 将它们发送到 Server 端。

如果你想了解 Arrow 的攒批写入是如何工作,我邀请你阅读 ArrowLogWriteBatch.java[15] 和 MemoryLogRecordsArrowBuilder.java [16] 这两份代码。

如果你仍然质疑向量化的列存格式是否适合流系统,我建议你阅读 Arroyo 的《我们在 Arrow 和 DataFusion 之上构建了一个新的SQL引擎》文章[17],其中的关键观点如下:

观点翻译:

但我认为,在流处理中,为何批处理有意义的理由很简单:对于任何给定的大小的批,系统吞吐量越高,我们攒批所需等待的时间就越少。例如,如果我们希望批中至少有100条记录来分摊固定的成本,那么我们需要等待接收100条记录完成时间将取决于系统吞吐量:
● 每秒10个事件,需要1秒
● 每秒1,000个事件,只需要0.01秒(100毫秒)
● 每秒1,000,000个事件,只需要0.0001秒(0.1毫秒)

译者注:此处作者Yaroslav的观点是流系统里使用Arrow的RecordBatch来攒批是合理的,引用业界的真实案例说明攒批并不一定会影响延时,在高吞吐的流处理场景,一个100大小的攒批只需要0.1毫秒就可以完成。

Fluss 的协议是基于 Protobuf 实现的,非常容易理解:完整的说明可以在这里查看[18]。这块目前的代码量还不到 1000 行, 我很好奇未来在支持消费组(Consumer Group)功能之后会变成什么样子。

Fluss 总结

Fluss 是一个真正具备独特价值的系统,它试图将实时数据流建模为结构化的表。虽然Fluss处于非常早期的阶段,但我个人会保持关注:主键表 和 Delta Join 可能会成为其杀手级特性。

Apache Flink 用户应该对 Fluss 的 Roadmap 感到非常兴奋:

    **Fluss 规划中Flink集成部分 \[19\]**

Fluss 规划中 Flink 集成部分翻译:

Flink 集成

Fluss将与Apache Flink深度集成,为用户提供单一引擎即可构建实时分析应用的体验,包括:

● 支持使用Flink的 DataStream API读写Fluss
● 支持全新的Delta Join,以解决双流Join的痛点
● 支持更多的下推优化:过滤下推、分区剪枝、聚合下推等
● 将Flink SQL Planner中的基于规则的优化器(RBO)升级为基于成本的优化器(CBO),利用Fluss表中的统计信息优化Flink SQL

在 Fluss 的 Roadmap 里,Fluss 会深度集成 Flink,包括支持更多谓词下推(predicate pushdown)优化,将Flink SQL优化器升级为CBO,利用 Fluss 表的统计信息优化 Flink SQL 等未来规划,这些规划确实能够使得 Fluss 的性能提升 10 倍甚至 100 倍。

参考链接:

[1]https://www.streamingdata.tech/p/fluss-first-impression

[2]https://github.com/alibaba/fluss

[3]https://www.ververica.com/blog/fluss-is-now-open-source

[4]https://alibaba.github.io/fluss-docs/docs/concepts/architecture/

[5]https://alibaba.github.io/fluss-docs/docs/table-design/table-types/log-table/

[6]https://alibaba.github.io/fluss-docs/docs/table-design/table-types/pk-table/

[7]https://www.streamingdata.tech/p/data-platforms-in-2030

[8]https://docs.redpanda.com/current/manage/topic-iceberg-integration/

[9]https://alibaba.github.io/fluss-docs/docs/streaming-lakehouse/overview/

[10]https://nightlies.apache.org/flink/flink-docs-master/docs/connectors/datastream/hybridsource/

[11]https://alibaba.github.io/fluss-docs/docs/engine-flink/reads/#aggregations

[12]https://rockset.com/blog/how-we-use-rocksdb-at-rockset/

[13]https://sap1ens.com/blog/2020/12/12/streaming-systems-and-global-state/

[14]https://cwiki.apache.org/confluence/display/FLINK/FLIP-486%3A+Introduce+A+New+DeltaJoin

[15]https://github.com/alibaba/fluss/blob/a1280c6888c20d4318ea3bee4784dd0ee321c6c4/fluss-client/src/main/java/com/alibaba/fluss/client/write/ArrowLogWriteBatch.java

[16]https://github.com/alibaba/fluss/blob/a1280c6888c20d4318ea3bee4784dd0ee321c6c4/fluss-common/src/main/java/com/alibaba/fluss/record/MemoryLogRecordsArrowBuilder.java

[17]https://www.arroyo.dev/blog/why-arrow-and-datafusion

[18]https://github.com/alibaba/fluss/blob/a1280c6888c20d4318ea3bee4784dd0ee321c6c4/fluss-rpc/src/main/proto/FlussApi.proto

[19][https://alibaba.github.io/fluss-docs/roadmap]


更多内容


活动推荐

阿里云基于 Apache Flink 构建的企业级产品-实时计算 Flink 版现开启活动:
新用户复制点击下方链接或者扫描二维码即可0元免费试用 Flink + Paimon
实时计算 Flink 版(3000CU*小时,3 个月内)
了解活动详情:https://free.aliyun.com/?utm_content=g_1000395379&productCode=sc

相关实践学习
基于Hologres+Flink搭建GitHub实时数据大屏
通过使用Flink、Hologres构建实时数仓,并通过Hologres对接BI分析工具(以DataV为例),实现海量数据实时分析.
实时计算 Flink 实战课程
如何使用实时计算 Flink 搞定数据处理难题?实时计算 Flink 极客训练营产品、技术专家齐上阵,从开源 Flink功能介绍到实时计算 Flink 优势详解,现场实操,5天即可上手! 欢迎开通实时计算 Flink 版: https://cn.aliyun.com/product/bigdata/sc Flink Forward Asia 介绍: Flink Forward 是由 Apache 官方授权,Apache Flink Community China 支持的会议,通过参会不仅可以了解到 Flink 社区的最新动态和发展计划,还可以了解到国内外一线大厂围绕 Flink 生态的生产实践经验,是 Flink 开发者和使用者不可错过的盛会。 去年经过品牌升级后的 Flink Forward Asia 吸引了超过2000人线下参与,一举成为国内最大的 Apache 顶级项目会议。结合2020年的特殊情况,Flink Forward Asia 2020 将在12月26日以线上峰会的形式与大家见面。
相关文章
|
2月前
|
存储 SQL Apache
Flink + Fluss 实战: Delta Join 原理解析与操作指南
Flink Delta Join 通过复用源表数据替代本地状态,解决双流 Join 状态膨胀问题。结合 Fluss 流存储,实现高效双向 Lookup,显著降低资源消耗与 Checkpoint 时间,提升作业稳定性与恢复速度,已在阿里大规模落地。
312 25
Flink + Fluss 实战: Delta Join 原理解析与操作指南
|
9月前
|
存储 Rust Go
介绍一下这只小水獭 —— Fluss Logo 背后的故事
Fluss是一款开源流存储项目,致力于为Lakehouse架构提供高效的实时数据层。其全新Logo以一只踏浪前行的小水獭为核心形象,象征流动性、适应性和友好性。水獭灵感源于“Fluss”德语中“河流”的含义,传递灵活与亲和力。经过30多版设计迭代,最终呈现动态活力的视觉效果。Fluss计划捐赠给Apache软件基金会,目前已开启孵化提案。社区还推出了系列周边礼品,欢迎加入钉钉群109135004351参与交流!
973 3
介绍一下这只小水獭 —— Fluss Logo 背后的故事
|
8月前
|
存储 运维 Java
官宣 | Fluss 0.7 发布公告:稳定性与架构升级
Fluss 0.7 版本正式发布!历经 3 个月开发,完成 250+ 次代码提交,聚焦稳定性、架构升级、性能优化与安全性。新增湖流一体弹性无状态服务、流式分区裁剪功能,大幅提升系统可靠性和查询效率。同时推出 Fluss Java Client 和 DataStream Connector,支持企业级安全认证与鉴权机制。未来将在 Apache 孵化器中继续迭代,探索多模态数据场景,欢迎开发者加入共建!
811 8
官宣 | Fluss 0.7 发布公告:稳定性与架构升级
|
4月前
|
存储 消息中间件 Kafka
Confluent 首席架构师万字剖析 Apache Fluss(二):核心架构
原文:https://jack-vanlightly.com/blog/2025/9/2/understanding-apache-fluss 作者:Jack Vanlightly 翻译:Wayne Wang@腾讯 译注:Jack Vanlightly 是一位专注于数据系统底层架构的知名技术博主,他的文章以篇幅长、细节丰富而闻名。目前 Jack 就职于 Confluent,担任首席技术架构师,因此这篇 Fluss 深度分析文章,具备一定的客观参考意义。译文拆成了三篇文章,本文是第二篇。
561 19
|
9月前
|
存储 消息中间件 OLAP
基于 Flink+Paimon+Hologres 搭建淘天集团湖仓一体数据链路
本文整理自淘天集团高级数据开发工程师朱奥在Flink Forward Asia 2024的分享,围绕实时数仓优化展开。内容涵盖项目背景、核心策略、解决方案、项目价值及未来计划五部分。通过引入Paimon和Hologres技术,解决当前流批存储不统一、实时数据可见性差等痛点,实现流批一体存储与高效近实时数据加工。项目显著提升了数据时效性和开发运维效率,降低了使用门槛与成本,并规划未来在集团内推广湖仓一体架构,探索更多技术创新场景。
1683 3
基于 Flink+Paimon+Hologres 搭建淘天集团湖仓一体数据链路
|
8月前
|
SQL 存储 缓存
Fluss 实战:用 Partial Update 构建实时宽表的新范式
传统流式数据管道通过多表 Join 构建宽表,如实时推荐引擎需整合用户偏好、购买记录等8个数据源,但此方法在大规模场景下状态管理复杂、资源消耗高且调试困难。Fluss 提出部分更新方案,基于主键将各数据源独立写入共享宽表,避免复杂 Join 操作。示例中,通过 Flink SQL 创建推荐、曝光、点击等表,并逐步插入数据实现宽表构建。最终,借助 Fluss 的高效合并机制,输出包含最新信息的统一视图,提升可扩展性和维护性。
448 8
Fluss 实战:用 Partial Update 构建实时宽表的新范式
|
11月前
|
存储 消息中间件 Kafka
官宣 | Fluss 0.6 发布公告
Fluss社区宣布0.6.0版本正式发布,历经3个多月开发,45位贡献者完成200+代码提交。新版本亮点包括:列压缩技术降低6倍存储空间、MergeEngine支持灵活主键合并策略、Prefix Lookup实现Delta Join功能。这些特性增强了Fluss的功能和性能,标志着其在构建下一代分析型流存储系统上的重要进展。
496 1
官宣 | Fluss 0.6 发布公告
|
存储 SQL 缓存
Flink 2.0 存算分离状态存储 — ForSt DB 
本文整理自阿里云技术专家兰兆千在Flink Forward Asia 2024上的分享,主要介绍Flink 2.0的存算分离架构、全新状态存储内核ForSt DB及工作进展与未来展望。Flink 2.0通过存算分离解决了本地磁盘瓶颈、检查点资源尖峰和作业恢复速度慢等问题,提升了云原生部署能力。ForSt DB作为嵌入式Key-value存储内核,支持远端读写、批量并发优化和快速检查点等功能。性能测试表明,ForSt在异步访问和本地缓存支持下表现卓越。未来,Flink将继续完善SQL Operator的异步优化,并引入更多流特性支持。
1326 88
Flink 2.0 存算分离状态存储 — ForSt DB 
|
11月前
|
消息中间件 存储 Kafka
Fluss: First Impression
Fluss: First Impression
287 0