ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

数据平台架构演进:从单机批处理到湖仓一体与智能化数据底座

数据平台架构演进:从单机批处理到湖仓一体与智能化数据底座 做数据平台这行十年从最早的单机跑批到如今的湖仓一体和大模型驱动的智能数据底座回头看这条演进路每一次架构调整本质上都在回答同一个问题数据规模变大之后系统该怎么活下来业务该怎么跑得更快。这篇文章结合我操盘过的几次大规模数据平台重构经历把架构演进的核心思路、关键选型和踩坑记录整理出来希望对正在搞数据平台、数据中台或者智能化基建的朋友有实际参考价值。我直接把整条线的底层逻辑讲透为什么当初的架构撑不住了中间为什么换了那么多套技术栈以及现在大家讨论的Transformer、MoE、Agent这些新架构对数据平台又意味着什么。1. 数据平台架构的四个演进阶段1.1 从单机到集群数据平台的第一道坎早期绝大多数公司的数据平台都长一个样一台高性能数据库服务器几个定时脚本凌晨跑批出报表。2015年前后我带团队维护的报表系统就是这种架构MySQL单库撑所有业务报表任务靠Linux cron调度ETL逻辑全部写在存储过程里。这套架构在最开始是合理的团队小、业务简单、数据量级在百万行以内单机MySQL能扛住。但数据量一旦越过千万级问题就开始集中爆发跑批时间从半小时涨到四五个小时报表越出越慢OLTP业务和OLAP查询互相抢资源。最难受的是扩不了容一台机器的CPU和磁盘到了上限加机器又不知道怎么把数据拆开。这时候我们做的第一件事就是往分布式架构迁移。数据库从单机MySQL拆成主从复制读写分离报表查询走从库写操作留在主库再往后数据量继续涨开始做分库分表按业务域和时间维度把大表切成小表。这一步是数据平台架构演进的起点核心思路就是把数据拆散把计算分散让每台机器只处理自己那一份。这个过程里踩过的最大坑是分库分表之后跨库join完全没法做了。业务方当时提了一个需求要关联订单表和用户表做分析但两张表已经分到了不同的库。最后只能用中间表拼接在应用层做数据聚合查询效率虽然不如数据库join但至少系统没有宕机。后来我们总结出一个经验分库分表不是万能药它解决的是写入瓶颈和单表数据量问题同时把复杂度转移给了应用层。1.2 大数据生态入场Hadoop不是银弹到了2017年业务数据量彻底失控日增数据到了亿级分库分表也兜不住了。磁盘占用、查询性能、跑批时间全面告急我们才开始引入Hadoop生态用HDFS做分布式存储用Hive做离线数仓用Spark替换掉跑批脚本里的MapReduce。这个阶段是我个人认为整个演进过程中最关键的一次转折因为它改变了整个团队的思维模式以前是想着怎么把数据塞进数据库现在是想着怎么把数据放到分布式文件系统上再通过计算引擎去读。数据平台第一次真正意义上实现了“存储和计算分离”的基础形态HDFS只管存Spark/Yarn只管算互不干扰。但Hadoop也不是银弹。Hive跑SQL是真的慢一个简单的GROUP BY要跑几分钟因为Hive底层是MapReduce写一次磁盘读一次磁盘中间过程全是IO开销。后来我们用Spark SQL替换了大部分Hive任务内存计算比磁盘迭代快了一个数量级。另外Hadoop集群的运维成本极高NameNode的元数据压力、小文件导致的NameNode内存暴涨、Yarn队列资源争抢这些坑我们几乎全踩了一遍。这里分享一个重要的经验引入大数据技术栈先算清楚投入产出比。不是所有场景都需要上Hadoop如果数据量还在百万级别单机数据库加索引优化就够了。我当时见过一个团队数据量才几百万行就急着上数仓结果集群搭好了业务需求没几个运维成本倒是翻了几倍。1.3 实时与离线双轨Lambda架构的取舍Hadoop体系稳定跑了两年之后业务方对数据时效性的要求开始提升。运营要看实时的大屏数据风控要实时拦截异常交易推荐系统要实时更新用户画像离线数仓T1的时效根本满足不了。我们又引入了Kafka加Flink这套实时链路形成了经典的Lambda架构。Lambda架构听起来很美离线批处理保证全量数据的准确性实时流处理保证低延迟两条链路最终在服务层合并。实际做的时候才发现双链路意味着双倍的开发和维护成本。离线逻辑写一套实时逻辑再写一套同一份指标在两条链路上算出来的结果对不上这是常态因为统计口径、数据到达时间、窗口边界定义很难做到完全一致。我们当时有一个核心指标离线算出来是98.2%实时算出来是97.8%差了0.4个百分点业务部门天天拿这个质疑数据质量。后来没办法只能把指标口径统一离线跟实时共用同一套指标定义并且在实时任务里加了对账逻辑每到凌晨用离线结果校准实时结果。这个阶段的另一个重要经验是不是所有数据都需要实时处理。我见过不少团队为了追时髦把用户画像、行为分析全部改成实时流结果Flink集群的资源消耗翻了好几倍业务价值却没有任何提升。实时链路的建设应该以业务需求为驱动能用T1解决的别上实时能用分钟级解决的别上秒级。1.4 湖仓一体数据平台架构的转折点Lambda架构解决了实时离线问题但新的麻烦来了数据湖和数据仓库两套体系并存数据冗余严重同一个文件在HDFS有一份在Hive表里有一份在Kafka里还有一份存储成本不断上升。更麻烦的是业务方做数据分析时要同时面对数据湖里的原始文件和数仓里的建模表数据质量、数据权限、数据血缘全都是一笔糊涂账。这时候湖仓一体架构进入了我们的视野。湖仓一体的核心不是做一个新组件而是把数据湖的灵活性和数据仓库的规范性结合起来底层用Iceberg这样的表格式管理HDFS上的数据文件支持ACID事务、时间旅行、Schema演进上层继续用Spark、Flink做计算用统一的元数据服务管理所有数据资产。我们落地湖仓一体的时候最重要的感受是元数据管理变成了整个平台的核心。以前Hive的元数据只管理数仓表HDFS上的原始文件没人管现在Iceberg把两类数据统一管理起来了数据血缘、数据权限、数据质量规则都有了统一入口。这也是后来我们做数据治理的基石没有统一的元数据底座治理就是空谈。2. 从数据仓库到数据中台服务化是必经之路2.1 为什么一定要做数据服务化数仓架构稳定之后新的问题出现在数据消费端。业务系统接数据的方式千奇百怪有的直接连Hive查有的让数据团队跑好数据推到MySQL有的要接口实时调。每个业务方来要数据数据团队就得写一次导出脚本、做一次接口开发大量重复劳动而且数据权限完全失控。这时候我们才开始规划数据中台核心就是把数据变成服务。底层还是数据湖加数仓但上面加了一层统一的数据服务层对外提供标准化的API接口。业务方要数据不再直接连库查而是通过数据服务平台申请权限、订阅API。这个架构调整带来的收益非常明显数据团队从“数据搬运工”变成了“数据服务商”开发一次接口所有业务方复用权限控制、调用监控、限流熔断全部在服务层统一处理。数据服务的调用量从每天几万次涨到上千万次平台依然稳定。但这个过程中有一个非常关键的架构决策数据服务层的粒度怎么定。太粗了接口就是给报表系统用的业务方用不了太细了一个查询拆成十几个接口网络开销巨大。我们最终的做法是围绕业务实体来设计API用户、订单、商品、门店、流量各一套每个实体提供明细查询、聚合查询、批量导出三个基础接口这样即满足大部分业务场景又不需要维护海量接口。2.2 微服务架构与分布式任务调度的坑中台化之后数据平台自身也开始微服务化。以前是一个大单体应用管调度、管元数据、管数据质量、管API网关全写在一个工程里改一个模块就要全量发布风险极高。我们用了大半年时间把整个数据平台拆成了十几个微服务围绕SpringCloud生态构建服务治理能力。微服务化之后第一个头疼的问题就是分布式定时任务。以前在单体应用里定时任务用Quartz就搞定了微服务化之后任务分散在各个服务里多实例部署环境下同一个任务可能会被多个实例同时触发造成数据重复处理、接口重复调用。我们当时对比了主流的分布式任务调度方案最终选择用XXL-JOB看中的是它的部署简单和可视化运维能力。核心配置就是注册中心地址、执行器端口和任务路由策略任务分片广播、失败重试、超时控制都内置好了。但有几个坑必须提醒一是任务执行日志要单独接日志系统不然排查问题要登录到具体执行机器上去看特别痛苦二是任务并发度要控制好如果一个任务同时分给10个分片执行而下游数据库扛不住并发就会出现连接池打满的问题。我们就被这种问题坑过一次分片任务把业务库的连接数全部占满最后只能把分片粒度调小、加上限流策略。分布式任务调度的核心就一句话任务分片是手段幂等是底线。不管你用XXL-JOB还是别的框架所有任务的处理逻辑必须做幂等设计因为分布式环境下任务重复执行是必然事件不是偶然事件。2.3 元数据管理与数据血缘数据平台的“大脑”数据服务化之后暴露出来的另一个问题是数据资产混乱。业务方在数据平台上看到一个指标叫“销售额”但不知道这个指标怎么算出来的、数据源头在哪里、哪个团队在维护。数据团队内部也一样一个表被人改坏了根本不知道会影响下游哪些报表和API。我们解决这个问题的方式是自研了一套元数据管理系统通过解析Spark SQL和Flink SQL的语法树自动提取表级和字段级的数据血缘关系。每跑完一个任务就能自动生成“上游表到下游表”的依赖关系图数据质量出问题的时候可以靠血缘关系快速定位影响范围。数据血缘这个东西做的时候很枯燥但做出来之后价值极大。有一次一个上游业务库的某个字段值被开发改错了导致下游几十张数仓表数据异常如果放到以前可能要好几天才能查清楚影响范围有了血缘系统之后当天就自动给所有下游负责人发了通知数据修复的沟通成本大幅降低。元数据管理还有一个容易被忽视的点数据字典的维护。很多团队建表的时候不写注释字段含义全靠猜三个月之后原开发离职了这张表基本就没人敢动了。我们后来强制要求所有接入数据平台的表必须补齐字段注释、业务负责人、数据源类型、更新频率等信息否则不予上线。这个规范在初期遭到很多反抗但坚持下来之后数据平台的易用性提升了不止一个档次。3. 智能化转型大模型时代的数据平台新架构3.1 Transformer架构给数据平台带来了什么2023年开始大模型技术全面爆发数据平台的架构随之迎来了新的挑战和机遇。Transformer架构以及后续的MoE架构不仅影响了算法团队也开始深刻影响数据平台的架构设计。先是数据需求的变化。训练大模型需要海量的高质量数据数据平台不再只是给报表和分析师服务还要给模型训练供给数据。之前我们维护的数据集以结构化数据为主现在要处理大量非结构化的文本、图片、音视频数据数据存储和数据处理链路都要重新设计。我在实际项目中感受到的最直观变化是数据平台开始需要支持向量化存储。大模型时代文本数据要转成向量才能被模型理解这就引出了向量数据库的概念。我们在原有数据平台架构上单独接了一层向量存储和检索服务用来支持知识库问答、语义搜索、内容推荐这些场景。向量数据库的选型对比了主流的Milvus和开源的Elasticsearch向量检索插件最终根据数据规模和查询延迟要求选择了Milvus。3.2 MoE架构与GPU资源池化大模型训练和推理的算力需求让数据平台的资源管理复杂度再上一个台阶。多租户的GPU集群调度成了架构师必须面对的新问题。CPU时代做资源调度大家熟悉的是Yarn和Kubernetes但GPU资源调度完全不是一个逻辑——GPU显存是稀缺资源一个卡上能不能同时跑多个模型、模型怎么切分、显存碎片怎么处理这些都不是传统调度器能直接解决的。我当时带队搭建模型训练平台时参考了YOLO模型训练平台开源项目的设计思路完整的图片标注、数据集管理、模型训练和模型导出功能其实就是一个典型的AI数据平台闭环。数据平台负责数据的采集、清洗、标注和版本管理训练平台负责模型的训练、评估和发布两者通过统一的数据集格式衔接起来。MoE架构对于资源调度的启示也很有价值。MoE把一个大模型拆成多个专家模块推理的时候不是所有参数都被激活只有部分专家参与计算这天然适合做分布式部署不同专家可以放在不同的GPU节点上MoE架构就能在保证模型效果的同时降低推理成本。数据平台在做训练任务调度和推理资源池化的时候可以借鉴这个思路将任务合理拆分到不同算力节点提高整体GPU利用率。在GPU资源池化方面我们最终是基于Kubernetes加自定义调度器实现的。给每个训练任务打上资源标签用亲和性规则把任务调度到有显卡的节点上再通过设备插件管理GPU显存的分配。这套方案跑了一年多资源利用率比之前人工分配方式提升了40%左右。3.3 Agent架构与数据平台的新角色最近大半年Agent架构成了行业热点。所谓Agent就是让大模型具备规划、调用工具、执行任务的能力而数据平台则是Agent最重要的“工具库”之一。我印象最深的一个项目是搭建企业级Agent架构让AI助手能够自动完成数据分析。用户用自然语言提问“上个月哪个区域的销售额下降最多”Agent先解析意图然后通过平台调用元数据服务找到相关数据表自动生成SQL查询最后把结果用自然语言回复给用户。这背后依赖的就是数据平台强大的服务化能力元数据服务、数据API服务、计算引擎服务被Agent像积木一样灵活编排。复杂工作流架构在这里也扮演了重要角色。一个完整的Agent任务往往涉及多轮的人机交互、多个数据源的查询、多步的数据处理。我们基于有向无环图来编排这些节点每个节点是一个独立的工具调用或数据处理步骤节点之间有明确的输入输出依赖这样整个工作流既能被监控失败也能自动重试。但Agent架构落地过程中最大的挑战不是技术而是权限控制。Agent自动生成的SQL如果不受限制可能一条大查询就把整个计算集群拖垮。我们在数据平台与Agent之间加了一层智能网关对Agent生成的SQL做预编译和风险评估扫描全表、无分区过滤、笛卡尔积这些高危SQL全部拦截只能通过已注册的数据API服务访问数据。4. 架构演进路上的关键经验与踩坑记录4.1 技术选型别追新要追适用数据平台架构演进这么多年我见过最贵的错误就是技术选型过于激进。有些团队一上来就要搞湖仓一体、流批一体、数据网格把所有热门架构都往身上堆结果就是平台复杂度指数上升业务需求没接几个运维团队天天在灭火。我的经验是技术选型要基于业务发展阶段的真实需求。数据量小的时候单机MySQL加上缓存完全够用数据量大了先做分库分表再大了上Hadoop生态想要实时能力再引入Kafka加Flink。每一步都是为了解决当前最痛的问题不是为了简历上多一条新技术栈。另外还有一个非常实用的判断标准看这个技术在社区里有没有大量真实落地案例。如果一个技术发布两年了能看到的生产案例还都是博客和PPT就要非常谨慎。我当时评估是否引入数据湖表格式的时候就是先看Iceberg在几个知名大厂的生产实践确定坑都被趟得差不多了才动手。4.2 数据一致性永远绕不开的架构考题数据一致性是数据平台架构里最隐蔽也最致命的问题。分布式架构下数据从业务库到数仓到实时计算再到数据服务每一条链路都可能出现数据丢失、重复或延迟。我们碰到过的典型场景包括业务库源表字段被变更导致Canal同步任务解析失败Flink任务的Checkpoint机制配置不当导致故障重启后数据重复计算离线批量同步任务因源库分页查询顺序不稳导致数据漏数。这些问题单独看都不难解决但如果在架构设计之初没有统一的应对机制排查起来会非常痛苦。架构层面能做的核心就是两件事一是全链路数据核对每天定时比对源系统、数仓、数据服务三方的数据量和关键指标有差异就报警二是所有数据处理逻辑必须幂等不管是离线任务还是实时任务重跑多少次结果都应该一样。4.3 架构评审的重要性与TOGAF的实践价值很多团队做架构演进想到哪改到哪没有一个全局规划这是导致架构越来越混乱的直接原因。我所在的团队从数据中台建设开始就引入了架构评审机制每次重大架构调整都要先出架构方案文档经过评审会反复讨论才允许进入开发。架构评审的核心关注点我总结下来无非就是几个这次改动会影响哪些上下游数据安全权限模型是否满足资源容量是否足够以及有没有替代方案。热词里提到的TOGAF架构设计文档模板其实就是一套很好的评审框架参考标准的架构设计应该包含业务架构、数据架构、应用架构和技术架构四个维度缺一不可。我自己在评审中吃过最大的亏就是早期做技术方案时只考虑技术架构忽略了数据架构。有一次做数据服务化改造只考虑了接口性能和并发没有认真梳理数据的归属方和使用方结果服务上线之后数据权限审批流程一团乱合规风险很大。从那以后我做任何架构方案都会强迫自己先回答一个问题这份数据到底归谁管谁能用怎么审批。4.4 常见问题与排查技巧速查表问题现象可能原因排查思路离线任务凌晨跑批耗时从2小时涨到8小时数据倾斜、小文件过多、资源队列被占满查看任务日志定位是否存在长尾Task统计HDFS小文件数量检查Yarn队列资源分配情况实时任务偶尔丢数据离线对不上账Checkpoint配置不当、Kafka分区消费不均、下游抖动导致回压丢数据检查Flink UI上的Checkpoint状态查看Kafka消费组Lag重点排查反压页面分库分表之后查询变慢跨库join被应用层替代、未命中分片键导致全库扫描确认查询条件是否包含分片键尽量将同维度数据分到同一库中数据服务接口偶发超时后端计算引擎连接池打满、SQL未加分区过滤扫描全表查看服务调用链和计算引擎监控排查慢SQL对接口加熔断限流元数据血缘关系断链任务代码中SQL被封装、DDL操作绕过平台执行联合开发团队强制要求平台统一建表定期跑血缘依赖校验脚本这些排查技巧每一个都是真金白银换来的。像小文件问题我们是在某次集群存储翻倍之后才意识到一个300节点的集群小文件数量从几十万涨到了几百万NameNode内存直接被撑爆最后靠合并小文件加调整归档策略才解决。5. 写在最后的经验之谈数据平台架构演进没有终点今天再完美的方案两年后可能就是一个过时的设计。我在这个领域摸爬滚打十年最大的体会是架构演进的核心不是技术选型而是对业务痛点的敏锐感知和技术节奏的精准把控。什么时候该主动重构什么时候该稳一稳比会用多少技术栈更重要。如果非要给正在做数据平台架构的同学提几条建议我最想说的是这三条第一数据质量和数据安全是数据平台的生命线优先级永远高于炫技第二架构设计要留扩展空间但不要预留过度解决眼下的问题同时兼顾半年到一年的发展趋势就够了第三每次架构演进之后一定要沉淀出标准化的规范文档让后来者有章可循否则架构就只是少数人脑子里的黑盒。最后分享一个最近的个人实践我们现在的数据平台同时跑着离线数仓、实时计算、湖仓一体存储、向量检索和Agent服务听起来很复杂但架构上所有能力都接入到同一套元数据服务和数据权限体系之下。这是我目前认为最健康的形态复杂但有序后续做任何智能化升级都只需要在现有底座上不断叠加新能力。
返回列表