金融图谱批流链路从入门到实战 - 第2节

2.1 批处理与流处理的区别

在金融图谱场景中,数据源天然分为“静态存量”与“动态增量”两类。批处理与流处理正是针对这两种数据形态设计的计算范式。理解两者的本质差异,是掌握批流一体架构的前提。

对比维度 批处理 (Batch Processing) 流处理 (Stream Processing)
数据范围 有界数据集(全量历史) 无界数据流(持续到达)
触发方式 定时调度(如 T+1 凌晨) 事件驱动(记录到达即处理)
延迟要求 分钟级 ~ 小时级 毫秒级 ~ 秒级
计算语义 全量扫描、精确一次 增量计算、至少一次 / 精确一次
典型场景 日终报表、风控模型训练 实时反欺诈、行情推送
存储模式 HDFS / 数仓分区表 Kafka / Pulsar 消息队列
金融图谱视角: 批处理负责构建“实体-关系”的基线快照(如全量企业股权结构),流处理负责实时更新边与属性的变更(如新增担保关系、风险等级变动)。两者缺一不可。

2.2 批流一体的技术演进

批流一体并非一蹴而就,其技术路线经历了三个主要阶段:

  1. 分离期(2010–2015): 批处理用 MapReduce / Hive,流处理用 Storm / Spark Streaming(微批)。两套代码、两套运维,数据口径难以对齐。
  2. 融合期(2016–2020): Flink 提出“批是流的特例”,统一 Runtime;Spark Structured Streaming 改进连续处理模式。同一引擎可切换批/流语义。
  3. 原生一体期(2021–至今): 流式数仓(Kafka + Flink + Iceberg)、流式湖仓(Paimon / Hudi)实现存储与计算的双重统一,金融图谱开始采用“实时打宽 + 离线回溯”混合链路。
演进本质: 从“用两个引擎做两件事”变为“用一个引擎做所有事,按需选择延迟与准确性”。

2.3 Lambda 架构与 Kappa 架构对比

批流一体在系统架构层面最经典的两种模式是 Lambda 与 Kappa。下图展示了两种架构的核心组件与数据流向。

Lambda 架构与 Kappa 架构对比 Lambda 架构 数据源 (Kafka) 分流层 批处理 (Hive/Spark) 流处理 (Flink) 合并服务层 图谱查询服务 Kappa 架构 数据源 (Kafka) 统一日志层 流处理 (Flink) 图谱查询服务 重放 Kafka 日志 实现历史回溯

2.3.1 Lambda 架构

Lambda 架构由 Nathan Marz 提出,核心思想是“用两条路径分别保证低延迟与高准确性”:

  • 批路径(Batch Layer): 存储全量原始数据,定期(如每小时)重新计算完整结果,保证数据绝对准确。
  • 流路径(Speed Layer): 实时处理增量数据,提供秒级延迟的近似结果,弥补批路径的滞后。
  • 合并服务层(Serving Layer): 合并批结果与流结果,对外提供统一查询视图。
金融图谱中的痛点: 两套代码逻辑必须保持一致,但实际项目中常出现“批流不一致”问题——例如批处理用 Hive SQL 计算股权穿透,流处理用 Flink DataStream 实现,口径差异导致图谱查询结果在日切时出现跳变。

2.3.2 Kappa 架构

Kappa 架构由 Jay Kreps 提出,核心思想是“只用一套流处理引擎,通过日志重放实现历史计算”:

  • 统一日志层: 所有数据以不可变日志形式存储在 Kafka 中,支持按偏移量或时间戳回溯。
  • 单一流处理: 使用 Flink / Kafka Streams 同时处理实时数据与重放的历史数据。
  • 无合并层: 不需要批路径,架构更简洁,但要求流引擎具备“状态快照”与“精确一次”语义。
适用条件: Kappa 架构要求数据源可重放(Kafka 保留足够长的日志),且计算逻辑支持幂等写入。在金融图谱中,适用于“实时关系更新 + 短周期回溯”的场景(如日内担保链变更)。

2.3.3 架构选型对比

评估维度 Lambda 架构 Kappa 架构
代码复杂度 高(两套代码 + 合并逻辑) 中(一套代码,需处理回溯)
数据准确性 高(批路径保证最终一致) 高(需流引擎支持精确一次)
运维成本 高(维护两套集群与调度) 中(依赖 Kafka 日志保留策略)
金融图谱适配 适合日终全量重建图谱 适合实时增量 + 短周期回溯
典型工具链 Hive + Spark + Flink + HBase Kafka + Flink + 状态后端 (RocksDB)
实战建议: 金融图谱项目初期建议采用 Lambda 架构保证数据准确性,待流引擎稳定性验证通过后,逐步向 Kappa 架构演进,最终实现“批流一体”的单一技术栈。