Flink维表方案选型
Iceberg
Iceberg 采用全量预加载数据的方式将维度表数据全部加载到内存中进行关联,虽然可以避免频繁访问外部数据库,但对计算节点的内存消耗很高,不能适用于数量很大的维度表。除此之外,当 Iceberg 维表数据更新后,可能会存在一定的延迟,导致 Lookup Join 获取的数据不是最新的。这是因为 Iceberg 的数据更新操作(如插入、删除、修改)涉及到数据的重写和元数据的更新等复杂过程。最后,Iceberg 不适用于数据频繁写入的场景,频繁的写入 Iceberg 会产生大量的小文件。这会增加 Lookup Join 时文件系统的开销,因为需要打开和读取更多的文件。可以通过定期进行文件合并操作(Iceberg 支持文件合并策略)来减少小文件的数量,提高文件系统的读取效率,进而提升 Lookup Join 性能。
Paimon
Apache Paimon 是一个湖格式,结合 Flink 及 Spark 构建流批处理的实时湖仓一体架构。Paimon 创新的结合湖格式与 LSM 技术,给数据湖带来了实时流更新以及完整的流处理能力。Paimon 表支持作为维表做 Lookup Join,相较于 Iceberg 表,Paimon 表的优势在于实现了更好的缓存、以及支持更大的数据量。Lookup Join Iceberg 表时会将所有数据缓存在内存中,所以数据量大时容易造成 OOM,但是 Paimon 表支持内存、本地磁盘以及远端存储三级存储策略,所以对维表的数据量没有太大的限制。
Paimon 针对维表点查做 repartition 等优化,平衡了内存使用与性能。在维表数据 100w 行,单并发的场景下可以支持的查询 QPS 达到 50000 QPS。使用 Paimon 作为维表,其支持三种方式产生 CDC 数据,因此能很好的支持双流 join 查询维表。Paimon 作为 Flink 维表的缺点在于数据更新的速度没有 kv 快,但也可以覆盖大部分业务场景。
HBase 与 Redis
HBase 与 Redis 作为 KV 存储在 Flink 维表应用时具有相似性。两者都适用于需要维表写入立即可见的极端情况。同时使用 KV 作为 Flink 维表的成本比湖存储要高。
Doris
Doris 是一个基于 MPP 架构的分布式列式存储数据库,具有高性能、高可用性和高扩展性,适用于大规模数据分析和实时查询场景,特别是对实时性要求较高的场景。但它对实时性要求极高的场景可能不如 HBase,且数据更新和删除操作相对较慢。目前 Flink 对 Doris 的点查时间延迟在几百毫秒,相较于使用 Paimon 作为维表没有优势。
Hologres
针对 Hologres 的点查仅仅在使用主键作为 Join Key 的场景下才能够达到毫秒级延迟。
总结
点查时间延迟 | 内存资源开销 | 支持双流 Join | 稳定性 | 建议维表大小 | 维表实时性 | 存储状态 | |
---|---|---|---|---|---|---|---|
MySQL | 100毫秒级 | 开销低 | 支持 | 稳定性低 | GB级别 | 读入即可见 | |
Iceberg | 毫秒级 | 开销较大 | 不支持 | 文件格式,稳定性高 | 100MB级别 | 存在ck延迟 | |
Paimon | 10毫秒-100毫秒 | 开销适中 | 支持 | 文件格式,稳定性高 | GB级别 | 存在ck延迟 | |
Doris | 100毫秒级 | 开销低 | 不支持 | 服务,稳定性低 | GB级别 | 读入即可见 | |
Hologres | 毫秒级(主键查询)/ 100毫秒级(非主键查询) | 开销低 | 支持 | 服务,稳定性低 | GB级别 | 读入即可见 | |
HBase | 毫秒级 | 开销低 | 不支持 | 服务,稳定性低 | TB级别 | 读入即可见 | |
Redis | 毫秒级 | 开销低 | 不支持 | 服务,稳定性低 | GB级别 | 读入即可见 |