Fluss: First Impression

本文涉及的产品
实时计算 Flink 版,1000CU*H 3个月
简介: 本文由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日以线上峰会的形式与大家见面。
相关文章
|
4月前
|
存储 Rust Go
介绍一下这只小水獭 —— Fluss Logo 背后的故事
Fluss是一款开源流存储项目,致力于为Lakehouse架构提供高效的实时数据层。其全新Logo以一只踏浪前行的小水獭为核心形象,象征流动性、适应性和友好性。水獭灵感源于“Fluss”德语中“河流”的含义,传递灵活与亲和力。经过30多版设计迭代,最终呈现动态活力的视觉效果。Fluss计划捐赠给Apache软件基金会,目前已开启孵化提案。社区还推出了系列周边礼品,欢迎加入钉钉群109135004351参与交流!
705 3
介绍一下这只小水獭 —— Fluss Logo 背后的故事
|
9月前
|
存储 人工智能 大数据
The Past, Present and Future of Apache Flink
本文整理自阿里云开源大数据负责人王峰(莫问)在 Flink Forward Asia 2024 上海站主论坛开场的分享,今年正值 Flink 开源项目诞生的第 10 周年,借此时机,王峰回顾了 Flink 在过去 10 年的发展历程以及 Flink社区当前最新的技术成果,最后展望下一个十年 Flink 路向何方。
682 33
The Past, Present and Future of Apache Flink
|
9月前
|
Cloud Native Apache 流计算
资料合集|Flink Forward Asia 2024 上海站
Apache Flink 年度技术盛会聚焦“回顾过去,展望未来”,涵盖流式湖仓、流批一体、Data+AI 等八大核心议题,近百家厂商参与,深入探讨前沿技术发展。小松鼠为大家整理了 FFA 2024 演讲 PPT ,可在线阅读和下载。
8418 18
资料合集|Flink Forward Asia 2024 上海站
|
8月前
|
存储 人工智能 分布式计算
湖仓实时化升级 :Uniflow 构建流批一体实时湖仓
本文整理自阿里云产品经理李昊哲在Flink Forward Asia 2024流批一体专场的分享,涵盖实时湖仓发展趋势、基于Flink搭建流批一体实时湖仓及Materialized Table优化三方面。首先探讨了实时湖仓的发展趋势和背景,特别是阿里云在该领域的领导地位。接着介绍了Uniflow解决方案,通过Flink CDC、Paimon存储等技术实现低成本、高性能的流批一体处理。最后,重点讲解了Materialized Table如何简化用户操作,提升数据查询和补数体验,助力企业高效应对不同业务需求。
796 18
湖仓实时化升级 :Uniflow 构建流批一体实时湖仓
|
9月前
|
存储 人工智能 BI
Paimon 1.0: Unified Lake Format for Data + AI
本文整理自阿里云智能开源湖存储负责人李劲松在Flink Forward Asia 2024上海站主论坛的演讲。Apache Paimon于今年3月成为顶级项目,计划发布1.0版本,目标是Unified Lake Format for Data + AI,解决数据处理与AI应用中的关键问题。Paimon结合Flink打造Streaming Lakehouse解决方案,已在阿里巴巴集团及多个行业中广泛应用。来自淘天、抖音和vivo的嘉宾分享了基于Paimon + Flink技术栈的数据湖实时处理与分析实践案例。内容涵盖大数据从业者面临的痛点、Paimon的发展历程及大厂的应用经验。
839 2
Paimon 1.0: Unified Lake Format for Data + AI
|
7月前
|
SQL 存储 API
Flink Materialized Table:构建流批一体 ETL
本文整理自阿里云智能集团 Apache Flink Committer 刘大龙老师在2024FFA流批一体论坛的分享,涵盖三部分内容:数据工程师用户故事、Materialized Table 构建流批一体 ETL 及 Demo。文章通过案例分析传统 Lambda 架构的挑战,介绍了 Materialized Table 如何简化流批处理,提供统一 API 和声明式 ETL,实现高效的数据处理和维护。最后展示了基于 Flink 和 Paimon 的实际演示,帮助用户更好地理解和应用这一技术。
655 7
Flink Materialized Table:构建流批一体 ETL
|
8月前
|
SQL 存储 Apache
基于 Flink 进行增量批计算的探索与实践
本文整理自阿里云高级技术专家、Apache Flink PMC朱翥老师在Flink Forward Asia 2024的分享,内容分为三部分:背景介绍、工作介绍和总结展望。首先介绍了增量计算的定义及其与批计算、流计算的区别,阐述了增量计算的优势及典型需求场景,并解释了为何选择Flink进行增量计算。其次,详细描述了当前的工作进展,包括增量计算流程、执行计划生成、控制消费数据量级及执行进度记录恢复等关键技术点。最后,展示了增量计算的简单示例、性能测评结果,并对未来工作进行了规划。
910 6
基于 Flink 进行增量批计算的探索与实践
|
6月前
|
SQL 存储 消息中间件
vivo基于Paimon的湖仓一体落地实践
本文整理自vivo互联网大数据专家徐昱在Flink Forward Asia 2024的分享,基于实际案例探讨了构建现代化数据湖仓的关键决策和技术实践。内容涵盖组件选型、架构设计、离线加速、流批链路统一、消息组件替代、样本拼接、查询提速、元数据监控、数据迁移及未来展望等方面。通过这些探索,展示了如何优化性能、降低成本并提升数据处理效率,为相关领域提供了宝贵的经验和参考。
863 3
vivo基于Paimon的湖仓一体落地实践
|
6月前
|
存储 消息中间件 Kafka
官宣 | Fluss 0.6 发布公告
Fluss社区宣布0.6.0版本正式发布,历经3个多月开发,45位贡献者完成200+代码提交。新版本亮点包括:列压缩技术降低6倍存储空间、MergeEngine支持灵活主键合并策略、Prefix Lookup实现Delta Join功能。这些特性增强了Fluss的功能和性能,标志着其在构建下一代分析型流存储系统上的重要进展。
272 1
官宣 | Fluss 0.6 发布公告