likes
comments
collection
share

实践|基于 RisingWave 和 StarRocks 的实时打宽+分析解决方案

作者站长头像
站长
· 阅读数 1

所谓的“打宽”,就是将明细表和可能来自多个数据源的多张维表进行关联,汇总成一个大宽表,便于后续处理分析的过程。

时至今日,打宽 + 实时分析仍是流处理领域最常见的场景,然而,这个场景依然有许多亟待解决的痛点。

在深入这些痛点之前,我们先回顾一下业内已经解决了什么:

1. 过去基于 StarRocks 的打宽方案

  • 业务数据库的 CDC 抽取: 如今主流的 MySQL、Postgres、MongoDB 等数据库同步均已被 RisingWaveFlinkCDC 等开源工具原生支持。
  • 实时写入到数仓中: 流行的数据仓库系统,如 StarRocks,其产品已支持相对高效的写入能力:
    1. 主键表: 这一表类型在 StarRocks 存储内部维护了主键索引,可以高效地处理更新和删除。RisingWave 写入 StarRocks 默认就需要这一表类型。
    2. 部分列更新: 非常适合大宽表下,每次更新只有少部分列(一般低于30%)被变更的场景。
    3. StreamLoad: StarRocks 支持通过 HTTP 进行数据批量写入,实测下来写入吞吐能满足绝大多数场景需求。
  • 小状态的数据清洗和打宽: 许多开源或商业的流处理软件都提供了标准 SQL支持,这使得数据清洗时不需要担心表达能力的缺失。

2. 大状态的无奈

但需要注意的是,不论是 FlinkSQL 还是 Materialize,在超大状态维护上都或多或少地会遇到一些挑战,用户需要在复杂的内存磁盘调优与牺牲状态大小这两害之间选其轻。例如 FlinkSQL 就提供了许多减少状态的技巧,包括但不限于时间窗口+Watermark,Lookup Join,状态清理(TTL)等功能,而同时用户也不得不去学习大状态下 Checkpoint 的调优方式。

但如果手里钞票充足的话,还有一种选择,就是采购单台数十万成本的大规格服务器。

实践|基于 RisingWave 和 StarRocks 的实时打宽+分析解决方案

回到我们最初的讨论,即使基本的 ETL(即 CDC → 数据清洗 → 数仓实时写入) 已被解决,行业内仍然有许多亟待解决的痛点:

  • 复杂流处理逻辑的大状态维护
  • 如何长时间地(例如数月)保留中间状态
  • 如何基于大宽表做实时物化视图

3. 实时打宽的最后一公里

相信有深入过以上问题的朋友都能意识到,这其中所缺乏的恰恰是一个面向流计算的大状态存储:

  • 它的存储成本必须低,不常访问的数据应当被放在相对廉价的存储上,例如 HDFS 或 S3。
  • 它应该能够高效地处理流 Join 的频繁更新。
  • 它应该可查询,从而能在一些查询固定的监控场景里,直接基于流计算结果构建实时指标视图。
  • 它应该能够迅速地从故障中恢复。

RisingWave 旨在提供的就是这样的能力。

在实时打宽这一场景里,RisingWave 能够在较低的机器成本下,利用存算分离的能力,无需调优技巧,来支撑一个过去难以维护的 Join 链路。

实践|基于 RisingWave 和 StarRocks 的实时打宽+分析解决方案

实践|基于 RisingWave 和 StarRocks 的实时打宽+分析解决方案

上图引用自 RisingWave 用户案例 “视源股份(CVTE)IT 流计算应用历程”,里面提到即使是 13 个表的 Join(如今已有数十个表的 Join),RisingWave 依然能够游刃有余地处理。

4. 完善的实时分析技术栈

随着 RisingWave 的打宽能力在许多用户场景里逐步被验证,我们也更多地将精力投入到对这一场景的全方面打磨。

在刚刚发布的 1.7 版本,我们优化了对 StarRocks 的写入,使得整个过程更加丝滑。

实践|基于 RisingWave 和 StarRocks 的实时打宽+分析解决方案

除了打宽,用户还可以将 RisingWave 视作一个数仓的实时缓存。在实时性要求低的场景,用户可以基于 StarRocks 完成离线分析,而当实时性无法满足的时候,用户就可以基于 RisingWave 的大宽表开发物化视图。在这套技术栈里,用户依照具体情况选择合适的技术即可。

除了通过 StarRocks Sink 写入外,RisingWave 也可以被用作 StarRocks 的外表,实现离线和在线的查询入口统一。

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,欢迎浏览我们的官网: