1. 迁移与现代化改造总览

当企业决定把既有的大数据与机器学习负载迁移到 Databricks 时,真正要回答的并不是“换一个平台跑同样的作业”,而是“如何把数据、计算、治理和协作方式一起升级”。Databricks 的核心价值可以概括为三层:以 Delta Lake 为存储底座,把数据湖的开放性与数据仓库的事务能力合并;以 Spark 与 Photon 引擎为计算底座,统一批处理、流处理和交互式分析;以 Unity Catalog 和 Workspace 为治理与协作底座,让数据、模型、Notebook、作业和权限在同一套命名空间下被管理。迁移因此不是一次简单的“搬家”,而是一次围绕数据架构、计算模式和组织协作方式的现代化改造。

一、迁移驱动力:为什么要迁,迁到哪里

常见的迁移驱动力有四类。第一类是成本与弹性:自建 Hadoop 集群在业务波峰时扩容慢、波谷时资源闲置,而 Databricks 的按需集群和自动伸缩可以把计算成本与业务负载对齐。第二类是技术债:旧平台上的 Hive 元数据、手写 MapReduce、分散的调度脚本难以维护,迁移到 Unity Catalog 后可以统一表、视图、函数和权限。第三类是实时与 AI 需求:业务要求从 T+1 报表走向分钟级甚至秒级指标,同时希望在同一份数据上训练和部署模型,Databricks 的 Structured Streaming 与 MLflow 正好覆盖这条链路。第四类是治理与合规:数据分散在多个系统、权限靠人工维护,迁移到统一目录后可以做到列级权限、审计和血缘追踪。

迁移的目标形态通常不是“把旧系统原样复制”,而是“在 Databricks 上重建一条更短的数据链路”。例如,原来从 Kafka 到 HDFS 再到 Hive 再到报表的三段式链路,迁移后可以变成 Kafka 到 Delta 表再到 Databricks SQL 的两段式链路,中间减少一次落盘和一次元数据同步。

二、典型现代化改造场景

场景一:数据仓库现代化。把传统数仓中的维度模型、缓慢变化维和聚合表迁移到 Delta Lake,利用 MERGE INTO 实现增量更新,用物化视图或流式表替代夜间批量重算。场景二:数据湖治理。把散落在 S3、ADLS 上的 Parquet 文件注册为 Unity Catalog 中的外部表或托管表,补上 Schema、分区和权限。场景三:实时化改造。把原本按小时调度的批作业改写成 Structured Streaming,用 Delta 表作为流式 sink,并设置 checkpoint 保证断点续传。场景四:机器学习工程化。把 Notebook 中的实验代码抽成 Feature Store 特征和 MLflow 实验,再用 Model Serving 暴露推理接口。场景五:平台整合。把多个小集群、多个调度器合并到 Databricks Workflows,减少运维面。

三、整体方法论:评估、分层、迁移、验证、优化

迁移方法论可以落成一条可执行的主线。第一步是资产盘点:列出所有数据源、表、作业、依赖和 SLA,标注哪些是核心链路、哪些可以下线。第二步是目标架构设计:确定存储层用托管表还是外部表,计算层用通用集群还是 SQL 仓库,治理层如何划分 Catalog 和 Schema。第三步是分层迁移:先迁元数据和只读表,再迁增量写入作业,最后迁实时链路和机器学习任务。第四步是验证:用行数、主键唯一性、金额汇总和抽样比对来确认数据一致。第五步是优化:根据 Photon 执行计划和 Spark UI 调整分区、Z-Order 和文件大小。

Databricks 迁移与现代化改造总体架构 从分散数据源到统一湖仓,再到治理与消费的端到端链路 数据源层 业务数据库 Kafka 消息流 文件 / 对象存储 旧 Hive 数仓 外部 API 采集 Databricks 湖仓核心 Delta Lake 存储层 ACID 事务 · 时间旅行 · Schema 演进 Spark + Photon 计算层 批处理 · 流处理 · 交互式 SQL Workflows 调度层 任务依赖 · 重试 · 告警 MLflow + Feature Store 实验追踪 · 特征复用 · 模型注册 注册 治理与消费 Unity Catalog 表 · 视图 · 权限 · 血缘 Databricks SQL BI 报表 · 即席查询 Model Serving 在线推理 · 批量评分 Notebook 协作 探索 · 可视化 · 共享 审计与合规 操作日志 · 数据脱敏 迁移方法论主线 资产盘点 → 目标架构设计 → 分层迁移 → 数据一致性验证 → 性能与成本优化

四、一个可参考的迁移示例

假设某零售企业要把旧 Hive 数仓中的订单事实表迁移到 Databricks。旧表按天分区,每天凌晨全量重算,SLA 是早上 7 点前出报表。迁移方案可以这样设计:在 Unity Catalog 中创建 retail.silver.orders 托管 Delta 表,用 Auto Loader 从对象存储增量读取新文件,用 MERGE INTO 按订单号做 upsert,再用 Databricks SQL 创建聚合视图供 BI 查询。验证时对比旧表和新表的行数、订单金额总和以及最近 7 天分区的主键唯一性。如果发现金额偏差,优先检查小数精度和汇率换算逻辑,而不是先怀疑引擎。

-- 示例:订单表增量合并(参数为教学示例)
MERGE INTO retail.silver.orders AS t
USING retail.staging.orders_delta AS s
ON t.order_id = s.order_id
WHEN MATCHED AND s.updated_at > t.updated_at THEN UPDATE SET *
WHEN NOT MATCHED THEN INSERT *;

-- 验证:行数与金额汇总比对
SELECT COUNT(*) AS cnt, SUM(amount) AS total FROM retail.silver.orders;
SELECT COUNT(*) AS cnt, SUM(amount) AS total FROM legacy_hive.orders;
迁移初期建议保留旧链路作为回退路径,等新链路连续稳定运行一个完整业务周期后再下线旧作业。回退路径的存在不是技术不彻底,而是对业务连续性的基本尊重。

五、判断迁移是否成功的几个信号

第一,数据一致性通过:核心表的行数、主键唯一性和金额汇总与旧系统一致,偏差在可解释范围内。第二,SLA 达标:关键报表的产出时间不晚于旧系统,甚至更早。第三,成本可观测:通过集群标签和账单分析,能说清每个作业花了多少钱。第四,治理可落地:新表默认进入 Unity Catalog,权限不再靠人工脚本维护。第五,团队愿意用:分析师和工程师开始主动在 Databricks 上建新表、写新作业,而不是继续绕回旧平台。这五个信号同时出现,才说明迁移真正完成了从“能跑”到“好用”的跨越。

不要把“作业能跑通”当成迁移完成的标志。迁移的终点是业务方在新平台上稳定拿到可信数据,而不是工程师在 Notebook 里看到一条成功日志。