城市供水管网智能监控系统------项目开发实施计划
文档信息
| 项目 |
内容 |
| 项目名称 |
城市供水管网智能监控系统(演示程序) |
| 文档版本 |
V1.0 |
| 编制日期 |
2026年7月 |
| 编制人 |
项目经理 / 技术部部长 / 软件架构师 |
| 目标环境 |
Ubuntu 22.04 LTS,32GB内存,4核以上CPU,100GB可用磁盘 |
| 项目周期 |
12周(84个工作日) |
| 团队规模 |
5人(项目经理兼架构师1人、高级开发2人、中级开发1人、测试1人) |
0. 执行摘要
本计划基于《城市供水管网智能监控系统------演示程序详细需求规格说明书》编制,覆盖从环境搭建到验收交付的完整软件开发生命周期。项目以**"演示目的、生产级架构"为原则------所有代码均为演示用途,但整体部署方案和程序架构具备水平扩展能力**,仅需升级硬件规模和调整配置参数即可承接海量数据处理业务【参见需求规格说明书第1.1节】。
核心约束:
- 单机部署(Ubuntu 22.04,32GB内存)
- 全组件伪分布式/单机模式运行
- 演示100个管网节点的数据采集、ETL、预警与大屏展示
1. 项目阶段总览
| 阶段 |
名称 |
工期 |
核心交付物 |
里程碑 |
| P0 |
项目启动与准备 |
3天 |
项目章程、技术选型确认、开发环境就绪 |
M0: 环境就绪 |
| P1 |
需求分析与确认 |
3天 |
需求规格说明书终稿、接口契约 |
M1: 需求冻结 |
| P2 |
概要设计 |
5天 |
总体架构设计、数据库设计、接口设计 |
M2: 架构基线 |
| P3 |
详细设计 |
7天 |
各模块详细设计说明书、类图、时序图 |
M3: 设计冻结 |
| P4 |
编码与单元测试 |
28天 |
全部源码、单元测试报告 |
M4: 代码完成 |
| P5 |
集成测试 |
10天 |
集成测试报告、性能测试报告 |
M5: 测试通过 |
| P6 |
部署与验收 |
8天 |
部署文档、验收报告、用户手册 |
M6: 项目交付 |
| P7 |
项目收尾 |
2天 |
项目总结报告、归档 |
M7: 项目关闭 |
总工期:66个工作日(约13.2周)
2. 阶段P0:项目启动与准备(第1周,3天)
2.1 核心任务
| 任务ID |
任务名称 |
负责人 |
工期 |
依赖 |
输出 |
| P0-T01 |
项目章程编制与评审 |
项目经理 |
0.5天 |
--- |
项目章程 |
| P0-T02 |
技术栈最终选型确认 |
架构师 |
0.5天 |
P0-T01 |
技术选型决议书 |
| P0-T03 |
开发环境搭建(Ubuntu 22.04) |
高级开发A |
1天 |
P0-T02 |
开发机就绪 |
| P0-T04 |
版本控制仓库初始化(Git) |
高级开发A |
0.5天 |
P0-T03 |
Git仓库 |
| P0-T05 |
项目管理工具配置(Jira/Trello) |
项目经理 |
0.5天 |
--- |
项目管理看板 |
2.2 技术选型决议
基于需求规格说明书第5章及2026年各组件最新版本,确认如下技术栈:
| 层级 |
组件 |
选定版本 |
选型理由 |
| 数据源模拟 |
Java + Kafka Client |
Java 17 / Kafka Client 3.9.2 |
稳定,兼容性好 |
| 消息缓冲 |
Apache Kafka |
3.9.2 |
稳定版,支持KRaft(无需ZooKeeper) |
| 流式写入 |
Spark Structured Streaming |
Spark 3.5.9 |
LTS版本,稳定可靠 |
| 存储层 |
Apache Hadoop HDFS |
Hadoop 3.4.3 |
稳定生产版本 |
| 元数据层 |
Hive Metastore |
Hive 3.1.3(独立部署) |
与Spark 3.x兼容 |
| 计算层 |
Spark SQL |
Spark 3.5.9 |
与流式写入统一 |
| 调度层 |
Apache Airflow |
Airflow 2.10.2 |
稳定版,Python生态成熟 |
| 服务层-点查 |
Apache HBase |
HBase 2.5.15 |
当前稳定版 |
| 服务层-聚合 |
ClickHouse |
ClickHouse 26.6 |
最新稳定版,性能优异 |
| 后端API |
Spring Boot |
Spring Boot 4.1.0 |
最新GA版,支持Java 21 |
| 前端大屏 |
React 19 + ECharts 6 |
--- |
生态成熟,组件丰富 |
| JDK |
OpenJDK |
Java 21 LTS |
Spring Boot 4.1基线要求 |
3. 阶段P1:需求分析与确认(第1-2周,3天)
3.1 核心任务
| 任务ID |
任务名称 |
负责人 |
工期 |
依赖 |
输出 |
| P1-T01 |
需求规格说明书评审与确认 |
项目经理+架构师 |
1天 |
P0-T05 |
需求评审纪要 |
| P1-T02 |
用户故事拆分与优先级排序 |
项目经理 |
0.5天 |
P1-T01 |
产品Backlog |
| P1-T03 |
接口契约定义(OpenAPI 3.0) |
架构师 |
1天 |
P1-T01 |
API契约文档 |
| P1-T04 |
数据模型确认(ER图) |
架构师 |
0.5天 |
P1-T01 |
数据模型V1.0 |
3.2 接口契约清单(输出物)
基于需求规格说明书第3.8.4节,定义以下API契约:
| API端点 |
方法 |
用途 |
数据源 |
响应时间要求 |
/api/dashboard/overview |
GET |
大屏概览统计 |
ClickHouse |
< 1s |
/api/dashboard/trend |
GET |
今日趋势数据 |
ClickHouse |
< 1s |
/api/node/{nodeId}/detail |
GET |
节点详情 |
HBase |
< 50ms |
/api/node/{nodeId}/history |
GET |
节点历史趋势 |
HBase/CK |
< 500ms |
/api/alert/list |
GET |
预警列表 |
预警表 |
< 200ms |
/api/alert/{alertId}/resolve |
PUT |
预警确认/解决 |
预警表 |
< 200ms |
/ws/alert |
WebSocket |
实时预警推送 |
--- |
< 100ms |
4. 阶段P2:概要设计(第2-3周,5天)
4.1 核心任务
| 任务ID |
任务名称 |
负责人 |
工期 |
依赖 |
输出 |
| P2-T01 |
总体架构设计(含部署拓扑) |
架构师 |
1天 |
P1-T04 |
架构设计说明书 |
| P2-T02 |
模块划分与职责定义 |
架构师 |
0.5天 |
P2-T01 |
模块架构图 |
| P2-T03 |
数据库详细设计(Hive/HBase/CK) |
高级开发A |
1天 |
P2-T01 |
DDL脚本集 |
| P2-T04 |
数据流设计(含分区策略) |
高级开发A |
1天 |
P2-T03 |
数据流设计文档 |
| P2-T05 |
接口详细设计(含错误码) |
高级开发B |
1天 |
P2-T01 |
接口设计文档 |
| P2-T06 |
概要设计评审 |
全员 |
0.5天 |
P2-T02~T05 |
评审纪要 |
4.2 模块划分(输出物)
| 模块编号 |
模块名称 |
职责 |
对应需求 |
| M01 |
数据模拟器(Simulator) |
模拟100个传感器数据,写入Kafka |
3.1.1 |
| M02 |
流式写入器(StreamingIngestor) |
Kafka→HDFS流式入湖 |
3.3.1 |
| M03 |
元数据管理器(MetaManager) |
Hive Metastore表管理、分区管理 |
3.4.1 |
| M04 |
ETL处理器(ETLProcessor) |
ODS→DWD→DWS三层ETL |
3.5.1-3.5.3 |
| M05 |
服务导出器(ServiceExporter) |
Hive→HBase/CK数据导出 |
3.6.1-3.6.2 |
| M06 |
规则引擎(RuleEngine) |
预警规则检测与触发 |
3.7.1 |
| M07 |
后端API(BackendAPI) |
Spring Boot RESTful API + WebSocket |
3.8.4 |
| M08 |
前端大屏(FrontendDashboard) |
React大屏展示 |
3.8.1-3.8.3 |
| M09 |
调度编排器(Scheduler) |
Airflow DAG定义与调度 |
3.5.1 |
4.3 HDFS目录结构设计(输出物)
hdfs://namenode:8020/
├── /data/raw/pipe/ # ODS层(外部表)
│ └── dt=2026-07-16/
│ └── hour=14/
│ └── part-0000.snappy.parquet
├── /user/hive/warehouse/
│ ├── dwd_pipe_detail/ # DWD层(内部表)
│ │ └── dt=2026-07-16/
│ │ └── hour=14/
│ │ └── part-0000.snappy.parquet
│ ├── dws_pipe_hourly/ # DWS层(内部表)
│ │ └── dt=2026-07-16/
│ │ └── part-0000.snappy.parquet
│ └── dwd_alert_events/ # 预警表
│ └── dt=2026-07-16/
│ └── part-0000.snappy.parquet
└── /checkpoint/
└── pipe_streaming/ # Spark Streaming Checkpoint
5. 阶段P3:详细设计(第3-4周,7天)
5.1 核心任务
| 任务ID |
任务名称 |
负责人 |
工期 |
依赖 |
输出 |
| P3-T01 |
M01数据模拟器详细设计 |
高级开发A |
0.5天 |
P2-T06 |
类图、时序图 |
| P3-T02 |
M02流式写入器详细设计 |
高级开发A |
1天 |
P2-T06 |
类图、时序图 |
| P3-T03 |
M03元数据管理器详细设计 |
高级开发B |
0.5天 |
P2-T06 |
DDL+管理脚本设计 |
| P3-T04 |
M04 ETL处理器详细设计 |
高级开发A |
1.5天 |
P2-T06 |
类图、SQL设计 |
| P3-T05 |
M05服务导出器详细设计 |
高级开发B |
1天 |
P2-T06 |
类图、时序图 |
| P3-T06 |
M06规则引擎详细设计 |
高级开发B |
1天 |
P2-T06 |
规则配置设计 |
| P3-T07 |
M07后端API详细设计 |
高级开发A |
1天 |
P2-T06 |
Controller/Service设计 |
| P3-T08 |
M08前端大屏详细设计 |
高级开发B |
1天 |
P2-T06 |
组件设计、状态管理 |
| P3-T09 |
M09调度编排器详细设计 |
高级开发A |
0.5天 |
P2-T06 |
DAG定义设计 |
| P3-T10 |
详细设计评审 |
全员 |
1天 |
P3-T01~T09 |
评审纪要 |
5.2 M04 ETL处理器核心类设计(输出物)
// 核心类设计(详细设计阶段输出)
/**
* ODS → DWD 清洗任务
* 对应需求: 3.5.2
*/
public class OdsToDwdJob {
// 核心方法
public void run(String dt, SparkSession spark);
private Dataset<Row> filterAbnormalData(Dataset<Row> input);
private Dataset<Row> convertDataTypes(Dataset<Row> input);
private Dataset<Row> markFaultRecords(Dataset<Row> input);
private void writeToDwd(Dataset<Row> dwdDF, String dt);
}
/**
* DWD → DWS 聚合任务
* 对应需求: 3.5.3
*/
public class DwdToDwsJob {
public void run(String dt, SparkSession spark);
private Dataset<Row> aggregateByRegionAndHour(Dataset<Row> input);
private void writeToDws(Dataset<Row> dwsDF, String dt);
}
/**
* 规则预警检测任务(独立DQC任务)
* 对应需求: 3.7.1
*/
public class RuleAlertJob {
public void run(String dt, SparkSession spark);
private Dataset<Row> detectOfflineNodes(Dataset<Row> dwdDF);
private Dataset<Row> detectPressureAbnormal(Dataset<Row> dwdDF);
private Dataset<Row> detectRegionFaultRate(Dataset<Row> dwsDF);
private void mergeAlertsAndWrite(List<Dataset<Row>> alerts, String dt);
}
6. 阶段P4:编码与单元测试(第4-8周,28天)
6.1 编码任务清单(按模块分解到函数粒度)
M01:数据模拟器(3天)
| 任务ID |
函数/类名 |
负责人 |
工期 |
输入 |
输出 |
单元测试用例数 |
| P4-M01-01 |
NodeConfigLoader.loadNodes() |
中级开发 |
0.5天 |
nodes.conf |
List<Node> |
3 |
| P4-M01-02 |
SensorDataGenerator.generateData(Node) |
中级开发 |
0.5天 |
Node对象 |
JSON字符串 |
5(含异常注入) |
| P4-M01-03 |
SensorDataGenerator.injectAnomaly() |
中级开发 |
0.5天 |
正常值 |
异常值 |
4 |
| P4-M01-04 |
KafkaProducerService.send(String) |
中级开发 |
0.5天 |
JSON字符串 |
发送结果 |
3 |
| P4-M01-05 |
PipeSensorSimulator.main() |
中级开发 |
0.5天 |
--- |
持续运行 |
2(集成) |
| P4-M01-06 |
M01单元测试编写 |
中级开发 |
0.5天 |
--- |
测试报告 |
--- |
M02:流式写入器(4天)
| 任务ID |
函数/类名 |
负责人 |
工期 |
输入 |
输出 |
单元测试用例数 |
| P4-M02-01 |
KafkaSourceReader.createStream() |
高级开发A |
0.5天 |
SparkSession |
DataFrame |
2 |
| P4-M02-02 |
JsonParser.parseAndExtractFields() |
高级开发A |
1天 |
JSON字符串DF |
结构化DF |
6 |
| P4-M02-03 |
PartitionExtractor.extractDtHour() |
高级开发A |
0.5天 |
timestamp |
(dt, hour) |
4 |
| P4-M02-04 |
HdfsWriter.writeParquet() |
高级开发A |
1天 |
DataFrame, path |
StreamingQuery |
3 |
| P4-M02-05 |
CheckpointManager.configure() |
高级开发A |
0.5天 |
--- |
Checkpoint配置 |
2 |
| P4-M02-06 |
PipeStreamingToHdfs.main() |
高级开发A |
0.5天 |
--- |
持续运行的Streaming作业 |
2(集成) |
M03:元数据管理器(2天)
| 任务ID |
函数/类名 |
负责人 |
工期 |
输入 |
输出 |
单元测试用例数 |
| P4-M03-01 |
TableDDL.createOdsTable() |
高级开发B |
0.5天 |
SparkSession |
执行结果 |
2 |
| P4-M03-02 |
TableDDL.createDwdTable() |
高级开发B |
0.5天 |
SparkSession |
执行结果 |
2 |
| P4-M03-03 |
TableDDL.createDwsTable() |
高级开发B |
0.5天 |
SparkSession |
执行结果 |
2 |
| P4-M03-04 |
PartitionManager.addPartition() |
高级开发B |
0.5天 |
table, dt, hour |
执行结果 |
3 |
M04:ETL处理器(5天)
| 任务ID |
函数/类名 |
负责人 |
工期 |
输入 |
输出 |
单元测试用例数 |
| P4-M04-01 |
OdsToDwdJob.filterAbnormalData() |
高级开发A |
1天 |
DataFrame |
清洗后DF |
5 |
| P4-M04-02 |
OdsToDwdJob.convertDataTypes() |
高级开发A |
0.5天 |
DataFrame |
类型转换后DF |
4 |
| P4-M04-03 |
OdsToDwdJob.markFaultRecords() |
高级开发A |
1天 |
DataFrame |
含fault标记DF |
5 |
| P4-M04-04 |
OdsToDwdJob.writeToDwd() |
高级开发A |
0.5天 |
DataFrame, dt |
写入结果 |
2 |
| P4-M04-05 |
OdsToDwdJob.run() |
高级开发A |
0.5天 |
dt, SparkSession |
完整执行 |
2(集成) |
| P4-M04-06 |
DwdToDwsJob.aggregateByRegionAndHour() |
高级开发A |
1天 |
DataFrame |
聚合后DF |
4 |
| P4-M04-07 |
DwdToDwsJob.writeToDws() |
高级开发A |
0.5天 |
DataFrame, dt |
写入结果 |
2 |
M05:服务导出器(4天)
| 任务ID |
函数/类名 |
负责人 |
工期 |
输入 |
输出 |
单元测试用例数 |
| P4-M05-01 |
HBaseConnectionPool.getConnection() |
高级开发B |
0.5天 |
--- |
HBase Connection |
2 |
| P4-M05-02 |
HBaseExporter.buildRowKey() |
高级开发B |
0.5天 |
nodeId, dt, hour |
RowKey字符串 |
4 |
| P4-M05-03 |
HBaseExporter.batchPut() |
高级开发B |
1天 |
List<Row>, Table |
写入结果 |
3 |
| P4-M05-04 |
HBaseExporter.exportDwdToHBase() |
高级开发B |
0.5天 |
DataFrame, dt |
执行结果 |
2 |
| P4-M05-05 |
ClickHouseExporter.buildInsertSQL() |
高级开发B |
0.5天 |
--- |
SQL模板 |
3 |
| P4-M05-06 |
ClickHouseExporter.batchInsert() |
高级开发B |
1天 |
DataFrame, Connection |
写入结果 |
3 |
M06:规则引擎(3天)
| 任务ID |
函数/类名 |
负责人 |
工期 |
输入 |
输出 |
单元测试用例数 |
| P4-M06-01 |
RuleAlertJob.detectOfflineNodes() |
高级开发B |
0.5天 |
DataFrame |
预警DF |
3 |
| P4-M06-02 |
RuleAlertJob.detectPressureAbnormal() |
高级开发B |
0.5天 |
DataFrame |
预警DF |
3 |
| P4-M06-03 |
RuleAlertJob.detectRegionFaultRate() |
高级开发B |
0.5天 |
DataFrame |
预警DF |
3 |
| P4-M06-04 |
RuleAlertJob.mergeAlertsAndWrite() |
高级开发B |
0.5天 |
List<DF>, dt |
写入结果 |
2 |
| P4-M06-05 |
AlertNotifier.sendWebSocketAlert() |
高级开发B |
0.5天 |
Alert对象 |
推送结果 |
2 |
| P4-M06-06 |
RuleAlertJob.run() |
高级开发B |
0.5天 |
dt, SparkSession |
完整执行 |
2(集成) |
M07:后端API(4天)
| 任务ID |
函数/类名 |
负责人 |
工期 |
输入 |
输出 |
单元测试用例数 |
| P4-M07-01 |
ClickHouseDataSource.getConnection() |
高级开发A |
0.5天 |
--- |
DataSource |
2 |
| P4-M07-02 |
HBaseDataSource.getConnection() |
高级开发A |
0.5天 |
--- |
Connection |
2 |
| P4-M07-03 |
DashboardController.getOverview() |
高级开发A |
0.5天 |
--- |
OverviewVO |
3 |
| P4-M07-04 |
DashboardController.getTrend() |
高级开发A |
0.5天 |
--- |
List<TrendVO> |
3 |
| P4-M07-05 |
NodeController.getNodeDetail() |
高级开发A |
0.5天 |
nodeId |
NodeDetailVO |
4 |
| P4-M07-06 |
NodeController.getNodeHistory() |
高级开发A |
0.5天 |
nodeId, hours |
List<HistoryPoint> |
3 |
| P4-M07-07 |
AlertController.getAlertList() |
高级开发A |
0.5天 |
page, size |
Page<AlertVO> |
3 |
| P4-M07-08 |
WebSocketAlertHandler.handleAlert() |
高级开发A |
0.5天 |
Alert对象 |
推送 |
2 |
M08:前端大屏(3天)
| 任务ID |
功能/组件名 |
负责人 |
工期 |
输入 |
输出 |
单元测试用例数 |
| P4-M08-01 |
PipeTopology 组件 |
中级开发 |
0.5天 |
nodes数据 |
拓扑图渲染 |
3 |
| P4-M08-02 |
StatusPanel 组件 |
中级开发 |
0.5天 |
stats数据 |
统计面板 |
3 |
| P4-M08-03 |
AlertList 组件 |
中级开发 |
0.5天 |
alerts数据 |
预警列表 |
3 |
| P4-M08-04 |
TrendChart 组件 |
中级开发 |
0.5天 |
trend数据 |
趋势图 |
3 |
| P4-M08-05 |
NodeDetailModal 组件 |
中级开发 |
0.5天 |
nodeId |
详情弹窗 |
3 |
| P4-M08-06 |
WebSocket客户端服务 |
中级开发 |
0.5天 |
--- |
实时消息接收 |
2 |
M09:调度编排器(2天)
| 任务ID |
函数/类名 |
负责人 |
工期 |
输入 |
输出 |
单元测试用例数 |
| P4-M09-01 |
pipe_daily_pipeline.py DAG定义 |
高级开发A |
1天 |
--- |
DAG文件 |
2 |
| P4-M09-02 |
Airflow BashOperator任务配置 |
高级开发A |
0.5天 |
--- |
任务配置 |
2 |
| P4-M09-03 |
任务依赖链配置 |
高级开发A |
0.5天 |
--- |
依赖图 |
2 |
6.2 单元测试覆盖率目标
| 模块 |
行覆盖率目标 |
分支覆盖率目标 |
| M01 数据模拟器 |
≥ 80% |
≥ 70% |
| M02 流式写入器 |
≥ 75% |
≥ 65% |
| M03 元数据管理器 |
≥ 70% |
≥ 60% |
| M04 ETL处理器 |
≥ 80% |
≥ 70% |
| M05 服务导出器 |
≥ 75% |
≥ 65% |
| M06 规则引擎 |
≥ 85% |
≥ 75% |
| M07 后端API |
≥ 80% |
≥ 70% |
| M08 前端大屏 |
≥ 70% |
≥ 60% |
| M09 调度编排器 |
≥ 60% |
≥ 50% |
6.3 编码阶段里程碑
| 里程碑 |
时间节点 |
验收标准 |
| M4-1 |
第4周末 |
M01+M02完成编码,单元测试通过率100% |
| M4-2 |
第5周末 |
M03+M04完成编码,单元测试通过率100% |
| M4-3 |
第6周末 |
M05+M06完成编码,单元测试通过率100% |
| M4-4 |
第7周末 |
M07+M08完成编码,单元测试通过率100% |
| M4-5 |
第8周末 |
M09完成编码,全部模块联调通过 |
7. 阶段P5:集成测试(第9-10周,10天)
7.1 核心任务
| 任务ID |
任务名称 |
负责人 |
工期 |
依赖 |
输出 |
| P5-T01 |
测试环境搭建(完整集群部署) |
高级开发A |
1天 |
M4-5 |
测试环境就绪 |
| P5-T02 |
端到端数据流测试(Kafka→HDFS→Hive) |
测试 |
1.5天 |
P5-T01 |
测试报告 |
| P5-T03 |
ETL全链路测试(ODS→DWD→DWS) |
测试 |
1.5天 |
P5-T02 |
测试报告 |
| P5-T04 |
服务导出测试(Hive→HBase/CK) |
测试 |
1天 |
P5-T03 |
测试报告 |
| P5-T05 |
规则引擎测试 |
测试 |
1天 |
P5-T04 |
测试报告 |
| P5-T06 |
API接口测试(含WebSocket) |
测试 |
1.5天 |
P5-T05 |
测试报告 |
| P5-T07 |
前端大屏集成测试 |
测试 |
1天 |
P5-T06 |
测试报告 |
| P5-T08 |
性能测试(模拟100节点、7天数据) |
测试 |
1天 |
P5-T07 |
性能测试报告 |
| P5-T09 |
故障恢复测试(组件重启/网络中断) |
测试 |
0.5天 |
P5-T08 |
高可用测试报告 |
| P5-T10 |
集成测试评审 |
全员 |
1天 |
P5-T09 |
评审纪要 |
7.2 端到端测试用例清单
| 用例ID |
测试场景 |
预期结果 |
对应需求 |
| E2E-01 |
模拟器运行1小时,Kafka接收数据 |
100个节点×3600条=360,000条消息 |
3.1.1 |
| E2E-02 |
Spark Streaming消费Kafka写入HDFS |
HDFS生成12个(每小时)Parquet分区文件 |
3.3.1 |
| E2E-03 |
Hive Metastore挂载ODS外部表 |
可查询ods_pipe_raw表,分区可识别 |
3.4.1 |
| E2E-04 |
ODS→DWD清洗任务 |
DWD表数据量=ODS-异常标记数据 |
3.5.2 |
| E2E-05 |
DWD→DWS聚合任务 |
DWS表产生24条/区域(按小时)汇总记录 |
3.5.3 |
| E2E-06 |
DWD→HBase导出 |
RowKey {nodeId}_{dt}_{hour}可50ms内查询 |
3.6.1 |
| E2E-07 |
DWS→ClickHouse导出 |
聚合查询<1秒返回 |
3.6.2 |
| E2E-08 |
规则引擎离线检测 |
连续30分钟无数据的节点触发CRITICAL预警 |
3.7.1 |
| E2E-09 |
规则引擎压力异常检测 |
压力<0.2或>0.8MPa触发WARNING预警 |
3.7.1 |
| E2E-10 |
WebSocket预警推送 |
预警触发后<1秒推送至前端 |
3.8.2 |
| E2E-11 |
大屏拓扑图渲染 |
100个节点全部正确显示,颜色标识符合状态 |
3.8.1 |
| E2E-12 |
节点详情点查 |
点击节点弹出详情,<200ms加载完成 |
3.8.2 |
7.3 性能测试指标
| 指标 |
目标值 |
测试方法 |
| 数据采集吞吐量 |
≥ 100条/秒 |
运行模拟器1小时,统计Kafka消费速率 |
| 流式写入延迟 |
≤ 5分钟 |
检查HDFS文件生成时间与Kafka消息时间戳差值 |
| ODS→DWD ETL耗时 |
≤ 10分钟/天数据 |
跑1天数据(360,000条)计时 |
| DWD→DWS ETL耗时 |
≤ 10分钟/天数据 |
跑1天数据计时 |
| 大屏聚合查询响应 |
≤ 1秒 |
并发10个请求,统计平均响应时间 |
| 节点详情点查响应 |
≤ 50ms |
并发50个请求,统计平均响应时间 |
| WebSocket推送延迟 |
≤ 100ms |
规则触发到前端收到消息计时 |
| 大屏并发支持 |
≥ 50用户 |
模拟50用户同时访问大屏 |
8. 阶段P6:部署与验收(第10-12周,8天)
8.1 核心任务
| 任务ID |
任务名称 |
负责人 |
工期 |
依赖 |
输出 |
| P6-T01 |
部署文档编写 |
高级开发A |
1天 |
P5-T10 |
部署手册 |
| P6-T02 |
用户手册编写 |
中级开发 |
1天 |
P5-T10 |
用户手册 |
| P6-T03 |
运维手册编写(含监控、日志) |
高级开发B |
1天 |
P5-T10 |
运维手册 |
| P6-T04 |
生产环境模拟部署(32GB环境) |
高级开发A |
1天 |
P6-T01~T03 |
部署完成 |
| P6-T05 |
冒烟测试 |
测试 |
0.5天 |
P6-T04 |
冒烟测试报告 |
| P6-T06 |
用户验收测试(UAT) |
项目经理+测试 |
1.5天 |
P6-T05 |
UAT报告 |
| P6-T07 |
验收评审会议 |
全员 |
0.5天 |
P6-T06 |
验收纪要 |
| P6-T08 |
交付物打包与归档 |
项目经理 |
1天 |
P6-T07 |
交付物清单 |
8.2 部署文档大纲(输出物)
部署手册 V1.0
├── 第1章 环境要求
│ ├── 1.1 硬件要求(最低/推荐)
│ ├── 1.2 操作系统要求(Ubuntu 22.04)
│ └── 1.3 网络要求
├── 第2章 组件安装与配置
│ ├── 2.1 JDK 21 安装
│ ├── 2.2 Hadoop 3.4.3 伪分布式配置
│ ├── 2.3 Hive 3.1.3 Metastore独立部署
│ ├── 2.4 Kafka 3.9.2 KRaft模式部署
│ ├── 2.5 Spark 3.5.9 部署
│ ├── 2.6 HBase 2.5.15 单机部署
│ ├── 2.7 ClickHouse 26.6 单机部署
│ ├── 2.8 Airflow 2.10.2 部署
│ └── 2.9 Spring Boot 4.1 应用部署
├── 第3章 数据库初始化
│ ├── 3.1 Hive表DDL执行
│ ├── 3.2 HBase表创建
│ └── 3.3 ClickHouse表创建
├── 第4章 应用部署
│ ├── 4.1 模拟器部署与启动
│ ├── 4.2 Streaming作业提交
│ ├── 4.3 Airflow DAG部署
│ ├── 4.4 Spring Boot API部署
│ └── 4.5 前端大屏部署(Nginx)
├── 第5章 验证测试
│ ├── 5.1 数据流验证
│ └── 5.2 大屏功能验证
└── 第6章 故障处理
├── 6.1 常见问题与解决方案
└── 6.2 组件重启流程
8.3 32GB内存环境资源分配建议
| 组件 |
内存分配 |
说明 |
| Hadoop HDFS (NameNode+DataNode) |
4GB |
伪分布式单进程 |
| Hive Metastore |
1GB |
独立服务 |
| Kafka (KRaft) |
2GB |
单节点 |
| Spark (Driver+Executor) |
8GB |
--executor-memory 4g |
| HBase (Master+RegionServer) |
4GB |
单机模式 |
| ClickHouse |
4GB |
单机 |
| Airflow (WebServer+Scheduler) |
2GB |
--- |
| Spring Boot API |
2GB |
JVM堆1.5GB |
| 前端大屏 (Nginx) |
0.5GB |
--- |
| 操作系统预留 |
4.5GB |
--- |
| 合计 |
32GB |
--- |
9. 阶段P7:项目收尾(第12周,2天)
9.1 核心任务
| 任务ID |
任务名称 |
负责人 |
工期 |
依赖 |
输出 |
| P7-T01 |
项目总结报告编写 |
项目经理 |
1天 |
P6-T08 |
项目总结报告 |
| P7-T02 |
经验教训文档 |
全员 |
0.5天 |
P7-T01 |
经验教训库 |
| P7-T03 |
源码最终归档 |
高级开发A |
0.5天 |
P7-T02 |
代码仓库Tag |
| P7-T04 |
项目关闭会议 |
全员 |
0.5天 |
P7-T03 |
会议纪要 |
10. 关键路径与里程碑总览
Week 1 Week 2 Week 3 Week 4 Week 5 Week 6 Week 7 Week 8 Week 9 Week 10 Week 11 Week 12 Week 13
│ │ │ │ │ │ │ │ │ │ │ │ │
P0(3d) P1(3d) P2(5d) P3(7d) P4(28d) P4(cont) P4(cont) P4(cont) P5(10d) P5(cont) P6(8d) P6(cont) P7(2d)
│ │ │ │ │ │ │ │ │ │ │ │ │
▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼
M0 M1 M2 M3 M4-1 M4-2 M4-3 M4-4 M4-5 M5 M5 M6 M6 M7
关键路径: P0 → P1 → P2 → P3 → P4(M01→M02→M03→M04→M05→M06→M07→M08→M09) → P5 → P6 → P7
里程碑定义:
| 里程碑 |
时间(第X周末) |
交付物 |
| M0: 环境就绪 |
第1周末 |
开发环境、Git仓库、项目管理工具 |
| M1: 需求冻结 |
第2周末 |
需求规格说明书终稿、API契约 |
| M2: 架构基线 |
第3周末 |
架构设计说明书、数据库设计、接口设计 |
| M3: 设计冻结 |
第4周末 |
详细设计说明书(含类图、时序图) |
| M4: 代码完成 |
第8周末 |
全部源码、单元测试报告(覆盖率达标) |
| M5: 测试通过 |
第10周末 |
集成测试报告、性能测试报告 |
| M6: 项目交付 |
第12周末 |
部署文档、用户手册、验收报告 |
| M7: 项目关闭 |
第12周末 |
项目总结报告、源码归档 |
11. 风险评估与应对
| 风险ID |
风险描述 |
概率 |
影响 |
应对措施 |
| R01 |
32GB内存不足以同时运行全部组件 |
中 |
高 |
① 使用伪分布式/单机模式降低内存消耗;② 非核心组件(如Airflow)可暂不启动;③ 按需分配内存【参见第8.3节】 |
| R02 |
Spark版本与Hive Metastore兼容性问题 |
中 |
中 |
① 使用Spark 3.5.9 + Hive 3.1.3标准组合;② 提前做兼容性验证 |
| R03 |
Kafka KRaft模式首次配置复杂 |
低 |
中 |
① 提前准备KRaft配置文件模板;② 使用Kafka 3.9.2稳定版 |
| R04 |
HBase单机模式RegionServer内存溢出 |
中 |
中 |
① 限制HBase堆内存为2GB;② 减少Region数量 |
| R05 |
前端大屏WebSocket连接稳定性 |
低 |
低 |
① 使用标准WebSocket协议;② 实现自动重连机制 |
| R06 |
ClickHouse 26.6新特性不稳定 |
低 |
低 |
① 使用稳定特性,避免实验性功能;② 关注社区补丁 |
12. 文档输入输出清单
12.1 各阶段输入文档
| 阶段 |
输入文档 |
来源 |
| P0 |
需求规格说明书(初稿) |
用户/市场 |
| P1 |
项目章程、技术选型决议 |
P0输出 |
| P2 |
需求规格说明书(终稿)、接口契约 |
P1输出 |
| P3 |
架构设计说明书、数据模型 |
P2输出 |
| P4 |
详细设计说明书、类图、时序图 |
P3输出 |
| P5 |
源码、单元测试报告 |
P4输出 |
| P6 |
集成测试报告、性能测试报告 |
P5输出 |
| P7 |
验收报告、用户手册 |
P6输出 |
12.2 各阶段输出文档
| 阶段 |
输出文档 |
接收方 |
| P0 |
项目章程、技术选型决议书、开发环境配置文档 |
全员 |
| P1 |
需求规格说明书(终稿)、API契约(OpenAPI 3.0)、产品Backlog |
架构师+开发 |
| P2 |
架构设计说明书、模块架构图、DDL脚本集、数据流设计文档 |
开发团队 |
| P3 |
详细设计说明书(含类图、时序图、SQL设计) |
开发团队 |
| P4 |
全部源码、单元测试报告(覆盖率报告)、代码评审记录 |
测试团队 |
| P5 |
集成测试报告、性能测试报告、高可用测试报告 |
项目经理 |
| P6 |
部署手册、用户手册、运维手册、UAT报告、验收纪要 |
用户/运维 |
| P7 |
项目总结报告、经验教训文档、源码归档(Git Tag) |
组织资产库 |
13. 团队分工与职责
| 角色 |
人员 |
职责 |
| 项目经理 |
1人 |
项目计划制定、进度跟踪、风险管理、客户沟通、文档审核 |
| 技术部部长/架构师 |
1人(可兼任项目经理) |
技术选型、架构设计、技术难点攻关、代码评审把关 |
| 高级开发A |
1人 |
M02流式写入器、M04 ETL处理器、M07后端API、M09调度编排器 |
| 高级开发B |
1人 |
M03元数据管理器、M05服务导出器、M06规则引擎 |
| 中级开发 |
1人 |
M01数据模拟器、M08前端大屏 |
| 测试工程师 |
1人 |
单元测试辅助、集成测试、性能测试、验收测试 |
14. 附录:核心函数开发清单(P4阶段详细参考)
A. M04 ETL处理器核心函数详细规格
| 函数签名 |
输入参数 |
返回值 |
核心逻辑 |
预估代码行数 |
filterAbnormalData(Dataset<Row> input) |
原始DataFrame |
清洗后DataFrame |
过滤pressure<0或>1.5、velocity<0的记录 |
30 |
convertDataTypes(Dataset<Row> input) |
原始DataFrame |
类型转换后DF |
CAST字符串为Double/Timestamp |
20 |
markFaultRecords(Dataset<Row> input) |
清洗后DF |
含fault标记DF |
CASE WHEN判定6种异常类型 |
50 |
aggregateByRegionAndHour(Dataset<Row> input) |
DWD DataFrame |
聚合后DF |
GROUP BY region, hour + 7个聚合函数 |
40 |
B. M05服务导出器核心函数详细规格
| 函数签名 |
输入参数 |
返回值 |
核心逻辑 |
预估代码行数 |
buildRowKey(String nodeId, String dt, String hour) |
nodeId, dt, hour |
RowKey字符串 |
{nodeId}_{dt}_{hour} |
5 |
batchPut(Iterator<Row> rows, Table table) |
行迭代器, HBase Table |
void |
每1000条批量Put |
40 |
exportDwdToHBase(String dt, SparkSession spark) |
dt, SparkSession |
void |
读取DWD→foreachPartition→batchPut |
30 |
C. M06规则引擎核心函数详细规格
| 函数签名 |
输入参数 |
返回值 |
核心逻辑 |
预估代码行数 |
detectOfflineNodes(Dataset<Row> dwdDF) |
DWD DataFrame |
预警DataFrame |
GROUP BY node_id HAVING MAX(ts) < now()-1800 |
25 |
detectPressureAbnormal(Dataset<Row> dwdDF) |
DWD DataFrame |
预警DataFrame |
GROUP BY node_id HAVING AVG(pressure)<0.2 OR >0.8 |
25 |
detectRegionFaultRate(Dataset<Row> dwsDF) |
DWS DataFrame |
预警DataFrame |
WHERE fault_rate > 0.05 |
15 |
mergeAlertsAndWrite(List<Dataset<Row>> alerts, String dt) |
预警列表, dt |
void |
UNION ALL + INSERT INTO dwd_alert_events |
25 |
D. M07后端API核心函数详细规格
| 函数签名 |
输入参数 |
返回值 |
核心逻辑 |
预估代码行数 |
getOverview() |
--- |
OverviewVO |
查询ClickHouse获取统计数字 |
30 |
getNodeDetail(String nodeId) |
nodeId |
NodeDetailVO |
HBase RowKey点查 |
35 |
getTrend() |
--- |
List<TrendVO> |
查询ClickHouse获取24小时趋势 |
30 |
handleAlert(Alert alert) |
Alert对象 |
void |
WebSocket推送 |
20 |
15. 总结
本计划以12周、5人团队 的规模,覆盖了从环境搭建到验收交付的完整软件开发生命周期。项目严格遵循需求规格说明书中定义的9大模块、100个管网节点、6条预警规则的技术要求【参见需求规格说明书第2.1节、第3.7.1节】。
核心原则:
- 演示目的、生产架构:代码虽为演示,但部署方案和程序架构具备水平扩展能力
- 文档驱动:每个阶段都有明确的文档输入与输出
- 测试先行:单元测试覆盖率目标明确,集成测试用例完整
- 风险可控:32GB内存环境下的资源分配经过精确计算
项目成功标准:
- 全部9个模块按时交付
- 单元测试行覆盖率≥70%(核心模块≥80%)
- 全部12个端到端测试用例通过
- 性能指标全部达标
- 交付物完整(源码+部署手册+用户手册+运维手册)