Flink Table Store 0.3 构建流式数仓最佳实践

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
简介: 阿里巴巴高级技术专家,Apache Flink PMC 李劲松(之信),在 FFA 2022 实时湖仓的分享。

摘要:本文整理自阿里巴巴高级技术专家,Apache Flink PMC 李劲松(之信),在 FFA 2022 实时湖仓的分享。本篇内容主要分为四个部分:

  1. 挑战:Streaming DW 面临的难题
  2. 案例:Flink+FTS 典型场景案例
  3. V0.3:FTSV0.3 有什么能力来帮助上述场景
  4. 总结:回顾和项目信息

点击查看直播回放和演讲 PPT

一、挑战:Streaming DW 面临的难题

1

首先,讲一讲 Streaming Data Warehouse 面临的难题。Streaming Data Warehouse 是什么呢?

如上图所示,数据源从 MySQL 或 Logs,通过 Flink CDC 或 Flink Streaming,把数据摄入到仓里。这个仓可以分 ODS 层、DWD 层、DWS 层。每一层的存储写的是 Flink Table Store。

这样一个看起来跟离线数仓相似的 Pipeline,它的特点是全链路实时流动。通过 Flink Streaming 作业串联,在全链路流动的同时,数据沉淀到了 Flink Table Store 的存储上。这个存储不再是之前的 Kafka,只能留,不能查。

这个架构的典型特点是全链路实时可流动,全链路实时可查。这个存储里的数据,能被各生态的计算引擎查询分析。沉淀数据之后,每一份数据在 ODS 层、DWD 层、DWS 层,可以分层复用,减少大量存储和计算的浪费。

2

虽然这个架构理解起来非常的简单,但却不容易实现。我们来简单分析一下,存储在这个架构中的作用。存储主要有三个作用:

  1. 消息队列。因为全链路是流起来的,存储本身要做一个消息队列,可流写、可流读,需要有一定的顺序性。
  2. 沉淀数据。沉淀的历史数据需要要面向各生态计算引擎,做到可分析。沉淀数据之后,这部分数据应该被管理。
  3. 存储需要增强流计算,让流计算变得更简单,解决流计算的难题。

3

如上图所示,存储在这个架构里发挥了多少作用,又有多少挑战呢?

  1. 全增量一体摄入。在一个流作业中,全量数据读完之后,无缝切换到增量数据再读,数据和流作业一起进入下一个环节。存储在这里遇到的挑战是,既然有数据全增量一体摄入,说明数据量很大,数据乱序很严重。存储能不能撑住?能不能用高吞吐来支撑全增量一体摄入?
  2. 消息队列的流读。存储本身作为消息队列需要流写、流读,非常灵活。存储能不能提供全增量一体的流读?能不能指定 timestamp 从历史开始读增量?
  3. Changelog 的流读。图中的第三部分,Flink 基于 State 的计算严格依赖 Changelog。如果 Changelog 错误,Flink 计算将出现各种各样正确性的问题。当用户输入到存储后,从存储流读的 log 是否准确?变更日志是否完整?这些问题是非常关键。
  4. 可流 Join 的存储。目前,流计算中 Join 是非常头疼的问题。不光是流计算本身在存储和流计算结合,存储本身也应该在流 Join 上发挥较大的作用。
  5. 丰富生态的查询。存储跟计算不一样,存储要有比较好的生态。因为不能假设计算能解决一切问题,所以存储需要被各种引擎查询。它必须有一个较好的生态。

二、案例:Flink+FTS 典型场景案例

4

如上图所示,在业务上这个案例是一个销售大宽表。它的业务逻辑是上图中的的四张表,我需要把订单表、退货表、顾客表和退货原因表,打宽到一起,方便各种引擎查询。

接着,增量数据写到 Clickhouse 或 ElasticSeach 中。Trino + FTS 的查询可以满足不少场景,但是有些查询的要求更高,它的依赖面向 OLAP 面向索引。

