所谓的"打宽",就是将明细表和可能来自多个数据源的多张维表进行关联,汇总成一个大宽表,便于后续处理分析的过程。
时至今日,打宽 + 实时分析仍是流处理领域最常见的场景,然而,这个场景依然有许多亟待解决的痛点。
在深入这些痛点之前,我们先回顾一下业内已经解决了什么:
1. 过去基于 StarRocks 的打宽方案
- 业务数据库的 CDC 抽取: 如今主流的 MySQL、Postgres、MongoDB 等数据库同步均已被 RisingWave、FlinkCDC 等开源工具原生支持。
- 实时写入到数仓中: 流行的数据仓库系统,如 StarRocks,其产品已支持相对高效的写入能力:
-
- 主键表: 这一表类型在 StarRocks 存储内部维护了主键索引,可以高效地处理更新和删除。RisingWave 写入 StarRocks 默认就需要这一表类型。
- 部分列更新: 非常适合大宽表下,每次更新只有少部分列(一般低于30%)被变更的场景。
- StreamLoad: StarRocks 支持通过 HTTP 进行数据批量写入,实测下来写入吞吐能满足绝大多数场景需求。
- 小状态的数据清洗和打宽: 许多开源或商业的流处理软件都提供了标准 SQL支持,这使得数据清洗时不需要担心表达能力的缺失。
2. 大状态的无奈
但需要注意的是,不论是 FlinkSQL 还是 Materialize,在超大状态维护上都或多或少地会遇到一些挑战,用户需要在复杂的内存磁盘调优与牺牲状态大小这两害之间选其轻。例如 FlinkSQL 就提供了许多减少状态的技巧,包括但不限于时间窗口+Watermark,Lookup Join,状态清理(TTL)等功能,而同时用户也不得不去学习大状态下 Checkpoint 的调优方式。
但如果手里钞票充足的话,还有一种选择,就是采购单台数十万成本的大规格服务器。
回到我们最初的讨论,即使基本的 ETL(即 CDC → 数据清洗 → 数仓实时写入) 已被解决,行业内仍然有许多亟待解决的痛点:
- 复杂流处理逻辑的大状态维护
- 如何长时间地(例如数月)保留中间状态
- 如何基于大宽表做实时物化视图
3. 实时打宽的最后一公里
相信有深入过以上问题的朋友都能意识到,这其中所缺乏的恰恰是一个面向流计算的大状态存储:
- 它的存储成本必须低,不常访问的数据应当被放在相对廉价的存储上,例如 HDFS 或 S3。
- 它应该能够高效地处理流 Join 的频繁更新。
- 它应该可查询,从而能在一些查询固定的监控场景里,直接基于流计算结果构建实时指标视图。
- 它应该能够迅速地从故障中恢复。
RisingWave 旨在提供的就是这样的能力。
在实时打宽这一场景里,RisingWave 能够在较低的机器成本下,利用存算分离的能力,无需调优技巧,来支撑一个过去难以维护的 Join 链路。
上图引用自 RisingWave 用户案例 "视源股份(CVTE)IT 流计算应用历程",里面提到即使是 13 个表的 Join(如今已有数十个表的 Join),RisingWave 依然能够游刃有余地处理。
4. 完善的实时分析技术栈
随着 RisingWave 的打宽能力在许多用户场景里逐步被验证,我们也更多地将精力投入到对这一场景的全方面打磨。
在刚刚发布的 1.7 版本,我们优化了对 StarRocks 的写入,使得整个过程更加丝滑。
除了打宽,用户还可以将 RisingWave 视作一个数仓的实时缓存。在实时性要求低的场景,用户可以基于 StarRocks 完成离线分析,而当实时性无法满足的时候,用户就可以基于 RisingWave 的大宽表开发物化视图。在这套技术栈里,用户依照具体情况选择合适的技术即可。
除了通过 StarRocks Sink 写入外,RisingWave 也可以被用作 StarRocks 的外表,实现离线和在线的查询入口统一。
ini
CREATE EXTERNAL RESOURCE rw_jdbc
PROPERTIES (
"type"="jdbc",
"user"="postgres",
"password"="",
"jdbc_uri"="jdbc:postgresql://risingwave-standalone:4566/dev",
"driver_url"="https://repo1.maven.org/maven2/org/postgresql/postgresql/42.3.3/postgresql-42.3.3.jar",
"driver_class"="org.postgresql.Driver"
);
CREATE EXTERNAL TABLE users (
id BIGINT,
description VARCHAR(255),
name TEXT,
created_at DATETIME
) ENGINE=jdbc
properties (
"resource"="rw_jdbc",
"table"="users"
);
5. 未来展望
即使大状态的问题解决了,我们仍然需要面对 Schema change 的挑战。上游 MySQL 表加列了,下游的 StarRocks 是否能同步加列?RisingWave 自身的表是否也能同步加列?
我们看到有些行业实践能够自动捕获上游的 DDL,同时对 StarRocks 也进行加列。未来我们或许也会提供类似的能力。目前而言,RisingWave 提供了手动的加减列功能,我们仍然在围绕这一能力不断加强。
关于 RisingWave
RisingWave 是一款分布式 SQL 流处理数据库,旨在帮助用户降低实时应用的的开发成本。作为专为云上分布式流处理而设计的系统,RisingWave 为用户提供了与 PostgreSQL 类似的使用体验,并且具备比 Flink 高出 10 倍的性能以及更低的成本。
🧑💻想要了解和探索 RisingWave,欢迎浏览我们的官网:
🔧如果你还不知道如何上手 RisingWave,请体验中文入门教程:www.risingwavetutorial.com/
💻想要更深入地理解并使用 RisingWave,请阅读中文用户文档:zh-cn.risingwave.com/docs