Fluss: First Impression

本文涉及的产品
实时计算 Flink 版,5000CU*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轻松玩转一站式实时仓库
本场景介绍如何利用阿里云MaxCompute、实时计算Flink和交互式分析服务Hologres开发离线、实时数据融合分析的数据大屏应用。
Linux入门到精通
本套课程是从入门开始的Linux学习课程,适合初学者阅读。由浅入深案例丰富,通俗易懂。主要涉及基础的系统操作以及工作中常用的各种服务软件的应用、部署和优化。即使是零基础的学员,只要能够坚持把所有章节都学完,也一定会受益匪浅。
相关文章
|
18天前
|
SQL 存储 Apache
基于 Flink 进行增量批计算的探索与实践
本文整理自阿里云高级技术专家、Apache Flink PMC朱翥老师在Flink Forward Asia 2024的分享,内容分为三部分:背景介绍、工作介绍和总结展望。首先介绍了增量计算的定义及其与批计算、流计算的区别,阐述了增量计算的优势及典型需求场景,并解释了为何选择Flink进行增量计算。其次,详细描述了当前的工作进展,包括增量计算流程、执行计划生成、控制消费数据量级及执行进度记录恢复等关键技术点。最后,展示了增量计算的简单示例、性能测评结果,并对未来工作进行了规划。
441 6
基于 Flink 进行增量批计算的探索与实践
|
1月前
|
存储 人工智能 大数据
The Past, Present and Future of Apache Flink
本文整理自阿里云开源大数据负责人王峰(莫问)在 Flink Forward Asia 2024 上海站主论坛开场的分享,今年正值 Flink 开源项目诞生的第 10 周年,借此时机,王峰回顾了 Flink 在过去 10 年的发展历程以及 Flink社区当前最新的技术成果,最后展望下一个十年 Flink 路向何方。
358 33
The Past, Present and Future of Apache Flink
|
1月前
|
Cloud Native Apache 流计算
资料合集|Flink Forward Asia 2024 上海站
Apache Flink 年度技术盛会聚焦“回顾过去,展望未来”,涵盖流式湖仓、流批一体、Data+AI 等八大核心议题,近百家厂商参与,深入探讨前沿技术发展。小松鼠为大家整理了 FFA 2024 演讲 PPT ,可在线阅读和下载。
6142 18
资料合集|Flink Forward Asia 2024 上海站
|
3天前
|
存储 人工智能 分布式计算
湖仓实时化升级 :Uniflow 构建流批一体实时湖仓
本文整理自阿里云产品经理李昊哲在Flink Forward Asia 2024流批一体专场的分享,涵盖实时湖仓发展趋势、基于Flink搭建流批一体实时湖仓及Materialized Table优化三方面。首先探讨了实时湖仓的发展趋势和背景,特别是阿里云在该领域的领导地位。接着介绍了Uniflow解决方案,通过Flink CDC、Paimon存储等技术实现低成本、高性能的流批一体处理。最后,重点讲解了Materialized Table如何简化用户操作,提升数据查询和补数体验,助力企业高效应对不同业务需求。
331 17
湖仓实时化升级 :Uniflow 构建流批一体实时湖仓
|
29天前
|
存储 人工智能 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的发展历程及大厂的应用经验。
430 1
Paimon 1.0: Unified Lake Format for Data + AI
|
8天前
|
SQL 监控 关系型数据库
用友畅捷通在Flink上构建实时数仓、挑战与最佳实践
本文整理自用友畅捷通数据架构师王龙强在FFA2024上的分享,介绍了公司在Flink上构建实时数仓的经验。内容涵盖业务背景、数仓建设、当前挑战、最佳实践和未来展望。随着数据量增长,公司面临数据库性能瓶颈及实时数据处理需求,通过引入Flink技术逐步解决了数据同步、链路稳定性和表结构差异等问题,并计划在未来进一步优化链路稳定性、探索湖仓一体架构以及结合AI技术推进数据资源高效利用。
337 23
用友畅捷通在Flink上构建实时数仓、挑战与最佳实践
|
1月前
|
消息中间件 JSON 数据库
探索Flink动态CEP:杭州银行的实战案例
本文由杭州银行大数据工程师唐占峰、欧阳武林撰写,介绍Flink动态CEP的定义、应用场景、技术实现及使用方式。Flink动态CEP是基于Flink的复杂事件处理库,支持在不重启服务的情况下动态更新规则,适应快速变化的业务需求。文章详细阐述了其在反洗钱、反欺诈和实时营销等金融领域的应用,并展示了某金融机构的实际应用案例。通过动态CEP,用户可以实时调整规则,提高系统的灵活性和响应速度,降低维护成本。文中还提供了具体的代码示例和技术细节,帮助读者理解和使用Flink动态CEP。
435 2
探索Flink动态CEP:杭州银行的实战案例
|
1月前
|
存储 消息中间件 SQL
流存储Fluss:迈向湖流一体架构
本文整理自阿里云高级开发工程师罗宇侠在Flink Forward Asia 2024上海站的分享,介绍了湖流割裂的现状与挑战,Fluss湖流一体架构的设计与优势,以及未来规划。内容涵盖湖流割裂的现状、Fluss架构详解、湖流一体带来的收益,以及未来的生态扩展和技术优化。
405 11
流存储Fluss:迈向湖流一体架构
|
3月前
|
SQL Java API
Apache Flink 2.0-preview released
Apache Flink 社区正积极筹备 Flink 2.0 的发布,这是自 Flink 1.0 发布以来的首个重大更新。Flink 2.0 将引入多项激动人心的功能和改进,包括存算分离状态管理、物化表、批作业自适应执行等,同时也包含了一些不兼容的变更。目前提供的预览版旨在让用户提前尝试新功能并收集反馈,但不建议在生产环境中使用。
971 13
Apache Flink 2.0-preview released
|
1月前
|
存储 SQL 人工智能
Apache Flink 2.0:Streaming into the Future
本文整理自阿里云智能高级技术专家宋辛童、资深技术专家梅源和高级技术专家李麟在 Flink Forward Asia 2024 主会场的分享。三位专家详细介绍了 Flink 2.0 的四大技术方向:Streaming、Stream-Batch Unification、Streaming Lakehouse 和 AI。主要内容包括 Flink 2.0 的存算分离云原生化、流批一体的 Materialized Table、Flink 与 Paimon 的深度集成,以及 Flink 在 AI 领域的应用。
599 13
Apache Flink 2.0:Streaming into the Future