因此,四个多表连接到一起,打成大宽表,然后写到一张表当中,并且增量数据写到下游的引擎中。在流计算中,如何做到 realtime 的打宽?这是一个比较难的问题。

我们先来分析下此例子中的各个表,因为订单表和退货表是同主键的,它们都有订单 ID,订单表中也有顾客 ID,它可以和顾客表进行 Join,获取一些维表信息。其次,顾客表一直在变化,顾客可以修改自己的信息。最后,退货原因表是不可变的。因为退货就原因,一般是不能被编辑的。

对于业务来说,有一个非常简单的思路,就是把这四张表 Join 一下,然后写到存储当中。但是这种方法的代价非常高,存储会成倍增加,成本非常高。

面对真实的业务,我们想让业务实现更多的离线计算、离线 Pipeline 变的实时化。但业务切换到实时化后,实时计算的成本是离线计算的数十倍。

所以针对此案例,如何使用 Flink Table Store 呢?

5

我们首先创建 DWD 的大宽表。订单 ID 是主键,有些字段来自订单表,有些字段来自退货表,还有一些字段来自顾客表和退货原因表。

通过定义,它声明 merge-engine=partial-update,changelog-producer=full-compaction,剩下的两个是相关的参数。

通过 Flink Table Store 的 partial-update 的能力,使得相同的两张表同时写到一个大宽表当中,更新各自的字段,互不影响。 而且因为配置了 changelog-producer,所以在 Compaction 时会产生正确的宽表日志,下游的流读可以读到最新合并后的数据。

6

接下来,对于顾客表和退货原因表,怎么打宽?

退货原因表有一个特点是,它的表条数较少,退货表不可更改。所以它比较适合使用 Flink Table Store 作为 Lookup Join 表。进行 Lookup Join,Flink Table Store 会维护一些磁盘 cache。用户不用担心数据量太大,导致 OOM。

结合使用 Flink 1.16 Retry Lookup,保证退货表一定能 Join 到 reason 表。即使 reason 表更新较慢,它也能保证 Join 上。通过 Flink Retry Lookup 的方式,成本比较低。

7

接下来,讲一讲顾客表。顾客表跟退货表不一样,顾客表的数据量较大,它需要驱动更新。结合 Flink Table Store,希望能提供一个新的思路。

顾客表和订单表 Join,它只有订单 ID 和顾客 ID 的映射关系,以及顾客表的其它字段。顾客表没有订单表的主键。所以这里的需求是,我们需要给顾客表拿到订单表的主键,也就是订单 ID。

我们可以启动一个双流 Join 来使得顾客表拿到订单 ID,这个双流 Join 的 State 存储成本是 订单 ID 和顾客 ID 的映射关系,以及顾客表的内容,我们可以认为这个 State 不太大,它的成本可控,毕竟它没有保存庞大的订单表。

经过 Join 之后,这个顾客表就能拿到订单 ID,可以进行上述基于 FTS 的 Partial Update。

8

完成上游四张表 Partial Update 的写入之后,最后启动 Compaction 作业,它会不断地产生 Changelog。所以下游可以启动流读作业,来流读这张大宽表,写入下游 Clickhouse 和 ES 当中。除此之外,这张大宽表面向多引擎,可以进行 Ad-hoc 查询,你可以使用 Hive、Spark、Flink 或者 Trino 来实时查询。

为什么要选择 Flink Table Store 呢?因为 Flink Table Store 使用方便,能够低成本实时打宽。

三、V0.3:FTSV0.3 有什么能力来帮助上述场景

9

即将发布的 Flink Table Store 0.3,有哪些功能实现上述的场景?

第一个场景,全增量一体导入。在早期版本中,从 MySQL 把所有数据 Bulk Load 到一张表中。然后,将定期的增量数据 Load 到数仓当中,进行定期的调度作业。

10

这个流程链路较复杂,维护成本比较高。由于全量增量点位较难以对齐,所以全增量一起导入,后期不用维护。除此之外,需要存储有较强的写入、更新、删除数据的能力,才能撑得住大数据流量。

