ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

数据服务成本治理实战:从成本黑洞到降本增效

数据服务成本治理实战:从成本黑洞到降本增效 1. 数据服务的账单到底被谁吃掉了之前带团队做数据平台治理最让我头疼的不是底层组件怎么搭而是每个月成本分摊出来之后业务线负责人拿着账单来找我“我们天天在跑数为什么数据服务这一项比上个月贵了40%”老实说这种时候我去查调度日志、查存储明细往往也要折腾好几天才能给出一个让对方信服的答案。后来我意识到问题出在“数据服务”这个词本身就太笼统了——在大数据领域数据服务不是某一个组件而是一条从数据接入、加工、存储到对外提供查询与API的完整链路。账单涨了首先得知道钱分别花在了哪个环节。1.1 从数据接入到接口返回每一环都是钱很多人一提数据服务第一反应是“对外提供API”但实际在数仓平台里数据服务是一个串行链路。我通常把它分成四段来看数据接入与同步业务库到数仓的实时同步、离线同步。实时同步常年占着Flink的计算资源离线同步则卡在凌晨的调度窗口里。数据加工与计算分层加工ODS、DWD、DWS、ADS、指标计算、宽表加工这一层通常是计算账单的大头尤其是有大量Join和聚合的作业。数据存储明细数据、汇总数据、副本、临时表全都落地存储成本是持续性的就算没人查也在按月扣钱。数据查询与API服务对外提供的SQL查询接口、指标API、报表查询。这一段的成本跟调用量和查询复杂度强相关属于“用一次算一次钱”的部分。大多数团队做成本控制习惯只盯着“计算”这一环但实际数据服务的成本是跑在整条链路上的。我记得有次排查一个数据服务项目为什么存储一直在涨最后发现是一张四个月前建的临时表每天被一个上游任务写入但下游早就没人消费了。这种表攒了十几张每张日均写入几个GB算下来每个月烧掉的存储成本就够买一台高配开发机了。1.2 三个常被忽视的成本黑洞重复计算、全量刷新、无效调用在给业务线做账单分析时我发现成本异常暴涨的原因普遍不是“业务量真的大了”而是下面三类情况在悄悄侵蚀资源。第一类是重复计算。同一个指标数仓里一套口径业务部门自己又维护了一套Excel或者临时SQL两边都跑、都存储。更有甚者A组和B组各自拉了一份同样的订单明细表字段一模一样命名一个叫order_detail_a一个叫order_detail_b底层数据源相同加工程序相同纯粹是因为两个小组各自建了项目空间互不知情。这类资源浪费账单上根本看不出来只有做血缘分析和表归属梳理时才会暴露。第二类是全量刷新。我接手过一个报表项目底层宽表每天凌晨2点跑一次全量重算数据量大概3亿行跑完要1个多小时中间还要占用大量内存做Join。但实际上这份宽表每天的增量只有1%左右。当时我把全量改成“增量合并定期全量校验”之后单次任务耗时从74分钟降到了12分钟集群水位肉眼可见地降了下来。很多人不敢动全量是怕数据不一致其实只要保留一个每周日凌晨的全量校验任务风险完全可控。第三类是无效调用。数据API上线之后业务方会习惯性地加“保险性调用”——每隔几秒拉一次全量数据哪怕页面上根本没人看。有些报表系统还会在打开页面时同时发出几个相同参数的请求服务端也没有做去重缓存白白放大QPS。曾有个数据看板实际日活用户不到50人但每天的API调用量有400多万次人均8万次调用查了一下就是前端轮询逻辑没加条件判断页面未激活时也在刷接口。1.3 成本问题表面是技术实际上是一笔管理账做了这些年数据平台我越来越觉得任何成本的失控背后都能找到组织和管理上的缺口。数据服务要是没有明确的负责人没有成本分账和预算基线那“浪费”就是必然结果。没人会主动去清理自己建的表没人会真心实意去优化自己已经跑通的任务因为省下来的钱是公司的耗费的精力和风险是自己的。所以做成本控制和效益提升第一步根本不是上什么先进工具而是先让每一笔资源花费都能追溯到“哪个业务、哪个团队、哪个任务”。这就像一个家里不记账月月超支却不知道钱去哪了一旦开始记账很多非理性的开销自然就会缩减。后面我会专门讲到成本责任制怎么落地这里先提个醒没有分账体系的降本都是在做一次性运动。2. 成本失控的三个根因口径、技术债和没人负责账单涨了只是表象真正要动刀子的是背后的根因。我在不同团队里见过太多次“救火式降本”——今天砍这个任务明天缩那个集群短期数字是降了但过两个月又会反弹而且业务还整天抱怨数据不准、服务不稳定。要彻底改善得回到三个根子上去想问题。2.1 指标口径蔓延每个团队都在造自己的轮子数仓领域最经典的一句话是“口径即共识”。但现实是同一个“用户数”市场部、运营部、财务部可能各有各的定义有的按注册时间有的按首单时间有的按当天有行为的设备数。指标口径一旦不统一下游就会各取所需每个人都觉得自己是对的结果就是数仓要为好几种口径分别建模、分别存储、分别对外提供查询服务。我经历过一个特别典型的案例公司要上一个“实时成交额”大屏数据组、业务中台组和BI组同时各自开发了一套口径上线当天三块屏显示的成交额数字都不一样。领导当场问“哪个是对的”没人能拍胸脯。后来复盘发现三套口径分别用了不同的时间维度、不同的币种处理逻辑、不同的支付状态过滤条件。三套逻辑背后是三个团队各自的模型计算和存储资源翻了三倍还得定期解释数据差异。解决口径蔓延没有什么高深技术靠的是“指标字典唯一出口”的管理机制。把所有核心指标在数仓层统一定义、统一加工对外只暴露指标ID不暴露SQL。业务要取数只能通过指标服务来查。这样既保住了口径的一致性也让底层计算资源不至于被重复建设耗光。2.2 技术债临时脚本“转正”一人一个黑盒做数据这行临时脚本是无处不在的。业务方说“急着要个数”开发同学一上来就写个即席SQL跑完直接给结果。这本没什么问题是很多“临时”脚本后来变成了“永久”任务——跑着跑着业务方觉得不错就要求每天调度。曾经有个数据接口最初是数据分析师写的一个Python脚本每天手工执行、产出Excel发到群里。后来要自动化工程师就简单包了一层定时调度再往后要对外提供API又在这个脚本外面套了层服务。等我去review的时候这个“服务”已经没有任何注释、没有异常处理、没有监控告警半夜跑挂了只有业务方第二天早上发现数据没更新。这种技术债带来的成本是隐性的每次出问题都有人力去排查、去补偿数据每次升级改造都要花时间看懂前人写的“黑盒”每次资源紧张时这类任务还跑得特别慢因为它用的是低效的加工方式。按我的经验一行低质量的数据代码长期维护成本是它初次开发成本的8到10倍。对技术债的态度不能是“出了问题再修”而应该把“治理”当成日常work。比如每次版本迭代时顺手重构一块老逻辑每周挑几个“黑盒任务”做代码review每月出一份“高成本低效益任务清单”给业务确认是否下线。这些事情看起来不起眼但半年跑下来集群的压力和任务的平均耗时都会有明显改善。2.3 平台与业务脱节没人对“服务”本身负责数据服务在大多数公司里是“夹心层”——底层数仓觉得自己只负责加工数据业务平台觉得自己只负责展示数据真正面向用户的API服务常常处于两不管的状态。我自己就碰到过一次发布事故数据服务升级版本时加了鉴权参数结果没有通知到下游调用方导致业务线所有报表瞬间报错。事后追问发现这个API的负责人早在半年前就离职了线上服务一直处于“没人看、没人管、没人敢动”的状态。没有明确的负责人就意味着没有明确的SLA承诺、没有主动的性能优化、没有定期的资源审视。这带来的成本看得见的是资源空转看不见的是业务方对数据团队的信任流失。后来我把所有线上数据服务都指定了Owner并强制要求Owner每月提交一份“服务运行报告”包含调用量、平均耗时、错误率、资源消耗、优化建议。从那以后很多潜在风险在爆发前就被处理掉了。3. 从调度到查询链路逐层压成本的落地动作根因捋清楚了接下来才是实打实的降本动作。我通常把落地策略分成四层调度层、存储层、接口层、观测层。每一层都能做文章而且大部分动作并不需要引入复杂的新系统现有架构稍加调整就能见效。下面这四块是我自己验证过、在多个团队里复用过的最佳实践供大家参考。3.1 计算侧复用、增量、错峰三板斧最见效计算侧的降本核心就三个词别重复算、别全量算、别挤一起算。先说话别重复算。建立统一的中间层DWS/ADS把跨业务复用的指标提前加工好上游只加工一次下游通过数据服务统一取数。我见过做得好的团队核心指标的复用率能达到80%以上同样的数据在数仓里只有一份副本任何下游要取数都走同一个服务。复用率提升之后整个集群的执行任务数肉眼可见地减少。再说增量替换全量。这条前面已经说过关键是评估数据量和变更率。经验法则如果单表日增量占比低于5%就值得做增量合并。但要注意增量任务的幂等性和数据回溯问题我建议的稳妥做法是保留一个“周日全量”作为基准再用增量任务补齐一周内每一天的数据这样即使中间某天增量异常也有全量兜底。最后是错峰调度。很多团队的调度时间都挤在凌晨1点到2点之间导致集群CPU和内存在一小时内飙到峰值其余时间却大量闲置。把调度波峰摊开既能提升集群的整体利用率又不用额外扩容。我们当时做了一个很简单的“调度时间乱序”策略把数据优先级低的任务分散到0:30到4:30的各个时间段结合依赖关系自动编排集群峰值的资源使用率从92%降到了71%相当于凭空多出来20%的余量。这里要提醒一句错峰调度看起来容易做起来最怕任务之间的隐式依赖。A任务凌晨2点跑完B任务凌晨2点半跑乍一看没问题但如果A任务因为重试延迟到2点40才成功B就拿到不完整的数据。所以错峰的前提是清晰的依赖DAG依赖关系之外的“时间碰巧”不能作为信任基础。3.2 存储侧生命周期、压缩、冷热分层存储成本是所有成本里最“温水煮青蛙”的。计算资源用了就有感觉存储却是一直安静地累积直到某天账单爆掉。我的存储治理三板斧是生命周期管理、列式压缩和冷热分层。生命周期管理说的是给每一类数据定义明确的保留时间。比如ODS层的原始日志保留30天DWD层明细保留90天DWS层汇总数据保留180天ADS层对外服务数据按业务需要保留更久。超期数据自动归档或删除。这个策略几乎没有技术难度难的是推动业务方同意“我这张表可以被删”。我常用的方法是先给业务方出具“该表最近N天访问记录”如果30天内没有任何读写基本可以确认是死表直接归档到冷存储。压缩和列式存储在大多数OLAP场景下都能直接受益。以Parquet格式为例配上Snappy或ZSTD压缩存储空间通常能下降60%到75%扫描性能还会有提升。注意这里有个细节压缩率高的编码比如ZSTD在写入时会更耗时所以要挑那些“一次写入、多次读取”的表来用而不是所有表都无脑上ZSTD。冷热分层则需要区分数据的使用频率。热数据放在高性能存储上保证查询速度温数据和冷数据放到对象存储或低频存储里成本低一个数量级。数据服务对外提供查询时通过分层路由自动判断表在哪个存储层用户无感知。这个方案特别适合那种“最近30天数据高频访问、历史数据偶尔捞”的业务场景。3.3 接口侧缓存、预聚合、限流熔断一整套数据服务对外提供API时成本控制的关键在接口设计。我每次评审新的数据API都会先问三个问题这个接口真的需要实时查底表吗同样的参数能被缓存命中吗QPS打满时系统会不会自我保护缓存是成本最低、效果最明显的优化手段。数据实时性要求不高的接口比如“昨日成交额”“近7日趋势”完全可以设置30秒到几分钟的本地缓存或分布式缓存。我曾经把一个每分钟调用量上千次的指标接口加上5分钟缓存之后后端实际命中计算资源的次数降到了原来的十分之一响应时间反而从200毫秒提升到了20毫秒。预聚合解决的是“海量明细实时算”的问题。如果业务方确实要看汇总指标就不用让用户去全表扫描几亿行明细。把常用粒度的指标提前算好存储在OLAP引擎Doris、ClickHouse都行的物化视图里接口查询直接打汇总数据。这里的关键是“常用粒度”的预判——根据业务方真正的使用场景来决定预聚合维度而不是把所有维度组合都物化否则存储成本又爆了。限流熔断是为了防止“无效调用”拖垮整个服务进而引发雪崩。给每个API设定QPS阈值超过阈值直接返回限流提示下游异常时开启熔断快速失败保护核心链路。很多团队觉得限流会影响业务体验但实际业务方最怕的不是“偶尔被限流”而是“接口挂了所有人一起等”。3.4 可观测与预算实现“数据治理数据化”降本方案再多没有一套可度量的体系最后都会变成“治理运动”。我的做法是用数据去治理数据把每条数据服务链路的成本、调用量、耗时、错误率、资源利用率全部埋点采集形成一张“数据服务成本大盘”。在这张盘上每个业务线是一个维度每个数据服务是一个指标每天刷新一次。有了成本大盘就可以做“预算消费”管理给每条业务线设定月度成本预算超预算自动告警连续超支需要提交“资源扩容申请”并说明理由。这套机制运行起来之后我见过一个很有意思的现象业务方自己会开始思考“这个接口的调用频率能不能降下来”“这张表的数据真的需要全量保留吗”。以前是数据团队逼着业务省现在是业务自己主动省效果完全不同。要说有什么具体的工具推荐普通团队用Grafana Prometheus 自研的成本分摊脚本就够了核心不是工具本身而是“让每个成本都有归属”。我建议做成本分摊时不要按“集群总费用/任务数”这么粗暴来算而是按“任务的CPU核数×运行时长×单价 数据存储量×单价 查询扫描量×单价”来计算虽然前期埋点麻烦一点但之后每次优化效果都能直接算出省了多少钱特别好向上汇报。4. 效益提升不是省钱是让单位资源产出更高价值成本控制做到位只是及格分。数据服务真正的价值在于它帮助业务更快、更准地拿到可用数据。如果只盯着省钱把服务砍得用户体验极差那反而违背了初衷。我做增效的思路通常是从SLA保障、数据产品化、资产运营和度量机制四个方向入手。4.1 从“能查到”到“查得快”让SLA分级为体验兜底数据服务最容易被吐槽的就是“慢”和“不稳定”。业务方要的不是“昨天能查到”而是“任何时候点开都是对的、快的”。要做到这一点前提是给不同的数据服务设定不同的SLA级别而不是一视同仁地追求“所有接口都100ms”——那既不现实成本也扛不住。我通常把数据服务分成P0/P1/P2三级。P0是核心大屏、实时风控、在线推荐这类要求99.9%的可用性、平均延迟200msP1是常规报表、运营看板平均延迟1秒P2是离线批量取数、分析探索允许分钟级延迟。分级之后资源分配就有据可依P0服务独占部分高优资源池P1共享资源池P2则完全走离线调度。这样既保证了关键链路的体验又避免了“所有服务抢资源、谁都跑不快”的局面。SLA分级还要配“故障定级和响应流程”。P0故障5分钟内必须响应、30分钟内恢复P1故障30分钟内响应、4小时内恢复P2则可以走工单第二天处理。很多团队的资源明明够用但体验依然差就是因为缺乏这种“轻重缓急”的区分和对应的组织保障。4.2 从“取数工具”到“数据产品”让服务变成业务方离不开的资产如果数据服务只是“业务方来取数、我们给数”这样一种被动模式那它的价值天花板很低——业务方觉得这是平台该有的基础设施不会为它付费更不会为它的优化叫好。做数据服务增效应该主动把高质量的数据服务包装成“数据产品”。什么叫数据产品我的理解是它不是一个裸的API而是带说明文档、带参数示例、带数据口径、带SLA承诺、带自助调试界面的完整交付物。业务方接进来之后不需要问数据团队“这个字段什么意思”“这个接口能不能加个参数”自己看文档就能搞定。同时每次接口变更都通过版本管理发布后向兼容不让业务方因为接口升级而返工。数据产品化之后还要主动“推销”。把高频使用的数据服务整理成目录新业务接入时先推荐现有服务而不是又去开发新链路。我见过一个做用户画像的团队把自己沉淀的用户标签能力做成了自助查询产品业务方拖拖拽拽就能拿到想要的画像分布。这个产品后来支撑了十几个业务线而它背后的存储和计算资源只占整个数据平台的一小部分——因为复用的是一套底层模型不是各搞一套。4.3 数据资产运营让“压箱底”的数据重见天日很多团队的数仓越建越庞大但真正被高频使用的表可能只占20%——剩下80%都是沉睡资产。沉睡资产不产生任何业务价值却持续烧着存储成本这就是所谓的“数据负债”。反向来看如果能把一些有价值但未被利用的数据重新挖掘出来提供给业务方使用那这部分成本就从“负债”变成了真正的“资产”。我做数据资产运营时会定期做三件事第一梳理现有表/指标/API的使用热度榜单找出低热度但高潜力的数据第二主动联系业务线了解他们的分析需求看能否用现有沉睡数据满足而不是新建加工链路第三针对重复度高、口径差异大的旧数据做合并治理把分散的数据收敛成一份高质量的公共数据。举一个例子数仓里有一张记录用户行为日志的明细表量大、存储贵之前只有风控团队在用。后来增长团队要做渠道分析我们一查这张表的维度完全够用就帮增长团队建了几个预聚合视图复用底层明细而不是另起炉灶再搞一张日志表。这样存储成本没有明显上涨增长团队却拿到了关键的分析能力。类似这种“一鱼多吃”的动作就是在提升数据的单位产出价值。4.4 度量机制向老板证明“降本不降质”的最好方式增效做到最后一定要有度量。没有度量你说了半天“降本增效”的成果老板心里其实没底业务方也会怀疑服务是不是变差了。我的习惯是建立一套双向度量机制降本指标和增效指标并行。降本指标包括单位数据服务成本单次API调用成本、单GB存储成本、资源利用率集群平均CPU使用率、内存使用率、无效任务占比等。增效指标包括数据服务可用性SLA达成率、平均查询耗时、业务方自助取数占比、数据质量问题数量、因数据服务直接支撑的业务决策/活动等。这两组指标要一起看。有一次我们优化了存储压缩比存储成本下降了30%但查询P95延迟涨了15%。站在降本指标看是“成功了”站在增效指标看却是“退步了”。后来我们调整了冷热分层的阈值把最热的10%数据放回高性能存储查询延迟恢复原状总成本依然比优化前低20%左右。这个例子说明降本和增效永远是双目标优化不能只看一边。5. 实践中的几个扎心教训我踩过坑也建议你避开讲了这么多方法论最后说几个我自己踩过的坑。这些事不做方案可能推不动做了整个体系才转得起来。第一个坑是“一刀切砍任务”。有段时间为了快速压成本我们直接下线了一批看起来“30天无访问”的离线任务结果其中有几个是月底结算的核心依赖平时不走查询、只在结算日跑一次。下线之后月底数据直接缺了一大块业务方炸了。后来我们建立了“任务下线冷静期”任何任务下线前先降级为“暂停调度保留数据”观察一个完整的业务周期通常一个月确认没有影响再彻底下线。这个机制保守但安全团队少了很多“事故复盘”。第二个坑是“缓存过期时间设太长”。当时为了降低接口压力把某个趋势指标的缓存时间设成了10分钟。结果大促期间业务方在9点59分看到的数据跟10点05分看到的数据差了一大截运营为了对齐口径折腾了一上午。数据服务不像静态页面缓存的TTL要根据数据的实时性需求精细调整大促、异动期间还要有手动刷新机制。现在我对所有面向业务决策的接口缓存默认不超过60秒尽管后端压力大一些但数据一致性带来的信任价值远高于那点资源成本。第三个坑是“SLA一刀切造成的不公平”。最早我们给所有数据服务都承诺“全年99.9%可用”结果为了满足一个低价值的报表接口频繁打断高优任务去排查问题核心链路的稳定性反而被拖累。后来改为分级SLA才真正理顺了。如果你现在正准备推行SLA治理我的建议是先把核心业务链路圈出来定最高的SLA标准其余服务按业务影响面依次降级不要试图让所有服务都“一样好”。第四个坑是“成本责任田挂在嘴上没落到数据上”。喊了几个月“大家要省资源”结果没人真的行动。后来我们做了一个“各业务线资源使用周报”每周一上午发出附上“已超预算”的红色标记。不到一个月几个业务线负责人主动来找我商量优化方案因为他们不想每周都被抄送到老板邮箱里。人面对具体数字和压力时行动力总是最强的。最后再说一点我目前比较坚持的做法所有数据服务上线前必须过“成本评审”也就是在开发阶段就预估这张表、这个接口、这个任务大概要消耗多少资源、可以服务多少业务场景。资源预估明显偏高的方案一律打回优化后再上线。虽然多了一道流程但至少从源头避免了很多“先上线再说、后期再治理”的麻烦。数据服务是一项长期运营的活靠的不是一朝一夕的猛药而是把每一笔账都算明白、把每一个服务都管好、让每一份数据都产生业务价值的持续工夫。
返回列表