在银行数据平台中,日终全量跑批是常态,但越来越多的业务场景需要准实时增量更新能力。例如:个人网银上的今日交易流水需要秒级可见;贷后系统中的合同状态变更后,风控标签必须即刻刷新。Apache Hudi 作为湖仓一体生态中支持增量更新的排头兵,正在国内多家银行的实时数仓建设中落地。
银行为什么需要 Hudi?
传统 Hive 数仓的痛点: - 只支持 Append 写,无法对已有记录做 Update/Delete - 全量重刷成本高:一张10亿行的 DWS 表因为1%的变更需要全量重写 - 实时与离线割裂:实时流写入 Kafka,离线用 Hive 跑批,口径经常对齐不上
Hudi 提供了 COW(Copy On Write)和 MOR(Merge On Read)两种表类型,天然支持 Upsert 和增量查询,且与 Spark/Flink 深度集成。
Hudi 在银行场景的典型应用
场景一:客户画像标签实时刷新
银行客户画像宽表通常有数百列(资产、风险、行为、偏好等),每天来自数十个源系统的增量变更需要及时反映到宽表中。
传统做法:每日跑批全量覆写这张宽表,耗时长且资源消耗大。
Hudi 方案:将每个源系统的变更作为 UPSERT 写入 Hudi 表,只修改变动的列,不影响不变的行。
场景二:信用卡贷后状态追踪
信用卡从发卡到销户经历多个状态(正常-逾期-冻结-核销),每一步变更都需要时间版本追踪以便监管审计。
Hudi 方案:写入时使用 UPSERT 操作,key 为卡片 ID,combine 逻辑保留最新状态。利用 Hudi 的增量查询能力,每天日终跑批时只读取当天变更的记录,而非全表扫描。
场景三:反洗钱特征更新
反洗钱系统需要按日计算客户特征(如大额交易频次、资金快进快出模式)。部分特征是存量累计(如近30天累计交易金额),增量更新比全量计算效率高出数十倍。
from pyspark.sql import SparkSession
spark = SparkSession.builder \
.config("spark.serializer", "org.apache.spark.serializer.KryoSerializer") \
.config("spark.sql.extensions", "org.apache.spark.sql.hudi.HoodieSparkSessionExtension") \
.getOrCreate()
# 增量写入:只变更当天有活动的客户记录
df.write.format("hudi") \
.option("hoodie.table.name", "hudi_cust_feature") \
.option("hoodie.datasource.write.recordkey.field", "cust_id") \
.option("hoodie.datasource.write.precombine.field", "etl_ts") \
.option("hoodie.datasource.write.operation", "upsert") \
.mode("append") \
.save("/data/hudi/hudi_cust_feature")
COW vs MOR 选型建议
| 特性 | COW (Copy On Write) | MOR (Merge On Read) |
|---|---|---|
| 写入方式 | 每次UPSERT生成新Parquet文件 | 写入delta log,查询时合并 |
| 写入延迟 | 较高 | 低(只需写log) |
| 读取延迟 | 低(文件已合并) | 较高(需合并log+base文件) |
| 适用场景 | 读多写少、监管报表 | 写多读少、准实时特征 |
银行选型建议:DWS 层宽表使用 COW,因为下游查询频率高。DWD 层明细变更使用 MOR,因为变更频繁、需要低延迟写入。
增量查询实现
Hudi 的增量查询能力是其实时数仓能力的核心:
incremental_df = spark.read.format("hudi") \
.option("hoodie.datasource.query.type", "incremental") \
.option("hoodie.datasource.query.incremental.format", "latest_state") \
.load("/data/hudi/hudi_cust_feature")
某银行利用增量查询将 DWS 宽表的日终跑批时间从 3.5 小时降到 25 分钟:全量重算变为只处理当天有变更的 5% 客户。
部署架构
银行常见的 Hudi 部署架构是 Flink + Hudi:
[CDC源] -> [Kafka] -> [Flink] -> [Hudi MOR表] -> [Hudi COW表] -> [下游应用]
Flink 的 Hudi Sink 以分钟级频率将 Kafka 中的数据 upsert 到 Hudi MOR 表。日终通过 Spark 作业将 MOR 表 compaction 成 COW 表,供 Trino/Presto 低延迟查询。
总结
Apache Hudi 为银行从全量跑批到增量更新的演进提供了成熟的解决方案:UPSERT 能力让数仓从 Append-only 升级为支持行级变更;增量查询大幅降低日终跑批的数据扫描量;COW/MOR 双模根据读写比灵活选择。