Flink Table Store 0.3 大幅增强全量阶段的写入存储,特别是写入时使用的对象存储,0.3 大幅增强吞吐能力,有比较好的吞吐性。

后续在 0.4 中,也将提供整库同步和 Schema Evolution 同步,将更好的提高入湖的用户体验。

11

第二个场景消息队列的流读。作为消息队列必须要好用,在不声明 Kafka 的情况下,Flink Table Store 表的流读,希望能做到 30 秒到 1 分钟的延迟,跟消息队列的顺序一致。并且 Flink Table Store 也支持多种啊读取模式。比如全增量一起的流读,每次读都能看到所有的数据。

除此之外,你可以通过 from-snapshot,从指定 snapshot-id 开始读增量。你也可以通过 from-timestamp,从指定时间开始读增量。你还可以指定 Latest,从最新数据,读增量。Flink Table Store 的消息队列跟 Kafka 完全对齐。

12

第三个场景,变更日志流读。

举个例子,如上图所示,当你声明主键之后:

  1. 插入一条数据,主键为 1,column_1 为 1.0.
  2. 再次插入了一条数据,主键仍为 1,column_1 为 2.0.
  3. 此时,对流作业进行流读,SUM 的结果应该是 3.0 还是 2.0?

简单的计算,SUM 的结果就是 3.0,因为出现过两条数据,所以加起来就是 3.0。但是,这两条数据是相同的主键,它在更新时应该产生撤回,正确答案应该是 2.0。

Flink Table Store 提供多种 Changelog Producer 模式:

  1. 比如 None,存储不产生 Changelog,交给 Flink SQL 产生。Flink SQL 流读的下游会产生一个相关节点,让下游流作业使用 Changelog Normalize 节点。这个节点的 Cost 比较大。
  2. 比如 Input,当 input 来自数据库 CDC 的输入,如果可以无条件信任 input,你可以选择 Input,来自数据库的 CDC 数据可以保证流读到正确的 Changelog。
  3. 在 Flink Table Store 0.3 中,提供了 Full-Compaction,随着 Full-Compaction 产生完全正确的 Changelog,对流作业的正确性,各种模式的支持非常有用,但是你需要平衡 Full-Compaction 的成本和多久进行一次 Full-Compaction 的时延。

13

第四个场景,流连接。存储对流式数仓到底起什么作用?我们主要规定了三个作用,即消息队列、临时数据可查、生态好。在 Flink Table Store 0.3,继续加强了生态。当前,流面对的挑战仍有很多,最大的挑战是 Join。典型的 Join 有四种模式可以支持。

第一个模式,双流 Join。假设拿到两个 CDC 的流,按照 Flink SQL 写法,Join 的结果就可以往下写了。此时,Join 要处理两条流,在 Streaming Join 中需要物化,在 State 中保存两个流物化的所有数据。假设 MySQL 中分库分表有 1000 万条,Streaming 中就要保存 1000 万条,而且如果有多个 Join,数据将会被重复的保存,造成大量的成本。

双流 Join 的好处是,Join 的语义非常正确,有保证,任何更新都能正确处理。但它缺点是,成本和性能有比较大的挑战,其成本非常高。

第二个模式,Lookup Join。假设定义一张叫表叫主流,主流过来需要 Join 补字段。此时,可以把维表当做镜像表,在维表数据来的时候,不断 Lookup 维表数据。Lookup Join 的好处是性能非常好,主表不会乱序,但无法解决维表的更新问题。

14

第三个模式,Partial Update。它可以帮助 Streaming 来做 Join 能力。Partial Up date 的本质是存储本身,具有通过组件来更新部分列的能力。如果两张表都有相同主键,它们可以分别进行 Partial Update。它的好处是性能非常好,给存储很多空间来优化性能。性能较好,成本较低。但它的缺点是需要有同主键。

第四个模式,Indexed Partial Update。它可以使用 Flink 补齐主键,只需要拿到该主键件和主表主键间的映射关系即可。其次,由于维表的数据量比主表数据量要小很多,所以成本可控。通过使用 Flink 补齐主键之后,以较小 State 解决多流 Join 的问题。

