刚接到这个需求时,我心里盘算了好几次:把“每月做PPT汇报、每天人工检核离线跑批、提醒业务定期上传数据”这三件事拆开看,任何一件都不算难。但真正把它们放在一起做下来,才明白这背后不是三个独立任务,而是要搭一套“数据产线日常值班体系”。很多做数据的人以为值班就是盯屏幕,实际上,离线跑批的稳不稳、业务上传的数据及不及时、月底汇报有没有说服力,都在同一根链条上。这篇文章我把自己的实操方法摊开讲,包括每天怎么查、提醒怎么发、PPT怎么组织,以及那些写进文档反而没人看的坑,希望能给负责数据值班、数仓保障和数据运营的同学一份能直接抄作业的参考。
1. 先把需求拆清楚:这个岗位到底在守护什么
1.1 离线跑批究竟是个什么“环节”
离线跑批,通俗地说就是数据加工厂里的夜间流水线。白天业务系统产生一堆原始数据,晚上系统按照编排好的任务依赖关系,定时抽取、清洗、加工,最终产出第二天大家要看的报表、分析模型和下游接口数据。大多数公司的离线调度都放在凌晨执行,因为那时候业务压力小、资源充裕。你可以把它想象成一家只在夜间开工的中央厨房:前厅早上开门卖早餐,后厨必须提前把面团发好、馅料备好。
一旦这条流水线停下来,早晨的业务报表就是空的,数据接口可能就是旧的,管理层看到的数据大概率是昨天甚至上周的。更麻烦的是,错的数据比没有数据还难处理,因为下游一旦基于错误数据做了决策,再纠偏的成本就高了。所以,“离线跑批是否正常”这句话,背后至少包含三个层次:任务有没有按时启动、任务是不是跑成功了、产出的数据质量是不是能直接用于消费。
1.2 三件事看起来独立,实际是一个闭环
原需求里有三块工作:做PPT汇报、每天人工检核跑批并发送值班提醒、提醒业务定期手工上传数据。我一开始也把它们当成三条独立工作流,但做了一段时间后发现,它们其实是同一个闭环。
检核是“发现问题”,业务提醒是“消除源头”,月度PPT是“向上汇报结果和风险”。每天查出来的异常记录、业务迟交数据的频次、人工干预的次数,都会沉淀成台账,而台账又恰好是PPT里最有说服力的素材。没有日常检核,PPT就只能写“系统稳定运行”,那是空话;没有业务提醒,跑批就老是失败,PPT里全是红字;没有月度汇报,日常做的这些事情就很难被看见,资源协调也会乏力。想明白这一点后,我调整了工作优先级:所有动作都围绕“让数据按时、按质产出”这个核心指标来。
2. 离线跑批检核:不能只盯着“成功”两个字
2.1 制定检核项:从调度状态到数据质量的分层设计
很多新手值班,第一反应是打开调度平台看一下任务列表,凡是不红的就当没事。我第一个月就是这么干的,结果还是被坑了:某个任务显示成功,但产出表里的分区数据是空的;还有的任务重跑了三次才成功,虽然肉眼可见最终是绿的,实际上下游已经被推迟了一个小时。
后来我总结出一套分层检核方法,不再只看一个维度,而是把状态、产出、质量拆开盯。
| 检核层级 | 核心指标 | 正常标准 | 常见异常 |
|---|---|---|---|
| 调度状态层 | 任务是否完成、有无失败重试 | 任务在期望时间窗口内完成,无失败或失败后自动重试成功 | 任务失败、依赖等待、未到调度时间 |
| 数据产出层 | 表分区是否生成、记录数是否合理 | 关键表分区存在,行数与历史同期波动在允许范围 | 空表、分区缺失、行数异常高/低 |
| 影响分析层 | 下游依赖表、报表、接口是否正常 | 下游核心表已就绪,报表可正常刷新 | 核心报表空白、下游接口查不到数据 |
这套三层检核,分别回答三个问题:跑没跑成、产出像不像正常数据、有没有波及到别人。调度状态看的是任务本身,数据产出看的是结果,影响分析看的是业务感知。如果只有第一层,你只能告诉别人“系统是好的”,但业务问一句“为什么我们报表是空的”,你还是答不上来。
2.2 自动巡检脚本怎么写才不容易误报
人工每小时点一遍调度平台不现实,值班的精力要用在确认和处理上,而不是“发现”上。所以巡检脚本是必需的,但写脚本容易,写不误报的脚本难。我踩过的几个坑,值得单独拿出来说。
第一个坑是把检查逻辑挂在调度系统里。当时图省事,直接把巡检脚本做成一个每天跑的任务,结果调度系统自己挂了,巡检脚本自然也跑不了,等于监工和工人一起下班。正确的做法是巡检进程独立于被检任务,最好放到单独的一台机器或者独立的执行环境里,不跟业务调度共享故障域。
第二个坑是阈值拍脑袋。比如检测表行数,如果简单跟昨天比,遇到上月月底和月初的自然波动,误报率极高。我的做法是取最近七天的行数做基线,计算均值和标准差,当天的值落在均值加减三倍标准差之外才告警。如果是环比类指标,再叠加一个“与昨日相比波动不超过50%”的兜底条件。阈值宁可宽松一些,也不要一天到晚咚咚响,告警疲劳之后,真正的灾难反而没人管。
第三个坑是忽视重试机制。很多任务都会配置失败自动重试,比如重试三次、间隔十分钟。巡检脚本如果看到第一次失败就告警,那每天凌晨都要被叫醒好几次。我后来加了观察窗口:任务失败后先看是否进入重试,如果重试成功并且延迟没突破SLA,只记录不升级;只有重试也失败或总耗时超过容忍范围,才触发人工值班提醒。
2.3 值班人每天的实际操作流程
有了脚本不等于不需要人,人工兜底的核心是“复核判断”。我给自己定的每日流程是固定的:到岗后先看前一日夜间跑批汇总,再过一遍关键任务明细,最后确认业务侧当天要用的首屏报表。
具体拆开,大约四个步骤:第一,看推送过来的“离线跑批健康日报”,里面列了关键任务的开始时间、结束时间、状态、数据量、是否有重试;第二,点开前十个P0级核心任务的详情,确认没有隐性延迟,比如虽然跑成功了,但比平时多花了一个小时;第三,抽查三张业务核心报表,打开前台的看数页面,确认数据不是空的;第四,在值班台账里登记当日结论,包括“正常”“有异常已恢复”“有异常未处理完”三种状态。
前两步看系统,后两步其实是站在业务视角验货。我一直觉得,值班数据运维不仅要看过程,还要看结果。调度系统说成功,但业务看板是空的,那调度系统的“成功”在业务眼里就没有意义。
3. 提醒机制:值班提醒和升级路径怎么设计
3.1 早巡检提醒的内容与发送方式
原需求里提到的“发送值班提醒”,我后来做成了两类消息:一类是定时发送给值班人自己的巡检开工提醒,另一类是异常时发给相关负责人的告警。前者很多人觉得没必要,但实际它有两个作用:一是强制自己到岗后第一时间进入状态,二是留下动作证据,将来复盘时能说清楚“每天几点做了什么”。
消息发送方式,不同公司基础设施不一样,通用的是钉钉/企业微信群机器人、邮件和短信网关。我的经验是:例行提醒走群机器人,异常告警走“群机器人+短信”,灾难级故障直接电话。短信和电话的成本高,所以要设置频率限制,比如一个故障在30分钟内最多发两次短信,避免告警风暴把值班人淹死。群消息的格式也要固定,用模板生成,不要每次手写,否则容易漏写关键信息。
我的早巡检消息模板大概长这样:开头写今日日期与班次,然后是核心任务成功率、当前失败任务清单、最晚完成时间、是否需要人工介入。发送时间一般定在早上7点前后,因为大部分离线任务在6点到7点之间收尾,这个时间点能看到前一夜的完整结果,又不至于太早打扰别人。
3.2 异常分级与升级策略,不能所有事都一级响应
值班最忌讳的是所有问题都拉满警报。凌晨两点收到一条“某临时任务失败”的短信,你爬起来处理之后发现它根本不影响任何核心产出,这种经历一次两次还好,多了就麻木了。因此必须给异常分级,而且要明确每一级对应谁处理、多久内响应、要不要电话。
| 级别 | 定义 | 响应要求 | 通知对象 |
|---|---|---|---|
| P0 | 核心业务表或核心报表不可用,影响面大 | 立即处理,15分钟内响应 | 值班人、数仓负责人、业务对接人 |
| P1 | 非核心表失败或核心表延迟但未断供 | 30分钟内确认,当天内解决 | 值班人、任务负责人 |
| P2 | 临时任务失败、测试表异常、可次日处理 | 当天处理即可 | 值班人记录,周会同步 |
升级策略比分级更重要:如果P0故障超过30分钟没有解决,自动升级给团队负责人;超过2小时,升级给部门负责人,同时发出故障说明。这里有一个细节,升级消息里必须写清楚三件事:当前状态、已经做了什么、还需要什么资源。只写“还在处理”,负责人也没法帮忙。
3.3 节假日和调休日期,调度日历要单独维护
每天都是“固定跑批”,这句话听起来简单,但节假日会立刻打破它。比如很多公司的调度任务依赖业务日期,遇到节假日业务数据量骤降,跑批时间反而变短;而节后第一天数据量暴增,跑批可能超时。更麻烦的是,有些任务只在工作日运行,周六周日压根不调度,新手值班如果不知道,会以为全部任务集体失败。
我建议在调度平台里维护一份调度日历,标注工作日、休息日、调休补班日,并明确哪些任务按周运行、哪些按自然日运行。节假日前后还要重点检查两件事:一是补数据任务是否已经提前配置,二是月切/季切相关任务是否按时启动。最容易出问题的就是月底最后一天,很多按月分区的表在切换时出现锁冲突或分区创建失败,月底值班必须格外盯。
4. 业务定期操作提醒:推动“人”的节点,比查SQL还重要
4.1 先把业务手工操作清单梳理出来
原需求里提到“提醒业务定期进行操作,如每个月手工上传各类文件”。这项工作看似简单,但背后有个前提:你得先知道业务到底有哪些手工操作会影响数据。我在项目初期做了两件事:一是翻历史告警记录,找出那些“由于上游未提供文件导致跑批失败”的案例;二是跟业务对接口的人访谈,把所有依赖手工上传的操作列成一张清单。
清单的字段建议包括:操作事项、操作频率、用于哪张表/哪个任务、上传截止时间、过期后果、当前负责人。举个例子:业务每月初需要上传上一月的终端门店明细,后续跑批依赖这张表生成经营分析月报;如果超时未传,相关任务就会等待或失败,月度报表直接空缺。类似的操作还有财务导入对账单、市场部上传投放素材归因表、人事上传组织架构调整名单等。
维护这张清单后,你会发现不少“跑批偶尔失败”的疑难杂症,根因根本不是平台不稳定,而是上游人的节奏不稳定。数据链路的稳定性,有很大一部分由业务侧的人工动作决定,这也是数据运维跟系统运维差异最大的地方——你不仅要监控机器,还要“监控”流程和人。
4.2 提醒策略三原则:提前量、可追溯、兜底开关
给业务发提醒,不能只在截止当天发一条消息,那样大概率是来不及的。我总结出三个原则,照着做基本不会漏:
第一,提前量。至少提前三个时间点提醒:截止前一周发预告,截止前两天发确认提醒,截止当天上午发最终提醒。每个时间点的语气和重点不一样,预告讲要求,确认讲进度,最终提醒讲风险。
第二,可追溯。每次提醒都用固定模板,并带上任务单号或文件名,避免口头沟通。业务侧经常换人,如果不留痕,下个月对接人换了,历史约定就全断了。我习惯每次提醒都抄送双方主管,不是为了告状,而是为了让业务侧的经办人也有动力按时完成。
第三,兜底开关。提醒做到位了,业务还是没传,怎么办?你的数据处理流程里必须有一个开关:任务是在等文件,还是文件未到就跳过?很多情况下,核心任务必须阻塞等待,但非核心任务可以跳过。这个策略要提前跟业务确认,否则上线后两边会扯皮。
4.3 业务不配合,最有效的办法是把影响“可视化”
跟业务打交道多了,你会发现,提醒发得再漂亮,也不如一句“今天报表没出来是因为你的文件没传”来得有冲击力。所以,我在每月汇报PPT里专门加了一页“业务输入及时率”,列出哪些业务动作晚于截止时间、导致哪些报表被迫延迟。这一页的数据不用我多解释,业务负责人自己就会去推动。
有人觉得这像是在“告状”,但换个角度看,数据链路是协作关系,每个人都要对自己负责的那一段有感知。做数据的人如果总是默默帮业务补数据、兜底处理,业务永远意识不到延迟的成本。把影响可视化,让责任回到该在的位置,反而会让协作更健康。
5. 月度汇报PPT:把值班台账变成决策材料
5.1 先想清楚汇报给谁,再决定PPT怎么组织
原需求里“把表制作成PPT进行月度汇报”,这里的“表”我理解是指每日值班台账和各项巡检指标汇总。但很多人的第一版PPT就是把每天的记录堆上去,结果领导问“所以这个月到底稳不稳定”,你翻了半天也答不上来。
我的经验是:动手做PPT之前,先问三个问题。汇报对象是老板还是平级同事?他想看到的是过程辛苦还是问题结果?他希望自己做决策还是纯了解情况?通常月度数据运维汇报,对象是团队主管或数据负责人,他们要的是结论和风险,而不是操作流水账。所以我的PPT结构一般分成六页:本月整体结论、核心指标趋势、异常与故障明细、根因分析、业务输入情况、下月改进计划。
| 页码 | 内容 | 关键输出 |
|---|---|---|
| 1 | 月度健康总览 | 一句话结论 + 健康分 |
| 2 | 核心指标趋势 | 成功率、SLA达成率、延迟中位数 |
| 3 | 异常与故障清单 | 故障级别、耗时、影响范围 |
| 4 | 根因分析 | TOP3问题、是否重复发生 |
| 5 | 业务输入情况 | 手工上传及时率、迟交明细 |
| 6 | 下月计划 | 优化项、责任人、完成时间 |
5.2 指标卡与趋势图怎么做才不空洞
PPT里最显眼的就是首页的指标卡。我一般放四个数字:离线任务成功率、SLA按时完成率、数据质量校验通过率、人工干预次数。这四个指标分别对应稳定性、时效性、质量性和运维成本,少了哪一个都看不全。
指标卡不能只放本月数字,一定要带上环比。比如本月成功率99.2%,比上月的97.8%提升了1.4个百分点,这才是有意义的数字。趋势图方面,我推荐用每日成功率的七日滚动均值,避免单日波动干扰判断。数据量检查告警次数也值得放,它能反映数据质量规则的敏感性,如果告警次数骤降,可能不是数据质量变好了,而是规则没生效,这点要特别留意。
还有一个容易忽略的细节:PPT里每个异常都要给出“影响历时”。所谓影响历时,是从异常发生到恢复正常的时间差,比“失败多少次”更有说服力。影响历时越长,说明发现慢或处理慢,这个指标直接反映值班响应能力。即使都是失败,一次三分钟恢复和一次三小时恢复,量级完全不同。
5.3 PPT制作实操中的几个小心得
做汇报PPT有三件事我每次都会提醒自己:一是不要直接截图调度平台,监控系统里的红红绿绿只有自己人看得懂,外人看了只觉得杂乱;二是每页只表达一个核心结论,页面标题就写成结论本身,比如“跑批成功率连续三月稳定在99%以上”,而不是“3月跑批情况汇总”;三是异常清单页用表格而不用长段落,级别、时间、原因、结果四列就够了,领导扫一眼就能抓住重点。
另外,PPT里的数据必须和值班台账对得上。我见过有人汇报时写“本月无重大故障”,但台下有人翻聊天记录发现上周刚出过一次事,这种信任崩塌很难修复。所以每个月结账前,我会拿台账和PPT逐项核对一遍,确保每一个数字都有出处。
6. 常见问题与排查实战
6.1 任务显示成功,但业务看到的数据是错或空的
这是最有迷惑性的问题之一。任务状态绿色,后台表也生成了,但数据值不对,或者只有表结构没有数据。我遇到过的原因包括:上游源表在跑批过程中发生DDL变更,导致抽取的字段错位;跑批任务在重试时使用了重复主键,数据被覆盖;还有一次是因为临时写了一个“清空表”的步骤,没有提交到正式环境。
排查思路很简单:先看任务日志里数据量波动,再对比表中的计数与前一天、上周同一天差异;然后查关键指标字段的极值和分位数,是否存在异常陡增陡降。与其依赖调度状态,真正常用的手段是抽数对比,拿昨天的数据抽出几条样本,跟今天的结构比对字段类型和值域范围。
6.2 告警风暴:一个故障引发的连环误报
离线任务存在大量依赖关系,上面的任务一挂,下面的几百个任务全部跟着失败或等待。如果不做告警收敛,凌晨两点的群里会刷出几百条消息,值班手机响得像闹钟。我见过处理这种问题最简单的办法:告警时按“根因任务”维度聚合,只发一条包含任务层级概要的消息,而不是把每个子任务都发一遍。
此外,告警里要加上依赖链上游的标识。比如某张报表任务失败,消息里同时显示它依赖的上游表状态,让值班人一眼看到是源头问题还是自身问题。告警聚合的规则最好在监控系统层面做,如果不能,巡检脚本里也可以按任务前缀或依赖层级做归并。
6.3 任务依赖死锁与资源等待,怎么判断是死锁还是慢
调度平台上经常出现“Running超过预期时间”的任务,判断它究竟是死锁还是单纯资源排队,会直接影响处理方式。我的经验是看CPU和内存监控:如果资源占用极低,多半是锁等待,查一下有没有并发任务对同一张表做了锁操作;如果资源占用很高但迟迟不结束,多半是有倾斜或计算复杂度爆炸。
如果是锁等待,不要盲目Kill任务。先看等待锁的会话等了多久,如果超过一小时,可以和相关任务负责人确认后手动释放连接;如果是资源排队,看队列里有哪些任务在抢资源,通常调整优先级或暂停低优先级任务就能缓解。最怕的是看到任务卡了就重跑,重跑不但不能解决问题,反而会让资源更加紧张。
6.4 值班交接与知识沉淀,最容易偷懒也最影响效率
值班工作里有一个隐形痛点:异常多次重复出现,但每次处理的人都像第一次处理。方案排查记录写在聊天记录里,换个人值班就找不到了。我后来强制自己每周花半小时整理一份“本周异常处理实录”,内容包括现象、初步判断、恢复动作、后续改进点,存到共享文档里。短期看是浪费时间,长期看是给团队积累了一本故障处理手册,新同学上手时间能缩短一半。
另外一个谈判技巧是,故障复盘时不要只讲技术原因,还要写清楚“为什么没更早发现”。如果某个故障其实前一天就有预警趋势,但被阈值遮住了,那就是监控规则的问题;如果规则都正常,只是没人看着,那就是巡检节奏的问题。把问题归因到流程和监控规则上,比归因到个人更有建设性。
最后再分享一个小经验
做数据值班这一年来,我最大的体会是:技术问题有标准答案,人的协同没有。离线跑批的调度平台再智能,也替代不了值班人的判断力;提醒消息发得再及时,也替代不了业务侧的责任心。真正让这套机制转起来的,是每天固定节奏的执行、异常出现时的冷静分级,以及月底那份敢于把问题和风险如实写出来的PPT。刚开始时我也觉得每天看跑批很枯燥,但当你持续几个月把成功率从97%抬到99.5%以上,看着月度PPT里的趋势曲线一路向上,那种感觉,跟写完一段逻辑漂亮的代码是一样的。