大数据开发项目全流程:从需求到上线的七个阶段与实战避坑指南
大数据开发这行干了有些年头,带过不少新人,也接手过不少半路出问题的项目。每次有人问我“大数据开发到底怎么入门”或者“一个数据项目从零到上线到底要经过哪些环节”,我都很难用一两句话打发——因为这活儿不像写个CRUD接口那么线性,它更像一条流水线,上游一个字段类型没对齐,下游可能就得推倒重来。大数据开发项目流程这件事,表面看是步骤问题,骨子里是协作问题、是数据契约问题、是工程规范问题。我见过太多团队在需求还没对齐的时候就急着搭集群、写Spark任务,结果跑了两周发现指标口径全是错的,返工成本高得吓人。
这篇内容我想把大数据项目从立项到稳定运行的全流程掰开揉碎讲清楚,包括每个阶段到底在干什么、为什么这么排、哪些坑是新人最容易踩的、哪些参数和配置是真正影响成败的。适合刚转行做大数据开发的朋友、带小团队的技术负责人,也适合那些业务侧想了解“数据团队到底在忙什么”的同学。我不打算写成教科书,就按我实际带项目时的节奏来,该啰嗦的地方啰嗦,该给配置的地方直接贴出来,你能拿去改改就用。
1. 项目整体设计与流程拆解思路
1.1 为什么大数据项目不能“先干起来再说”
传统业务系统开发有个特点:需求相对明确,页面长什么样、按钮点了跳哪里,画个原型就能开工。大数据项目完全不是这个逻辑。它的产出物是数据资产和数据服务,而数据的价值取决于口径是否统一、质量是否可靠、时效是否达标。这三件事在项目初期如果不定义清楚,后面写再多代码都是白费。
我习惯把大数据项目流程分成七个阶段:需求调研与指标定义、数据源梳理与接入评估、数据模型设计、ETL开发与调度编排、数据质量校验、服务化输出、监控运维与迭代。这七个阶段不是瀑布式串行,实际执行时会有交叠,比如模型设计阶段就要同步考虑质量校验规则,但整体推进顺序不能乱。为什么这么排?因为大数据项目的核心风险集中在“上游不确定”和“下游不可控”两头——需求不清导致方向错,质量不控导致结果错,中间的技术实现反而是相对确定的部分。
这里有个很关键的认知:大数据开发工程师的时间分配,写代码可能只占三到四成,剩下六到七成都在做沟通、对齐、排查和文档。你要是抱着“我只管写SQL”的心态入行,大概率会干得很痛苦。流程设计的本质,是把这些沟通和对齐工作制度化、模板化,减少反复扯皮。
1.2 七个阶段的核心目标与交付物对照
把每个阶段的目标和交付物列清楚,团队协作时就有了共同的“进度标尺”。下面这张表是我带项目时常用的对照表,实际使用时可以根据项目规模裁剪,但核心交付物建议一个都别省。
| 阶段 | 核心目标 | 关键交付物 | 常见耗时占比 |
|---|---|---|---|
| 需求调研与指标定义 | 明确业务问题、统一指标口径 | 指标字典、需求说明书 | 15% |
| 数据源梳理与接入评估 | 摸清数据家底、评估接入可行性 | 数据源清单、接入方案 | 10% |
| 数据模型设计 | 设计分层模型、确定存储方案 | 数仓分层设计文档、表结构DDL | 15% |
| ETL开发与调度编排 | 实现数据流转、配置依赖调度 | ETL脚本、调度配置、映射文档 | 30% |
| 数据质量校验 | 建立校验规则、拦截脏数据 | 质量规则表、校验报告 | 10% |
| 服务化输出 | 对接下游应用、提供查询接口 | API文档、宽表/指标表 | 10% |
| 监控运维与迭代 | 保障稳定运行、持续优化 | 监控看板、告警配置、迭代记录 | 10% |
这张表里ETL开发占比最高,但我要提醒一句:如果前三个阶段压缩得太狠,ETL阶段的时间会成倍膨胀。我见过一个项目需求阶段只花了两天,结果ETL开发反复返工搞了一个多月,最后算总账反而更亏。指标定义这件事,宁可多花两天跟业务方吵清楚,也别留到开发阶段边写边猜。
1.3 方案选型的底层逻辑:批还是流,湖还是仓
流程走到技术选型这一步,绕不开几个经典问题:批处理还是流处理?数据湖还是数据仓库?用现成的大数据平台还是自建?这些问题没有标准答案,但有判断框架。
先说批与流。判断依据是业务对数据时效的真实要求,而不是“流处理听起来更高级”。如果业务方说“T+1看昨天的报表就行”,那老老实实做批处理,别为了技术先进性硬上实时链路——实时链路的运维复杂度、资源消耗、开发成本都是批处理的数倍。只有当业务明确要求“分钟级甚至秒级响应”,比如实时风控、实时推荐、实时大屏,才值得投入流处理架构。我个人的经验是,大部分企业的核心报表需求,T+1批处理完全够用,实时需求往往集中在少数几个场景,可以单独建设,不必全链路实时化。
再说湖与仓。数据仓库擅长结构化数据的规范管理和高效查询,数据湖擅长海量原始数据的低成本存储和灵活加工。现在主流的做法是湖仓一体思路:原始数据入湖做长期留存和灵活探索,经过清洗加工的结构化数据入仓做规范管理和服务输出。这个组合的好处是兼顾了成本和规范,坏处是架构复杂度上升,小团队要评估自己有没有能力维护两套体系。如果团队规模小、数据量不大,先用一套数仓体系跑通流程,等数据量和场景复杂度上来了再考虑引入湖,这个渐进路径更稳妥。
提示:技术选型时一定要把“团队现有技术栈”和“运维能力”作为硬约束纳入考量。选了一个团队没人会维护的组件,上线那天就是灾难的开始。
2. 需求调研与数据源梳理的实操要点
2.1 指标定义:把“大概”变成“精确”
需求调研阶段最核心的产出是指标字典。什么叫指标字典?就是把业务方嘴里那些模糊的词,翻译成精确的、可计算的、无歧义的定义。业务方说“我要看活跃用户数”,你得追问:活跃的定义是什么?登录算活跃还是要有业务行为才算?统计周期是自然日还是滚动24小时?去重口径是按设备还是按账号?跨端登录怎么算?
这些问题不追问清楚,开发出来的指标一定和业务预期对不上。我通常的做法是拉着业务方开一次指标对齐会,会上逐条过指标,每条指标记录五个要素:指标名称、业务含义、计算公式、数据来源、更新频率。会议结束前让业务方确认签字(或者邮件确认),这份确认记录就是后续验收的依据。别嫌麻烦,我吃过亏——有次做用户留存指标,我按“次日登录”算,业务方心里想的是“次日有下单行为”,上线后扯了半天皮,最后重做。
指标字典建议用表格维护,下面是一个简化示例,实际项目里字段会更细:
| 指标名称 | 业务含义 | 计算公式 | 数据来源 | 更新频率 |
|---|---|---|---|---|
| 日活跃用户数 | 当日有登录行为的去重用户 | count(distinct user_id) where login_time between 当日00:00:00 and 23:59:59 | 用户登录日志表 | T+1 |
| 次日留存率 | 当日新增用户中次日仍活跃的占比 | 次日活跃新增用户数 / 当日新增用户数 | 用户注册表、登录日志表 | T+1 |
| 人均下单金额 | 当日下单总金额除以当天下单用户数 | sum(order_amount) / count(distinct user_id) | 订单表 | T+1 |
这张表看着简单,但每填一行都要跟业务方确认,尤其是计算公式里的时间边界、去重维度、异常值处理(比如退款订单算不算),这些细节决定了指标能不能用。
2.2 数据源盘点:摸清家底再动手
指标定义清楚后,下一步是搞清楚数据从哪来。数据源盘点要回答几个问题:有哪些数据源、每个源的数据量级、数据产生频率、数据质量现状、接入方式是否可行。我一般会做一张数据源清单,逐项登记。
盘点时特别要注意几类“坑源”:一是业务库直连,很多团队图省事直接从业务MySQL抽数,结果抽数任务把业务库拖垮,这种事故我见过不止一次,正确做法是走从库或者让业务方提供数据同步通道;二是日志类数据,格式不统一、字段缺失、埋点错乱是常态,接入前一定要抽样看原始数据长什么样;三是第三方数据,接口稳定性、数据延迟、字段变更都是不可控因素,要有兜底方案。
数据量级评估也很关键,它直接决定后续的存储和计算方案。粗略估算方法:单条记录平均字节数乘以日增记录数,得到日增量,再乘以保留天数得到总存储需求。比如一条订单记录平均500字节,日增100万条,保留一年,那就是500B × 100万 × 365 ≈ 182GB,算上副本和中间表,实际存储按3到5倍预留比较稳妥。这个估算不用特别精确,但量级不能错——把TB级当GB级设计,上线就等着扩容吧。
2.3 接入方案设计:全量与增量的取舍
数据接入分全量和增量两种模式。全量接入适合数据量小、变更频繁、需要完整快照的场景;增量接入适合数据量大、只关心变化的场景。实际项目中通常是首日全量初始化加后续增量同步的组合。
增量同步的关键是变更捕获机制。常见方式有基于时间戳字段的增量抽取(简单但有漏数风险,比如晚到的数据)、基于自增ID的增量抽取(适合只增不改的表)、基于数据库日志的变更捕获(最准确但实现复杂)。选哪种取决于源表特性和业务对准确性的要求。我的经验是:核心交易类数据用日志级变更捕获保证准确,日志类、埋点类数据用时间戳增量加定期全量校对兜底,非核心的配置类数据直接全量同步省心。
接入频率也要跟业务时效要求对齐。T+1的报表,每天凌晨同步一次就够;准实时的看板,可能要做到小时级甚至分钟级同步。频率越高,对源库的压力越大,这个平衡要提前跟业务方和DBA沟通好。
3. 数据模型设计与分层落地
3.1 数仓分层:为什么要分,怎么分
数据模型设计的第一步是分层。分层的目的不是把简单事情搞复杂,而是让数据加工过程可管理、可复用、可追溯。经典的分层是ODS(原始数据层)、DWD(明细数据层)、DWS(汇总数据层)、ADS(应用数据层),有的团队还会加DIM(维度层)和TMP(临时层)。
ODS层贴源存储,基本不做加工,保留原始数据以备追溯;DWD层做清洗、去重、规范化,是业务过程的明细事实;DWS层按主题做轻度汇总,比如按用户、按商品、按日聚合;ADS层直接面向应用,出宽表或指标结果。这个分层的核心价值在于:每一层职责单一,出问题时能快速定位是哪一层的问题,同时上层可以复用下层的加工成果,避免重复计算。
小团队可能会觉得四层太重,可以简化成三层:ODS、DWD、ADS,把DWS的汇总逻辑合并到ADS里。但我不建议把ODS和DWD合并——ODS保留原始数据这个习惯,在排查数据问题时能救命。曾经有个项目指标突然异常,最后靠ODS层的原始日志比对,才发现是上游埋点版本升级导致字段含义变了,如果没有ODS留存,这个问题的排查时间会翻好几倍。
3.2 表结构设计的关键决策
表结构设计有几个绕不开的决策点,我逐个说。
分区策略:大数据表几乎都要分区,最常用的是按日期分区。分区字段的选择原则是“查询时最常用来过滤的字段”,通常是日期。分区粒度按数据量和查询模式定,日分区最常见,数据量特别大的可以按小时分区,数据量小的可以按月分区。分区不是越多越好,分区过多会导致小文件问题,影响查询性能。一般建议单分区数据量在几百MB到几GB之间比较健康。
存储格式:列式存储是主流选择,Parquet和ORC用得最多。列式存储的优势在于按列读取、压缩率高,适合分析型查询。选Parquet还是ORC,主要看生态——Spark生态下Parquet兼容性更好,Hive生态下ORC有时性能更优。文本格式(如CSV)只建议在ODS层临时落地用,正式表一律用列式格式。
分桶与索引:分桶适合大表join场景,通过相同分桶键让join在map端完成,减少shuffle。但分桶不是银弹,分桶数设置不当反而拖慢性能,一般建议分桶数是集群核心数的整数倍。索引方面,大数据场景下传统索引用得少,更多依赖分区裁剪和列式存储的谓词下推。
下面是一个DWD层表的建表示例,用Hive语法示意:
CREATE TABLE dwd_order_detail ( order_id STRING COMMENT '订单ID', user_id STRING COMMENT '用户ID', product_id STRING COMMENT '商品ID', order_amount DECIMAL(18,2) COMMENT '订单金额', order_status INT COMMENT '订单状态', create_time STRING COMMENT '创建时间', update_time STRING COMMENT '更新时间' ) COMMENT '订单明细事实表' PARTITIONED BY (dt STRING COMMENT '分区日期') STORED AS PARQUET TBLPROPERTIES ('parquet.compression'='snappy');这个建表语句里,分区字段dt放在最后,存储格式指定Parquet加snappy压缩,这是比较通用的配置。实际项目中还要考虑生命周期管理,比如ODS层保留一年、DWD层保留两年、ADS层按需保留,这些策略要在建表时就规划好,不然存储成本会失控。
3.3 维度建模的实操心得
维度建模的核心是事实表和维度表的划分。事实表记录业务过程发生的度量值,维度表记录描述性属性。设计时要先确定业务过程(比如下单、支付、退款),再确定粒度(比如一行代表一个订单还是一个订单商品),然后选维度(时间、用户、商品、地区等)和事实(金额、数量等)。
这里有个新人常犯的错误:粒度不统一。同一个事实表里混入不同粒度的数据,比如订单表和订单商品表混在一起,导致金额重复计算。我的建议是每张事实表只表达一个业务过程、一个粒度,需要跨粒度分析时通过维度关联或上层汇总解决。
缓慢变化维(SCD)的处理也是绕不开的话题。用户等级变了、商品价格变了,历史数据怎么关联当时的维度值?常用方案是拉链表(记录生效和失效时间)或者每日全量快照。拉链表省空间但查询复杂,快照表查询简单但存储成本高。我的经验是:维度变化不频繁、历史追溯要求高的用拉链表;变化频繁、存储压力不大的用每日快照,简单可靠。
4. ETL开发与调度编排的完整实现
4.1 ETL脚本开发规范
ETL开发是整个流程里工作量最大的部分,也是最容易积累技术债的地方。我要求团队写ETL脚本必须遵守几条规范,这些规范看着琐碎,但能省下大量后期维护成本。
命名规范:表名、任务名、字段名统一风格。表名建议用“层名_主题_粒度”的结构,比如dwd_trade_order_detail、dws_user_login_1d。任务名和表名对应,方便排查时快速定位。字段名统一小写下划线风格,避免大小写混用。
幂等性:每个ETL任务必须可重复执行且结果一致。实现方式是写入前先删除目标分区再写入,或者用覆盖写模式。幂等性保证了任务失败重跑不会产生重复数据,这是调度系统可靠运行的基础。
参数化:日期、分区等变量通过参数传入,不要硬编码。这样同一个脚本可以跑历史数据补数,也能被调度系统按不同日期调用。下面是一个参数化的Spark SQL示例:
INSERT OVERWRITE TABLE dwd_order_detail PARTITION(dt='${biz_date}') SELECT order_id, user_id, product_id, order_amount, order_status, create_time, update_time FROM ods_order WHERE dt = '${biz_date}' AND order_status IN (1, 2, 3);这里的${biz_date}就是调度系统传入的参数,补数时改参数就能重跑指定日期,非常方便。
注释与文档:每个脚本头部写清楚任务用途、输入输出表、负责人、更新记录。别小看这个习惯,半年后回头看自己写的脚本,没有注释基本等于天书。
4.2 调度依赖配置的核心逻辑
调度系统(如Airflow、DolphinScheduler、Azkaban等)的核心是依赖关系。依赖配错是生产事故的高发区,我见过因为依赖漏配导致下游任务读到空数据、报表全零的事故。
依赖配置要遵循几个原则。第一,同层内尽量并行,跨层严格串行。ODS到DWD、DWD到DWS、DWS到ADS,层与层之间必须等上游全部完成才能启动下游。第二,依赖要精确到任务级别,不能只依赖整层完成。比如DWS的某个汇总任务只依赖DWD的三张表,那就精确依赖这三个任务,不要依赖整个DWD层,否则一个无关任务延迟会拖累整条链路。第三,设置合理的超时和重试。任务超时时间根据历史运行时长设置,一般设为平均时长的2到3倍;重试次数2到3次,重试间隔几分钟,避免瞬时故障导致任务失败。
调度时间也要规划好。假设凌晨0点开始跑批,ODS同步需要30分钟,DWD加工需要1小时,DWS汇总需要40分钟,ADS输出需要20分钟,那整条链路大约2.5小时,早上3点前能跑完,业务方早上上班就能看到数据。如果链路更长,要考虑错峰调度和资源隔离,避免所有任务挤在同一时间抢资源。
4.3 增量与全量加工的取舍实践
ETL加工时,增量处理和全量处理各有适用场景。增量处理只加工变化的数据,资源消耗小、速度快,但实现复杂,要处理晚到数据、更新数据、删除数据;全量处理每次重算全部数据,逻辑简单、结果可靠,但资源消耗大、耗时长。
我的实践原则是:明细层(DWD)尽量增量,汇总层(DWS/ADS)可以全量重算。明细数据量大,增量加工能显著降低资源消耗;汇总层数据量相对小,全量重算逻辑简单不易出错,而且能自然处理历史数据修正的问题。当然,如果汇总层数据量也很大,那就得做增量汇总,这时候要特别注意晚到数据的处理——比如昨天的订单今天才支付,增量汇总时要能把这笔数据补进昨天的汇总里,常见做法是维护一个可回溯的增量窗口,每次加工最近N天的数据做覆盖。
注意:增量加工最怕的是“数据漂移”,即数据在预期时间没到齐。解决办法是在ODS同步后加一个数据完整性校验,确认关键表的数据量在合理范围内再触发下游,或者把加工窗口往后延,给晚到数据留缓冲。
5. 数据质量校验与问题排查实录
5.1 质量校验规则怎么建
数据质量校验不是上线前跑一遍就完事,而是要嵌入到日常调度中,每批次都自动校验。校验规则通常分几类:完整性(关键字段非空、数据量波动在阈值内)、唯一性(主键不重复)、一致性(关联表之间能对上、汇总值和明细值一致)、及时性(数据按时产出)、有效性(字段值在合理范围内,比如金额不为负、状态码在枚举内)。
规则不用一上来就建几百条,先从核心表的主键唯一、关键字段非空、数据量同比波动这三类开始,覆盖住大部分严重问题。数据量波动校验特别有用,比如某张表平时日增100万条,今天突然只有10万条,大概率是上游同步出了问题,这个规则能第一时间发现。
校验结果要有明确的处理策略:严重问题(如主键重复、核心表为空)直接阻断下游并告警;一般问题(如少量字段为空、数据量小幅波动)记录日志并通知负责人,不阻断流程。这个分级很重要,所有问题都阻断会导致流程频繁卡住,所有问题都放行又会让脏数据流到下游。
5.2 常见问题速查表
下面这张表是我这些年踩坑总结出来的高频问题清单,基本覆盖了日常排查的八成场景:
| 问题现象 | 可能原因 | 排查方向 | 处理建议 |
|---|---|---|---|
| 下游报表数据全为零 | 上游任务失败或依赖漏配 | 查调度依赖图、查上游任务状态 | 补依赖、重跑上游 |
| 数据量突然暴增 | 上游重复推送、关联产生笛卡尔积 | 查源表数据量、查join条件 | 去重、修正join逻辑 |
| 数据量突然骤减 | 上游同步中断、过滤条件误加 | 查同步任务日志、查where条件 | 恢复同步、修正过滤 |
| 指标值与业务系统对不上 | 口径不一致、时间边界差异 | 逐条比对计算逻辑 | 统一口径、修正边界 |
| 任务运行越来越慢 | 小文件过多、数据倾斜 | 查文件数、查任务各阶段耗时 | 合并小文件、处理倾斜 |
| 数据重复 | 任务非幂等、重跑未清理 | 查写入模式、查重跑记录 | 改为覆盖写、加去重 |
这张表建议打印出来贴在工位上,出问题时先对照排查,能省不少时间。
5.3 数据倾斜与小文件问题的实战处理
数据倾斜是大数据开发绕不开的经典问题。现象是某个任务卡在最后几个reduce上迟迟不结束,或者某个executor内存溢出。根因是某个key的数据量远超其他key,导致单个任务处理的数据量过大。
处理倾斜的常用手段:加盐打散(给热点key加随机前缀,打散到多个任务处理后再聚合)、map端join(小表广播到大表所在节点,避免shuffle)、拆分热点key单独处理(把热点数据抽出来单独加工再合并)。选哪种取决于场景,加盐通用但要多一轮聚合,map端join适合大小表关联,拆分热点适合热点key明确的场景。
小文件问题同样常见,尤其是流式写入或者分区过细的表。小文件过多会导致NameNode压力大、查询时打开文件开销高。解决办法是定期合并:用调度任务定期把小区间文件合并成大文件,或者写入时控制reduce数量、使用支持文件合并的写入方式。Hive可以用ALTER TABLE ... CONCATENATE,Spark写入时可以设置spark.sql.files.maxRecordsPerFile控制单文件大小。
6. 服务化输出与监控运维的落地细节
6.1 数据服务化的几种形态
数据加工完,最终要能被用起来。服务化输出常见几种形态:指标表/宽表直查(下游直接查ADS层的表)、API接口(封装成HTTP接口供应用调用)、数据推送(主动推送到下游系统)、BI工具对接(配置到报表平台)。选哪种取决于下游的消费方式和技术能力。
直查宽表最简单,适合内部报表和即席分析,但要注意查询并发和资源隔离,别让一个慢查询拖垮整个集群。API接口适合应用系统集成,要做好鉴权、限流、缓存,接口响应时间一般要求控制在几百毫秒内。数据推送适合下游有明确接收方的场景,要保证推送的可靠性和幂等性。BI对接最省事,但指标口径要在BI层统一管理,避免各报表各算各的。
不管哪种形态,元数据管理都很重要。表是干什么的、字段什么含义、谁负责维护、更新频率如何,这些信息要能被下游查到。没有元数据管理的数据平台,用不了多久就会变成“数据沼泽”,谁都不敢用、不知道怎么用。
6.2 监控告警体系怎么搭
监控是保障稳定运行的最后一道防线。监控体系通常分三层:任务层监控(任务是否按时启动、是否成功、运行时长是否异常)、数据层监控(数据量、数据质量、数据延迟)、系统层监控(集群资源、存储水位、服务可用性)。
任务层监控靠调度系统自带的告警就能覆盖大半,重点配置失败告警、超时告警、未按时启动告警。数据层监控靠前面说的质量校验规则,校验不通过触发告警。系统层监控靠集群监控工具,关注CPU、内存、磁盘、网络的使用率,设置水位告警。
告警配置的关键是分级和收敛。所有告警都发到同一个群,用不了几天大家就麻木了。我的做法是按严重程度分三级:P0(核心链路中断、数据严重错误)电话加短信立即通知;P1(非核心任务失败、数据量异常)发到值班群;P2(性能下降、资源水位偏高)记录到日报。同时做告警收敛,同一根因引发的多个告警合并成一条,避免告警风暴。
6.3 迭代优化的节奏把控
项目上线不是终点,而是持续迭代的起点。迭代优化通常围绕几个方向:性能优化(任务跑得更快、资源用得更省)、成本优化(存储压缩、冷热分离、无用表清理)、质量提升(补充校验规则、修复历史数据问题)、需求响应(新增指标、调整口径)。
迭代要有节奏,不能天天改。我的经验是固定发版窗口加紧急通道:常规迭代每周或每两周一个窗口,集中上线;紧急问题走紧急通道,但要有审批和回滚预案。每次迭代前做好影响评估,改动了哪些表、影响了哪些下游、需不需要通知业务方,这些都要提前梳理。上线后观察一到两个调度周期,确认数据正常再关闭迭代。
提示:任何涉及口径变更的迭代,必须提前和业务方确认并同步下游,口径变更不通知是数据团队最容易背锅的事故类型。
7. 我个人在项目流程上的几点体会
流程这东西,写在文档里是死的,跑在项目里是活的。我带过的一个项目,前期指标定义做得特别细,光指标字典就整理了上百条,结果开发阶段业务方需求变了三次,指标字典跟着改了三版,团队怨声载道。后来我调整了策略:核心指标严格定义、边缘指标敏捷响应,核心的十几个指标必须走完整对齐流程,边缘的探索性指标允许先做后调,用迭代的方式逐步收敛。这个平衡点每个项目都不一样,得靠经验去摸。
另一个体会是文档和自动化的投入要趁早。很多团队觉得项目紧、先干活,文档以后补、自动化以后做,结果项目越滚越大,技术债越积越多,最后补文档的成本高到没人愿意碰。我的做法是项目第一天就把文档模板、代码规范、调度规范定下来,哪怕内容先空着,框架先立起来,后面边做边填,比事后补要轻松得多。
还有一点关于人的:大数据项目流程里,数据开发、数据产品、业务方、运维这几方的协作界面要清晰。谁负责指标定义、谁负责数据接入、谁负责质量兜底、谁负责线上告警响应,这些职责要在项目启动时就明确,别等出了问题再扯皮。我见过太多项目因为职责不清,一个数据问题在几个团队之间踢皮球,最后用户等了一周才拿到结果。
最后分享一个我常用的补数小技巧:补历史数据时,不要一次性把整个时间范围丢给调度系统跑,容易把资源打满影响正常任务。正确做法是按天分批补,每批之间留间隔,同时监控集群资源水位,发现资源紧张就暂停,等正常任务跑完再继续。补数任务最好设置低优先级,让正常调度任务优先占用资源。这个细节看着小,但能避免补数把生产链路拖垮的尴尬。