综上所述,我们希望提供尽可能多的 Join 模式,让大家根据自己的业务来选择需要的模式。

四、总结:回顾和项目信息

15

  1. 第一部分,我们分析目前 Streaming Data Warehouse 的问题。它的主要挑战是架构,我们在逐步解决。
  2. 第二部分,我们描述 Flink Table Store V0.3 核心解决的场景。
  3. 第三部分,我们将了讲 Flink Table Store V0.3 哪些功能能帮助上述案例。
  4. 第四部分,Flink Table Store 会继续加强 Streaming Data Warehouse,来解决更多问题。

如果有需求和问题,请联系我们!

16

Flink Table Store 作为 Apache Flink 的子项目,它有自己的用户文档。用户可以通过相关链接,咨询相关问题。与此同时,推荐大家入钉钉群,与我们直接沟通。

图片

点击查看直播回放和演讲 PPT


更多内容

img


活动推荐

阿里云基于 Apache Flink 构建的企业级产品-实时计算Flink版现开启活动:
99 元试用 实时计算Flink版(包年包月、10CU)即有机会获得 Flink 独家定制卫衣;另包 3 个月及以上还有 85 折优惠!
了解活动详情:https://www.aliyun.com/product/bigdata/sc

image.png

相关实践学习
基于Hologres轻松玩转一站式实时仓库
本场景介绍如何利用阿里云MaxCompute、实时计算Flink和交互式分析服务Hologres开发离线、实时数据融合分析的数据大屏应用。
Linux入门到精通
本套课程是从入门开始的Linux学习课程,适合初学者阅读。由浅入深案例丰富,通俗易懂。主要涉及基础的系统操作以及工作中常用的各种服务软件的应用、部署和优化。即使是零基础的学员,只要能够坚持把所有章节都学完,也一定会受益匪浅。
相关文章
|
9天前
|
DataWorks 数据挖掘 大数据
方案实践测评 | DataWorks集成Hologres构建一站式高性能的OLAP数据分析
DataWorks在任务开发便捷性、任务运行速度、产品使用门槛等方面都表现出色。在数据处理场景方面仍有改进和扩展的空间,通过引入更多的智能技术、扩展数据源支持、优化任务调度和可视化功能以及提升团队协作效率,DataWorks将能够为企业提供更全面、更高效的数据处理解决方案。
|
1月前
|
SQL 流计算 关系型数据库
基于OpenLake的Flink+Paimon+EMR StarRocks流式湖仓分析
阿里云OpenLake解决方案建立在开放可控的OpenLake湖仓之上,提供大数据搜索与AI一体化服务。通过元数据管理平台DLF管理结构化、半结构化和非结构化数据,提供湖仓数据表和文件的安全访问及IO加速,并支持大数据、搜索和AI多引擎对接。本文为您介绍以Flink作为Openlake方案的核心计算引擎,通过流式数据湖仓Paimon(使用DLF 2.0存储)和EMR StarRocks搭建流式湖仓。
354 4
基于OpenLake的Flink+Paimon+EMR StarRocks流式湖仓分析
|
1月前
|
消息中间件 人工智能 监控
Paimon x StarRocks 助力喜马拉雅直播实时湖仓构建
本文由喜马拉雅直播业务与仓库建设负责人王琛撰写,介绍了喜马拉雅直播业务的数据仓库架构迭代升级。文章重点分享了基于 Flink + Paimon + StarRocks 实现实时湖仓的架构及其成效,通过分钟级别的收入监控、实时榜单生成、流量监测和盈亏预警,大幅提升了运营效率与决策质量,并为未来的业务扩展和 AI 项目打下坚实基础。
218 5
Paimon x StarRocks 助力喜马拉雅直播实时湖仓构建
|
2月前
|
运维 监控 安全
选择主题1:实时计算Flink版最佳实践测评
本文介绍了使用实时计算Flink版进行用户行为分析的实践,涵盖用户行为趋势、留存分析、用户画像构建及异常检测等方面。与自建Flink集群相比,实时计算Flink版在稳定性、性能、开发运维和安全能力上表现更优,且显著降低了企业的IT支出和运维成本,提升了业务决策效率和系统可靠性,是企业级应用的理想选择。
83 32
|
2月前
|
存储 数据采集 大数据
Flink实时湖仓,为汽车行业数字化加速!
本文由阿里云计算平台产品专家李鲁兵(云觉)分享,聚焦汽车行业大数据应用。内容涵盖市场趋势、典型大数据架构、产品市场地位及能力解读,以及典型客户案例。文章详细介绍了新能源汽车市场的快速增长、大数据架构分析、实时湖仓方案的优势,以及Flink和Paimon在车联网中的应用案例。
192 8
Flink实时湖仓,为汽车行业数字化加速!
|
1月前
|
分布式计算 大数据 OLAP
AnalyticDB与大数据生态集成:Spark & Flink
【10月更文挑战第25天】在大数据时代,实时数据处理和分析变得越来越重要。AnalyticDB(ADB)是阿里云推出的一款完全托管的实时数据仓库服务,支持PB级数据的实时分析。为了充分发挥AnalyticDB的潜力,将其与大数据处理工具如Apache Spark和Apache Flink集成是非常必要的。本文将从我个人的角度出发,分享如何将AnalyticDB与Spark和Flink集成,构建端到端的大数据处理流水线,实现数据的实时分析和处理。
67 1
|
1月前
|
SQL 存储 数据挖掘
快速入门:利用AnalyticDB构建实时数据分析平台
【10月更文挑战第22天】在大数据时代,实时数据分析成为了企业和开发者们关注的焦点。传统的数据仓库和分析工具往往无法满足实时性要求,而AnalyticDB(ADB)作为阿里巴巴推出的一款实时数据仓库服务,凭借其强大的实时处理能力和易用性,成为了众多企业的首选。作为一名数据分析师,我将在本文中分享如何快速入门AnalyticDB,帮助初学者在短时间内掌握使用AnalyticDB进行简单数据分析的能力。
54 2
|
2月前
|
运维 监控 安全
实时计算 Flink 版最佳实践测评
本文介绍了结合电商平台用户行为数据的实时计算Flink版实践,涵盖用户行为分析、标签画像构建、业务指标监控和数据分析预测等场景。文章还对比了实时计算Flink版与其他引擎及自建Flink集群在稳定性、性能、开发运维和安全能力方面的差异,分析了其成本与收益。最后,文章评估了实时计算Flink版的产品内引导、文档帮助、功能满足情况,并提出了针对不同业务场景的改进建议和与其他产品的联动可能性。
68 2
|
1月前
|
缓存 监控 大数据
构建高可用AnalyticDB集群:最佳实践
【10月更文挑战第25天】在大数据时代,数据仓库和分析平台的高可用性变得尤为重要。作为阿里巴巴推出的一款完全托管的PB级实时数据仓库服务,AnalyticDB(ADB)凭借其高性能、易扩展和高可用的特点,成为众多企业的首选。本文将从我个人的角度出发,分享如何构建和维护高可用性的AnalyticDB集群,确保系统在各种情况下都能稳定运行。
36 0
|
1月前
|
数据采集 分布式计算 OLAP
最佳实践:AnalyticDB在企业级大数据分析中的应用案例
【10月更文挑战第22天】在数字化转型的大潮中,企业对数据的依赖程度越来越高。如何高效地处理和分析海量数据,从中提取有价值的洞察,成为企业竞争力的关键。作为阿里云推出的一款实时OLAP数据库服务,AnalyticDB(ADB)凭借其强大的数据处理能力和亚秒级的查询响应时间,已经在多个行业和业务场景中得到了广泛应用。本文将从个人的角度出发,分享多个成功案例,展示AnalyticDB如何助力企业在广告投放效果分析、用户行为追踪、财务报表生成等领域实现高效的数据处理与洞察发现。
55 0

相关产品

  • 实时计算 Flink版
  • 下一篇
    DataWorks