3. 批流一体核心概念:批处理与流处理的区别、Lambda架构与Kappa架构、Flink在金融图谱中的角色

在金融图谱构建中,数据源天然具有批量快照(如每日持仓、月度财报)与实时事件(如交易流水、舆情推送)的双重特征。传统架构将两条路径割裂,导致模型不一致、运维成本高。本章从批与流的本质差异出发,剖析Lambda与Kappa两种主流架构的取舍,并明确Flink在统一处理层中的核心定位。

3.1 批处理与流处理的本质差异

批处理与流处理并非简单的“快与慢”之分,而是在数据边界、时间语义和一致性模型上存在根本区别。

对比维度 批处理 (Batch) 流处理 (Streaming)
数据边界 有界数据集(文件、分区表) 无界数据流(持续到达的事件)
触发方式 定时调度(如每小时/每天) 事件驱动(记录到达即处理)
延迟 分钟级~天级 毫秒级~秒级
计算模型 全量扫描 + 聚合 增量计算 + 状态维护
容错机制 任务重跑(幂等输出) Checkpoint + 精确一次语义
典型场景 历史回测、日终报表、图谱全量重建 实时风控、交易链路追踪、动态标签
关键认知:批处理是“有限数据 + 确定性时间窗口”的计算,流处理是“无限数据 + 事件时间”的持续计算。金融图谱中,实体关系的新增与更新往往是流式的,而历史关系校验与全量快照导出则是批式的。

3.2 Lambda架构与Kappa架构对比

为解决批流割裂问题,业界先后提出Lambda与Kappa两种架构模式。下图展示了两种架构在金融图谱场景下的核心差异。

Lambda 架构 vs Kappa 架构(金融图谱场景) Lambda 架构 数据源(Kafka / 文件 / 数据库CDC) 批处理层(Spark/Hive) 全量图谱快照 流处理层(Flink) 实时增量图谱 合并服务层(HBase/ES) ⚠ 问题:两套代码逻辑、两套运维、 批流结果不一致时排查困难 Kappa 架构 数据源(Kafka 统一接入) 统一流处理(Flink) 实时图谱 + 状态回溯 结果存储(Kafka + 状态后端) ✅ 优势:单一处理引擎、统一代码、 通过数据重放实现“批”效果

3.2.1 Lambda架构的适用场景

  • 历史数据回溯:需要基于T+1全量数据重新计算图谱指标(如PageRank、社区发现)。
  • 监管合规报表:要求精确到秒级的日终快照,批处理层提供可审计的确定性输出。
  • 混合存储策略:批路径写入宽表存储(如ClickHouse),流路径写入在线KV存储(如Redis)。

3.2.2 Kappa架构的适用场景

  • 实时图谱更新:实体关系变更频繁,需要秒级反映在图谱查询中。
  • 事件溯源:所有图谱变更以事件日志形式存储在Kafka中,支持任意时间点回溯。
  • 简化运维:团队只需维护一套Flink作业,降低代码与部署复杂度。
架构选型建议:金融图谱项目初期建议从Kappa架构起步,利用Flink的批流一体能力处理大部分场景;仅在需要大规模历史重算或监管审计场景时,引入批处理层作为补充,形成“以Kappa为主、Lambda为辅”的混合模式。

3.3 Flink在金融图谱中的角色

Flink在金融图谱批流一体链路中承担统一计算引擎的角色,其核心能力覆盖数据接入、图谱构建、状态管理与结果输出全流程。

Flink 在金融图谱批流一体链路中的角色 数据输入层:Kafka(实时事件)、HDFS/OSS(批量文件)、MySQL CDC(增量变更) Flink 统一计算引擎 DataStream API(流处理) Table API / SQL(批流统一) State / Timer(状态与事件时间) 输出层:图数据库(Neo4j/JanusGraph)、搜索引擎(Elasticsearch)、消息队列(Kafka)

3.3.1 Flink在金融图谱中的关键能力

能力维度 具体实现 金融图谱价值
事件时间处理 Watermark + 窗口(Tumble/Slide/Session) 处理乱序交易事件,准确计算时间窗口内的关联关系
状态管理 ValueState / MapState / BroadcastState 维护实体最新属性、关系计数、风险状态机
精确一次语义 Checkpoint + 两阶段提交Sink 保证图谱数据不重不丢,满足金融审计要求
批流一体 同一套SQL/API处理有界与无界数据 复用图谱构建逻辑,降低开发与维护成本
异步I/O AsyncIO 连接外部存储 高效查询外部黑名单、字典库,不阻塞主链路

3.3.2 典型链路示例:实时图谱边构建

-- Flink SQL 示例:从交易流水实时构建图谱边
CREATE TABLE trade_events (
  trade_id    STRING,
  from_entity STRING,
  to_entity   STRING,
  amount      DECIMAL(18,2),
  event_time  TIMESTAMP(3),
  WATERMARK FOR event_time AS event_time - INTERVAL '5' SECOND
) WITH (
  'connector' = 'kafka',
  'topic'     = 'trade-events',
  'format'    = 'json'
);

-- 每5分钟滚动窗口,统计实体间交易频次与金额
INSERT INTO graph_edges_sink
SELECT
  from_entity,
  to_entity,
  COUNT(*) AS trade_count,
  SUM(amount) AS total_amount,
  TUMBLE_START(event_time, INTERVAL '5' MINUTE) AS window_start
FROM trade_events
GROUP BY
  from_entity,
  to_entity,
  TUMBLE(event_time, INTERVAL '5' MINUTE);
实践注意:金融图谱中实体ID的归一化(如统一社会信用代码、身份证号)需要在Flink中提前完成,否则会导致图数据库中产生重复节点。建议在Source阶段使用BroadcastState加载映射字典,实现实时ID转换。

3.4 本章小结

  • 批与流的核心差异在于数据边界与时间语义,金融图谱需要同时支持两种模式。
  • Lambda架构适合历史重算与监管场景,Kappa架构适合实时更新与简化运维,推荐以Kappa为主、Lambda为辅。
  • Flink通过事件时间、状态管理、精确一次语义和批流一体API,成为金融图谱构建的统一计算引擎。