# dmp **Repository Path**: bluedream_pp/dmp ## Basic Information - **Project Name**: dmp - **Description**: 数据中台 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-10-02 - **Last Updated**: 2026-10-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # DMP 数据中台 基于 `prompt_v2.md` 实现的 Java 多模块工程(方案 B:JDK 17 + Spring Boot 3.2)。 ## 模块结构 | 模块 | 职责 | 本次实现程度 | | --- | --- | --- | | dmp-parent | 父工程:统一依赖管理 | 完成 | | dmp-common | 通用:统一返回 `Result`、异常处理、`BaseEntity`、MyBatis-Plus 配置 | 完成 | | dmp-rpc-common | 网络层共享库:RPC 协议编解码、模型、配置、注册中心抽象 | 完成(含单测) | | dmp-rpc-boss | 网络层 boss 端:worker 注册/心跳、服务注册、状态监控,**可独立部署** | 完成(含单测) | | dmp-rpc-worker | 网络层 worker 端:向 boss 注册心跳并调用 RPC,**可独立部署** | 完成 | | dmp-system | 系统管理:用户/角色/模块权限 + **统一认证中心**(8081),各业务模块登录均从 dmp-system 验证 | 完成 | | dmp-metacenter-common | 元数据管理公共层:实体/Mapper/多平台采集器/采集源配置契约(boss 与 worker 共享) | 完成 | | dmp-metacenter-worker | 元数据管理采集执行端:多平台元数据采集 + 定时调度 + RPC 心跳上报,**可独立部署** | 完成 | | dmp-metacenter-boss | 元数据管理控制端:数据字典/版本/编辑/采集源管理 + **血缘关系(数据源配置 / SQL 静态解析采集 / 表级血缘图谱 BFS / 影响分析)** + Worker 状态监控页,远程触发采集,**可独立部署** | 完成 | | dmp-indexcenter | 指标管理中心:业务线/主题域/维度/指标(原子/派生/复合、一级/二级)、指标关联数据字典字段、负责人来自 dmp-system,**可独立部署** | 完成 | | dmp-datawarehousedesigner | 数仓模型设计中心 | 骨架 | | dmp-jobschedular-common | 任务调度公共:project/job/task 实体、DAG 执行引擎、shell 执行、报警通知 | 完成(含单测) | | dmp-jobschedular-boss | 任务调度 boss 端:project/job/task 管理、DAG 图设计(拖拽)、执行记录、手动重跑,**可独立部署** | 完成 | | dmp-jobschedular-worker | 任务调度 worker 端:Quartz 定时调度执行 job DAG,**可独立部署** | 完成 | | dmp-sqleditor | SQL 在线编辑器:语法高亮/多标签编辑、脚本树管理、多数据源执行(复用采集源)、结果表格与 CSV/TXT 下载、执行记录,**可独立部署** | 完成 | ## 平台入口(当前生产部署) 所有 Web 平台统一从 **dmp-system(8081)登录**:内置管理员 `admin / admin123`(超级管理员),各模块按角色分配权限(见下方权限矩阵)。当前部署拓扑: ### 192.168.213.131(控制端 / 服务端) | 平台 | 模块 | 访问入口 | 端口 | 说明 | | --- | --- | --- | --- | --- | | 统一认证中心 | dmp-system | http://192.168.213.131:8081 | 8081 | 用户/角色/模块权限管理,各业务模块统一登录验证 | | 元数据管理中心 | dmp-metacenter-boss | http://192.168.213.131:8088 | 8088 | 数据字典采集/查询/版本/编辑、采集源配置(含 JDBC 上传/测试连接)、**血缘关系(SQL 静态解析采集、表级上下游图谱、影响分析)**、Worker 状态监控(**HA 主节点**) | | 指标管理中心 | dmp-indexcenter | http://192.168.213.131:8083 | 8083 | 业务线/主题域/维度/指标(原子/派生/复合)管理与查询,指标关联数据字典字段 | | 任务调度平台 | dmp-jobschedular-boss | http://192.168.213.131:8091 | 8091 | 项目/Job/Task 管理、DAG 拖拽设计、执行记录、手动重跑、定时任务管理(**HA 主节点**) | | SQL 在线编辑器 | dmp-sqleditor | http://192.168.213.131:8093 | 8093 | SQL 编辑/执行/结果查看/脚本管理/执行记录(按用户隔离,admin 可见全部) | | 调度执行端 | dmp-jobschedular-worker | — | 8092 | 无 Web 界面,Quartz 定时执行 Job DAG | | 网络层 boss | dmp-rpc-boss | — | 8866/8867 | worker 注册/心跳 8866、管理端口 8867,无 Web 界面 | | 网络层 worker | dmp-rpc-worker | — | 8870 | 无 Web 界面,向 boss 注册心跳并调用 RPC | | MySQL | — | 192.168.213.131:3306 | 3306 | DMP 主库 `dmp`(root / Root@2026MySql) | ### 192.168.213.130(采集执行端 / 大数据测试环境 / HA 从节点) | 服务 | 模块 | 入口/端口 | 说明 | | --- | --- | --- | --- | | 元数据采集执行端 | dmp-metacenter-worker | http://192.168.213.130:8089 | 连接 131 的 MySQL 与 RPC boss(8866),执行 Hive/Presto/Doris/Kudu 等多平台元数据采集 | | 元数据管理从节点 | dmp-metacenter-boss(standby) | http://192.168.213.130:8098 | **HA 从节点**:查询接口可用,写操作返回 503 并提示访问主节点;8088 被 Hadoop ResourceManager 占用故用 8098 | | 任务调度从节点 | dmp-jobschedular-boss(standby) | http://192.168.213.130:8091 | **HA 从节点**:查询接口可用,写操作返回 503 并提示访问主节点 | | 大数据测试环境 | Hive/Presto/Doris/Kudu/HDFS/ZK | 130 本机各端口 | 用户自建的多平台采集测试环境(如 HDFS 9000/19888、ZK 2181 等) | > **HA 主从(Zookeeper watcher 选举)**:131 主 / 130 从。两个 boss 模块(`dmp-metacenter-boss`、`dmp-jobschedular-boss`)各自在 ZK 集群(192.168.213.128~130:2181)`/dmp/ha/{module}/candidates` 下注册临时有序节点,序号最小者为 active(主),其余为 standby(备);备节点写接口被 `@LeaderOnly` 拦截返回 503(message 提示主节点地址),主节点宕机/断连后剩余序号最小的备节点经 watcher 自动接管。状态接口:`GET /api/ha/status`(需 X-Token,返回 `leader/leaderAddress/instanceAddress`)。 > 部署目录统一为 `/var/dmp/{bin,lib,log}`;启停命令:`/var/dmp/bin/dmp.sh {start|stop|restart|status} [all|system|rpc-boss|rpc-worker|mc-boss|mc-worker|jb-boss|jb-worker|sqleditor|indexcenter]`。jar 与 JDK17 位于 `/var/dmp/lib`,日志在 `/var/dmp/log`。 ## 环境要求 - JDK 17(本机安装于 `D:\Program Files\jdk-17.0.20.1+1`,JAVA_HOME 已配置为用户级环境变量) - Maven(`D:\Program Files\apache-maven-3.8.6` 在 PATH 中) - 本地联调需 MySQL 8.0(目标库 `dmp`,执行 `dmp-metacenter-common/src/main/resources/schema.sql`) ## 构建与测试 ```bash # 全量构建(编译 + 单测 + 打包) mvn clean package # 仅编译 mvn clean compile # 仅跑测试(H2 内存库,不依赖真实 MySQL / ZK) mvn test ``` > 若 `mvn` 命令不可用,用完整路径: > `D:\AIAgent\apache-maven-3.9.9\bin\mvn.cmd clean package` ## dmp-system 系统管理(统一认证中心) ### 架构 各业务模块(元数据管理 / 任务调度 / SQL 编辑器 / 后续 indexcenter、数仓设计)**不再各自维护登录**,统一从 dmp-system(8081)登录并校验模块权限: ``` 前端登录页 ──► 各模块 /api/{module}/login(转发) ──► dmp-system /api/system/login(签发 token) 所有业务请求 X-Token ──► 各模块 SystemAuthInterceptor ──► dmp-system /api/system/auth/verify?token&module 权限:READ=可登录+查询;EDIT=登录+全部增删改查;NONE=不能登录该模块 ``` - dmp-common 提供共享鉴权组件:`SystemAuthClient`(HTTP 调用认证中心)、`SystemAuthInterceptor`(拦截 `/api/**`,GET 需 READ、写需 EDIT,401/403 抛业务异常)、`UserContext`(当前登录人 ThreadLocal)、`SystemAuthProperties`(`dmp.system.url` / `dmp.system.module-id` 配置)。 - 各业务模块只需:yml 加 `dmp.system` 配置 → 注册拦截器(公开路径 login/logout/current-user)→ 前端请求头带 `X-Token`,401/403 自动跳登录页。 ### 表结构(建表脚本 `dmp-system/src/main/resources/sql/schema.sql`) | 表 | 说明 | | --- | --- | | t_system_user | 系统用户:user_name/user_pwd/phone/department/role_id | | t_system_role | 系统角色:role_name(数据开发/数据产品/平台架构师/超级管理员) | | t_system_role_permission | 角色-模块权限关系:role_id + permission_id(模块) + permission_type(READ/EDIT);无记录=无权限 | > 需求文档 DDL 中该表写作 `t_system_user_role`,其语义为"角色的模块权限对应关系",实现按语义命名为 `t_system_role_permission`。 ### 内置角色与权限矩阵(启动自动初始化,幂等) | 角色 | dmp-system | jobschedular | metacenter | indexcenter | 数仓设计 | sqleditor | | --- | --- | --- | --- | --- | --- | --- | | 超级管理员 | EDIT | EDIT | EDIT | EDIT | EDIT | EDIT | | 数据开发 | READ | EDIT | EDIT | READ | READ | EDIT | | 数据产品 | READ | READ | EDIT | EDIT | - | EDIT | | 平台架构师 | EDIT | EDIT | EDIT | EDIT | EDIT | EDIT | 内置管理员:**admin / admin123**(角色=超级管理员,部门=平台管理组)。 ### 部署 1. 建表:执行 `dmp-system/src/main/resources/sql/schema.sql`(dmp 库) 2. 启动(端口 8081):`dmp.sh start system`(Linux 服务器 /var/dmp 部署惯例,见服务器部署章节) 3. 访问 `http://:8081/` → 登录页;登录后左侧菜单:用户管理(增删改查、角色下拉、部门)、角色管理(增删改 + 模块权限三态编辑:无/只读/可编辑) ### 接口 | 方法 | 路径 | 说明 | | --- | --- | --- | | POST | `/api/system/login` | 登录(body:userName/userPwd)→ `{token, user{permissions}}` | | POST | `/api/system/logout` | 注销(body:token) | | GET | `/api/system/auth/verify` | token+module 验证 → `{valid, permission, user}`(供各模块调用) | | GET | `/api/system/auth/current-user` | 当前用户(token 参数) | | GET | `/api/system/auth/modules` | 全部模块定义(前端权限编辑用) | | GET/POST/PUT/DELETE | `/api/system/user...` | 用户管理(需登录,X-Token) | | GET/POST/PUT/DELETE | `/api/system/role...` | 角色管理 + `/api/system/role/{id}/permissions` 保存模块权限 | ### 业务模块接入示例(metacenter-boss) ```yaml # application.yml dmp: system: url: http://127.0.0.1:8081 # dmp-system 认证中心地址 module-id: dmp-metacenter # 本模块标识 ``` ```java // SystemAuthConfig:注册共享拦截器(公开路径 = login/logout/current-user) registry.addInterceptor(new SystemAuthInterceptor( new SystemAuthClient(properties.getUrl()), properties.getModuleId(), PUBLIC_PATHS)) .addPathPatterns("/api/**"); ``` 已接入模块:**dmp-metacenter-boss(8088)、dmp-jobschedular-boss(8091)、dmp-sqleditor(8093)、dmp-indexcenter(8083)**。sqleditor 登录换源为 dmp-system 后,本地 t_sql_user 仅保存脚本/记录归属(角色映射:超级管理员/平台架构师→ADMIN,其余→USER)。indexcenter 登录/登出/当前用户走 `/api/indexcenter/{login,logout,current-user}`,负责人列表直查同库 `t_system_user` 兜底代理 dmp-system 用户接口。 ## dmp-metacenter 使用说明(boss / worker 拆分独立部署) `dmp-metacenter` 已拆分为三个模块: | 模块 | 端口 | 职责 | | --- | --- | --- | | dmp-metacenter-common | - | 实体 / Mapper / 多平台采集器 / 采集源契约(共享库) | | dmp-metacenter-boss | 8088 | 数据字典查询 / 编辑 / 版本、采集源管理、**血缘关系(数据源配置 / SQL 解析采集 / 图谱查询 / 影响分析)**、Worker 状态监控页、远程触发采集 | | dmp-metacenter-worker | 8089 | 多平台元数据采集(mysql/doris/hive/presto/kudu)、定时调度、RPC 心跳上报、接收 boss 远程采集指令 | 1. 建表:在 MySQL 执行 `dmp-metacenter-common/src/main/resources/schema.sql` - 存量库升级(已存在旧表):执行 schema.sql 末尾的 `ALTER TABLE ... ADD COLUMN source`(header/detail 两表各一条) - `source` 字段含义:`1=数据库抽取`(采集写入)、`2=页面编辑`(页面编辑/整体编辑写入) 2. 配置: - worker:编辑 `dmp-metacenter-worker/src/main/resources/application.yml`,其中 `spring.datasource` 为目标库、`meta-hunter.meta-resource` 为源库(被采集对象)、`dmp.rpc.worker.*` 为心跳上报配置(worker-id / role / boss 地址端口) - boss:编辑 `dmp-metacenter-boss/src/main/resources/application.yml`,其中 `dmp.rpc.boss.*` 为网络层 rpc-boss 地址(默认 127.0.0.1:8866) - 密码用环境变量 `${MYSQL_PWD}` 注入 3. 启动: - worker:`mvn spring-boot:run -pl dmp-metacenter-worker`(或 IDEA 运行 `MetaCenterWorkerApplication`),端口 8089 - boss:`mvn spring-boot:run -pl dmp-metacenter-boss`(或 IDEA 运行 `MetaCenterBossApplication`),端口 8088 - 前置:先启动网络层 `dmp-rpc-boss`(8866),worker 启动后自动注册心跳 4. 接口(boss 8088): | 方法 | 路径 | 说明 | | --- | --- | --- | | POST | `/api/metacenter/dict/collect?sourceName=xxx` | 远程触发采集:boss 从在线 worker 中选 meta-hunter 节点,HTTP 调用其 `/api/worker/collect`;sourceName 为空时 worker 用默认源,返回本次采集到的表列表 | | GET | `/api/metacenter/dict/table?tableName=dws_trd_sku_1d` | 查询最新版数据字典 | | GET | `/api/metacenter/dict/table/dws_trd_sku_1d/versions` | 版本列表 | | PUT | `/api/metacenter/dict/detail/{id}` | 编辑单字段(名称/类型/注释,body:`{"columnName":"xx","columnType":"varchar","columnComment":"xx"}`,非空字段生效,生成新版本,source=2) | | PUT | `/api/metacenter/dict/edit` | 整体编辑数据字典(表头 + 字段明细的名称/类型/注释),保存后 data_version + 1,source=2 | | GET | `/api/metacenter/config/list` | 采集源列表(多采集源管理) | | POST | `/api/metacenter/config` | 新增采集源(名称唯一,body:`{"configName":"xx","dbType":"mysql","url":"xx","port":3306,"databaseName":"xx","username":"xx","password":"xx"}`) | | PUT | `/api/metacenter/config/{id}` | 更新采集源(密码留空不修改) | | DELETE | `/api/metacenter/config/{id}` | 删除采集源 | | POST | `/api/metacenter/config/driver/upload` | 上传 JDBC 驱动 jar(multipart `file`,保存到 `meta-hunter.driver-dir`,测试连接时动态加载) | | POST | `/api/metacenter/config/test` | 测试采集源配置能否连通数据库(mysql/hive,5s 超时;配置了驱动 jar 时动态加载;建立连接并执行 `SELECT 1`),返回 `{ok, message, costMs}` | | GET | `/api/metacenter/config/meta-resource` | 查询默认采集源配置(兼容旧接口) | | POST | `/api/metacenter/config/meta-resource` | 保存默认采集源配置(兼容旧接口,写入 `t_meta_source_config`) | | GET | `/api/metacenter/worker/list` | 全部 worker 节点(含离线,经网络层 rpc-boss 查询) | | GET | `/api/metacenter/lineage/source/list` | 血缘数据源列表(TEXT/FILE/JDBC 三种模式) | | POST | `/api/metacenter/lineage/source` | 新增血缘数据源(TEXT:`{"sourceName":"xx","sourceType":"TEXT","sqlText":"SQL脚本"}`;FILE:`{"sourceName":"xx","sourceType":"FILE","filePath":"上传返回的文件名"}`;JDBC:`{"sourceName":"xx","sourceType":"JDBC","dbType":"mysql","url":"xx","port":3306,"databaseName":"xx","username":"xx","password":"xx","sqlTable":"t_sql_script","sqlColumn":"sql_text"}`) | | PUT | `/api/metacenter/lineage/source/{id}` | 编辑血缘数据源(密码留空/掩码不修改) | | DELETE | `/api/metacenter/lineage/source/{id}` | 删除血缘数据源(级联删除其血缘边) | | POST | `/api/metacenter/lineage/source/file/upload` | 上传血缘 SQL 脚本文件(multipart `file`,仅 .sql,保存到 `meta-hunter.lineage-file-dir`,返回 `{filePath, fileName, size}`,存入数据源 filePath 字段) | | POST | `/api/metacenter/lineage/collect/{id}` | 采集解析血缘:TEXT 直接解析 sqlText;FILE 读取上传的 SQL 文件解析;JDBC 连库读取 SQL 表逐条解析,保存到 t_lineage_edge(覆盖该源旧边),返回 `{sqlCount, edgeCount, upstreamTables[], downstreamTables[]}` | | GET | `/api/metacenter/lineage/graph?table=dws.xxx&direction=all&level=3` | 血缘图谱 BFS:`direction=upstream/downstream/all`、`level=1~5`,返回 `{root, nodes[{id,db,table,direction,level}], edges[{from,to,relationType,confidence,sqlText}]}` | | GET | `/api/metacenter/lineage/edges?table=dws.xxx&direction=downstream&level=5` | 影响分析:血缘边明细列表(带层级/方向/SQL) | | GET | `/api/metacenter/lineage/edge/list?sourceId=&table=` | 血缘边原始记录(按数据源或表名过滤) | | GET | `/api/metacenter/worker/online` | 在线 worker 节点 | | GET | `/api/metacenter/worker/{workerId}` | 单个 worker 状态 | 5. worker 内部接口(8089,供 boss 远程调用):`POST /api/worker/collect`(采集)、`POST /api/worker/collect/default`(默认源采集)、`GET /api/worker/status`(worker 自身状态) 6. 前端页面:浏览器访问 `http://localhost:8088/`(后台管理布局,左侧分组菜单) - **数据字典**:元数据采集 / 数据字典查询 / 版本管理 / 采集源配置 / Worker 状态 - **血缘关系**:血缘关系查询 / 血缘关系数据源配置(页面框架开发中) - **数据特征**:数据特征查询 / 数据特征数据源配置(页面框架开发中) - 元数据采集页:采集源下拉框选择录入的采集源,点击"开始采集"后经 worker 远程执行并展示本次采集到的表列表 - Worker 状态页:展示各 worker 节点在线状态 / 心跳时间 / 丢失心跳次数,绿色=在线、红色=离线 - 采集源配置页:列表管理(新增/编辑/删除),录入的采集源即时同步到采集页下拉框;新增/编辑弹窗支持 **JDBC 连接串解析填充**(粘贴 `jdbc:mysql://host:port/db` 自动填写主机/端口/库)、**JDBC 驱动 jar 上传**(测试连接时动态加载)与**测试连接**(建立连接并执行 `SELECT 1`,正常返回即成功,报错回显错误信息) - 存量库升级:`t_meta_source_config` 需执行 `ALTER TABLE ... ADD COLUMN driver_jar varchar(255) null`(见 schema.sql 末尾注释) ### 分机部署(boss 与 worker 分布两台服务器) 生产拓扑示例:**boss 部署在 .131(192.168.213.131),worker 部署在 .130(192.168.213.130)**,网络层 rpc-boss 随 boss 所在机器。 ``` 浏览器 ──► boss 8088 (.131) ──RPC 查询在线 worker──► rpc-boss 8866 (.131) │ HTTP 远程触发 http://192.168.213.130:8089/api/worker/collect ▼ worker 8089 (.130) ──► 采集源 MySQL (.131:3306,如 retail_dw) ──► 数据字典落库 (.131:3306/dmp) ``` worker 在 .130 上需覆盖的配置(通过启动参数,不修改本地 yml 默认值): | 配置键 | .130 部署值 | 说明 | | --- | --- | --- | | `--spring.datasource.url` | `jdbc:mysql://192.168.213.131:3306/dmp?...` | 目标库(数据字典落库 + 采集源表读取) | | `--meta-hunter.meta-resource.url/port` | `192.168.213.131:3306` | 被采集源库所在 MySQL | | `--meta-hunter.target-database.url/port` | `192.168.213.131:3306` | 数据字典落库 MySQL | | `--dmp.rpc.worker.host` | `192.168.213.130` | **上报给 boss 的自身地址**(boss 据此拼 `http://{host}:{port}/api/worker/collect` 远程触发) | | `--dmp.rpc.worker.boss-host/boss-port` | `192.168.213.131:8866` | rpc-boss 注册心跳地址 | | `--meta-hunter.driver-dir` | `/var/dmp/lib/drivers` | JDBC 驱动目录(随 worker 部署,需与 boss 采集源上传的驱动同步) | 前提: - .131 MySQL 需允许 worker 机器远程访问:`root` 授权 host=`%` 且 `bind_address=*`(本项目 .131 已配置) - worker 机器的 8089 端口需对 boss 开放(防火墙放行) - 部署脚本参考 `doc/dmp-worker-130.sh`(单模块版 dmp.sh,用 bash 数组传参避免 URL 中 `&` 被 shell 误解析) - **同一 worker-id 只能有一个在线实例**:迁移后必须停掉旧机器上的 worker,否则 boss 端同名节点地址不会被刷新 > rpc-boss 的 `WorkerStatusManager.onHeartbeat` 会在每次心跳时同步 worker 上报的最新 host/port(worker 迁移/换 IP 后注册信息自动更新,不再保留首次注册的旧地址)。 ### boss 高可用(HA,基于 Zookeeper watcher) `dmp-metacenter-boss` 与 `dmp-jobschedular-boss` 支持多实例主备部署:实例启动时在 ZK 注册**临时有序节点** (路径 `/dmp/ha/{module-name}/candidates`),序号最小者为主节点(leader);备节点通过 `PathChildrenCache`(ZK watcher) 监听节点新增/删除,主节点宕机后自动接管(防脑裂:会话挂起/丢失立即降级)。 - **查询类接口**(字典查询/版本/采集源列表/job 列表与详情/执行记录/worker 状态):任意节点可访问,实现管理面 HA - **写/触发类接口**(标注 `@LeaderOnly`:采集触发、字典编辑、采集源增删改/驱动上传/连接测试、job/项目/task 保存删除、手动 run/重跑):仅主节点可执行,备节点返回 `code=503` 并提示主节点地址 - 前端页面顶部显示主备状态条(主=绿色 / 备=黄色);`GET /api/ha/status` 返回主备状态与主节点地址 - 配置(两个 boss 的 `application.yml`):`dmp.ha.enabled=true`、`dmp.ha.zk-servers=192.168.213.128:2181,192.168.213.129:2181,192.168.213.130:2181`、`dmp.ha.module-name`、`dmp.ha.instance-address`(部署时建议显式配置本实例对外地址) - 未配置 `dmp.ha.enabled=true` 时保持单机行为(恒为主节点),完全兼容原有部署 - 详细部署与切换验证:见 `doc/ha-boss.md` ## dmp-indexcenter 指标管理中心 ### 部署 1. 建表:启动时自动执行 `dmp-indexcenter/src/main/resources/schema.sql`(6 张表:t_indexcenter_business_line/topic/dimension/dimension_topic/index/index_column,全部 IF NOT EXISTS 幂等;需求 DDL 笔误已修正:decription→description、bussiness_definition→business_definition、refenrence_count→reference_count、关系表命名 t_indexcenter_dimension_topic、指标关联表命名 t_indexcenter_index_column) 2. 启动(端口 8083):`dmp-indexcenter`,访问 `http://localhost:8083/` → 登录页(dmp-system 统一账号,如 admin/admin123) 3. 登录鉴权:`dmp.system.url=127.0.0.1:8081`、`module-id=dmp-indexcenter`;权限矩阵:超级管理员/平台架构师/数据产品=EDIT,数据开发=READ(读可、写 403) 4. 指标负责人:直查同库 `t_system_user`(表不存在时兜底代理 dmp-system `/api/system/user/list`);关联数据字典字段跨表读 `t_meta_data_dictionary_detail/header` 最新版本(复用元数据中心数据,无需另建采集) ### 功能 - **三级分层**:业务线(电商/游戏等)→ 主题域(交易域/售后域等)→ 业务过程(加购/下单/支付,通过指标口径体现) - **指标类型与命名规范**:原子指标(动作+度量,如"注册用户数");派生指标(时间周期+统计粒度+修饰词+原子指标,标识形如 `修饰词_原子指标_时间周期`,如 `new_reg_user_cnt_30d`,后端对标识做下划线分段校验);复合指标 - **一级/二级分级**:一级=中台直接产出,二级=业务部门创建 - **维度管理**:可分析维度(时间/渠道/地区),一个维度可关联多个主题域(主主题域 + 关联主题域) - **指标关联数据字典字段**:指标弹窗内搜索元数据中心字段(表名/字段名/注释模糊),勾选关联并保存 columnId+columnVersion;指标详情展示关联字段表 - **查询页多条件**:指标名称/标识模糊、指标类型多选、主题域多选、负责人、指标等级 + 分页 - **统计字段**:reference_count(应用次数,供报表等系统 `POST /{id}/reference-count` 更新)、query_count(查询次数) - **页面布局**:后台管理布局,左侧分组菜单(业务线/主题域/维度/指标),右侧功能操作界面 ### 接口 | 方法 | 路径 | 说明 | | --- | --- | --- | | POST | `/api/indexcenter/login` | 登录(转发 dmp-system,body:userName/userPwd) | | POST | `/api/indexcenter/logout` | 注销 | | GET | `/api/indexcenter/current-user?token=` | 当前用户 | | GET | `/api/indexcenter/business-line/list?businessName=` | 业务线列表(名称模糊) | | POST/PUT/DELETE | `/api/indexcenter/business-line[/{id}]` | 业务线增删改(名称唯一;删除前校验主题域引用) | | GET | `/api/indexcenter/topic/list?topicName=&businessLineId=` | 主题域列表(附所属业务线名) | | POST/PUT/DELETE | `/api/indexcenter/topic[/{id}]` | 主题域增删改(删除前校验维度/指标引用) | | GET | `/api/indexcenter/dimension/list?dimensionName=&topicId=` | 维度列表(附主主题域名) | | GET | `/api/indexcenter/dimension/{id}` | 维度详情(含关联主题域列表) | | POST/PUT | `/api/indexcenter/dimension[/{id}]` | 维度增改(body:`{dimension, linkedTopicIds}`) | | DELETE | `/api/indexcenter/dimension/{id}` | 删除维度(校验指标引用) | | POST | `/api/indexcenter/index/list` | 指标分页查询(body:IndexQuery,多条件) | | GET | `/api/indexcenter/index/{id}` | 指标详情(含关联字典字段) | | POST/PUT/DELETE | `/api/indexcenter/index[/{id}]` | 指标增删改(body:IndexSave,含 columns 关联字段) | | POST | `/api/indexcenter/index/{id}/query-count` / `/{id}/reference-count` | 查询/应用次数 +1 | | GET | `/api/indexcenter/meta/users` | 负责人列表(直查 t_system_user) | | GET | `/api/indexcenter/meta/dict/columns?keyword=` | 数据字典字段选项(最新版本,供指标关联) | ## dmp-rpc 网络层说明(boss / worker 独立部署) - 协议:Netty + 长度前缀 JSON 帧(`RpcMessageCodec`,共享于 `dmp-rpc-common`) - 心跳:worker 默认每 10 秒主动上报,boss 侧连续 3 次超时判定失联并通知(`WorkerStatusListener`) - RPC:通用反射调用(`RpcServiceRegistry`),内置 `BossMonitorService.getOnlineWorkers()` - HA:`ZookeeperRegistry` 临时有序节点选举 active/standby,active 失联 standby 自动接管(参考 NameNode HA) boss 与 worker 已拆分为两个可独立部署的 Spring Boot 应用: ```bash # 启动 boss(监听 8866,管理端口 8867) mvn -pl dmp-rpc-boss spring-boot:run # 或 java -jar dmp-rpc-boss/target/dmp-rpc-boss-1.0.0-SNAPSHOT.jar # 启动 worker(向 127.0.0.1:8866 注册心跳) mvn -pl dmp-rpc-worker spring-boot:run # 或 java -jar dmp-rpc-worker/target/dmp-rpc-worker-1.0.0-SNAPSHOT.jar ``` 配置(各自 application.yml): ```yaml # dmp-rpc-boss dmp: rpc: boss: port: 8866 registry: enabled: false # 需要 Zookeeper 时开启 zk-servers: 127.0.0.1:2181 # dmp-rpc-worker dmp: rpc: worker: worker-id: worker-1 role: meta-hunter host: 127.0.0.1 port: 0 boss-host: 127.0.0.1 boss-port: 8866 heartbeat-interval-ms: 10000 ``` ## dmp-jobschedular 任务调度平台 数仓任务三层抽象:`project`(项目)→ `job`(任务)→ `task`(DAG 节点),定时调用 shell 脚本完成数仓任务。 ### 部署 1. 建表:在调度库(默认 `dmp`)执行 `dmp-jobschedular-boss/src/main/resources/schema.sql`(6 张表:project/job/task/depend/执行记录/task 明细) 2. 启动 boss(管理端,端口 8091):`dmp-jobschedular-boss`,访问 `http://localhost:8091/` 3. 启动 worker(定时调度端,端口 8092):`dmp-jobschedular-worker`,启动时自动把库中 `enabled=1` 且有 cron 的 job 注册到 Quartz 4. 配置 `jobschedular-db`(Quartz 及数据所在库)、`jobschedular-shell.command`(shell 执行环境,默认 Windows=cmd /c、Linux=bash)、`jobschedular-alert`(飞书/企微 webhook、邮箱 SMTP,未配置则仅记日志) 5. boss 端保存/停用 job 后,调用 `POST /api/jobschedular/schedule/reload` 让 worker 生效(或重启 worker) ### 功能 - **project/job/task 三层管理**:列表 + 名称搜索 + 表单新建/编辑 - **DAG 图设计**:job 详情页进入编辑模式,任务节点可拖拽摆放、连线模式点两个节点建边、双击连线删除、添加/编辑/删除任务节点(start/end 为虚拟节点) - **定时调度**:job 配置 Quartz cron 表达式,worker 到点执行 - **三种重试方式**:SKIP 略过不重跑 / FROM_FAILED 从报错节点开始重跑(仅失败节点及其下游)/ RESTART_ALL 报错即关闭正在跑的任务从第一个 task 重跑 - **四种报警**:飞书 / 企业微信(webhook)、邮箱(SMTP)、短信(SmsSender SPI,默认日志实现),task 可单独配置报错后是否报警 - **job 级依赖**:配置依赖 job;未启用依赖时间窗口时,上游无成功执行记录则本次跳过(SKIPPED) - **依赖时间窗口**:job 可配置依赖时间(分钟),>0 时本 job 启动要求每个依赖 job 在「启动时刻-窗口 ~ 启动时刻」内有成功记录,全部满足才真正执行 task;不满足进入等待(WAITING,前端蓝色标签),每 60 秒重查,超过窗口时长仍不满足则置为失败(FAILED) - **执行记录**:每次运行写执行记录与 task 明细,boss 端可查询状态(含等待依赖)、失败信息,可手动触发执行/重跑失败 ### 接口 | 方法 | 路径 | 说明 | | --- | --- | --- | | GET | `/api/jobschedular/project/list?name=` | 项目列表(按名称搜索) | | POST | `/api/jobschedular/project` | 新建项目 | | PUT | `/api/jobschedular/project/{id}` | 编辑项目 | | DELETE | `/api/jobschedular/project/{id}` | 删除项目 | | GET | `/api/jobschedular/job/list?projectId=&name=` | job 列表(按项目 + 名称搜索) | | POST | `/api/jobschedular/job` | 保存 job(body:`{job, tasks, edges, dependJobIds}`,job 含 `dependWindowMin` 依赖时间窗口分钟,0=不启用;job+tasks+图+依赖一次提交) | | GET | `/api/jobschedular/job/{id}` | job 详情(tasks/图/依赖/最近执行记录) | | DELETE | `/api/jobschedular/job/{id}` | 删除 job | | POST | `/api/jobschedular/job/task` | 新增/编辑 task 节点 | | DELETE | `/api/jobschedular/job/task/{id}` | 删除 task 节点 | | POST | `/api/jobschedular/job/{id}/run` | 手动触发执行(重跑) | | POST | `/api/jobschedular/job/{id}/run-from-failed` | 从报错节点开始重跑 | | GET | `/api/jobschedular/job/{id}/records?limit=&startTime=&endTime=&status=` | 执行记录(含 task 明细);startTime/endTime 按 job 开始执行时间过滤(`yyyy-MM-dd HH:mm:ss` 或 `yyyy-MM-dd'T'HH:mm`),status=SUCCESS/FAILED/RUNNING/SKIPPED | | POST | `/api/jobschedular/schedule/reload` | worker 重载定时调度(worker 端口) | | GET | `/api/jobschedular/schedule/status` | worker 当前调度数(worker 端口) | ## dmp-sqleditor SQL 在线编辑器 ### 部署 1. 建表:启动时自动执行 `dmp-sqleditor/src/main/resources/schema.sql`(4 张表:t_sql_folder/t_sql_script/t_sql_exec_record/t_sql_user,全部 IF NOT EXISTS 幂等;数据源复用元数据中心 `t_meta_source_config`,无需另建) - **存量库升级**(旧表无 owner 列时执行):`ALTER TABLE t_sql_folder ADD COLUMN owner VARCHAR(64) NULL COMMENT '归属用户名' AFTER folder_name; ALTER TABLE t_sql_script ADD COLUMN owner VARCHAR(64) NULL COMMENT '归属用户名' AFTER content;` - **元数据中心存量升级**(库级补全需要):`ALTER TABLE t_meta_data_dictionary_header ADD COLUMN database_name varchar(225) null COMMENT '所属源库名' AFTER task_for_table;`(升级后重新采集一次,新采集表会带上库名) 2. 启动(端口 8093):`dmp-sqleditor`,访问 `http://localhost:8093/` 3. 登录:统一从 dmp-system 认证中心验证(admin / admin123 等 dmp-system 账号;超级管理员/平台架构师映射为 ADMIN,其余角色映射为 USER,脚本/记录归属仍落 t_sql_user) 4. 前置:在元数据中心「采集源配置」录入数据源(含 JDBC 驱动 jar 上传,驱动目录 `D:/AIAgent/drivers`),编辑器数据源下拉即来自该表 ### 功能 - **登录鉴权**:首次进入需登录(走 dmp-system 统一账号);普通用户(USER)只能看到/操作自己创建的脚本与执行记录,管理员(ADMIN)可见全部;右上角显示当前用户与角色,可退出登录 - **多标签编辑**:顶部标签栏新建/切换/关闭,支持重命名(另存为)、未保存标记;编辑器支持 SQL 关键字/字符串/注释/数字高亮、行号(当前为离线轻量实现,可替换 CodeMirror) - **脚本树管理**:左侧树状浏览文件夹/脚本,新建/重命名/删除文件夹,双击脚本打开到标签;脚本 Ctrl+S 保存、另存为 - **SQL 执行**:选择数据源后执行,支持多语句(分号切分、忽略引号/注释内分号)、DDL/DML 影响行数、查询结果表格化、超时/行数上限(默认 1000 行,超限截断提示);**Ctrl+Enter 有选中文本时只执行选中部分**,无选中时执行全部 - **结果下载**:查询结果一键下载 CSV / TXT(UTF-8 BOM,Excel 可直接打开) - **格式化**:内置轻量 SQL 格式化(关键字换行缩进,离线替代 sql-formatter) - **代码提示/自动补全**:输入时下拉提示 SQL 关键字/函数,及 **库名(来自采集源 database_name)/数据字典表名/字段名**;`sel` 提示 `select`、`retail` 提示 `retail_dw` 等库名;**在库名后敲 `.` 下拉提示该库下的表**(表名按采集源库名分组);表名后 `.` 提示字段 - **执行记录**:每次执行记录脚本、数据源、执行人、耗时、行数、成败与错误信息;**支持按开始/结束日期区间查询**,条数可选 50/100/200;普通用户仅见自己的记录 ### 接口 | 方法 | 路径 | 说明 | | --- | --- | --- | | POST | `/api/sqleditor/login` | 登录(body:username/password)→ `{token, username, role, nickname}` | | POST | `/api/sqleditor/logout` | 退出登录(请求头 X-Token) | | GET | `/api/sqleditor/current-user` | 当前登录用户(请求头 X-Token) | | GET | `/api/sqleditor/datasources` | 数据源下拉(复用 t_meta_source_config) | | GET | `/api/sqleditor/completions` | 自动补全词库(库名/数据字典表名按库分组/字段名) | | GET | `/api/sqleditor/tree` | 文件夹 + 脚本树(按当前用户过滤) | | POST | `/api/sqleditor/folder?parentId=&folderName=` | 新建文件夹 | | PUT | `/api/sqleditor/folder/{id}?folderName=` | 重命名文件夹 | | DELETE | `/api/sqleditor/folder/{id}` | 删除文件夹(级联子文件夹/脚本) | | GET | `/api/sqleditor/script/{id}` | 脚本详情 | | POST | `/api/sqleditor/script` | 新建脚本(body:folderId/scriptName/content) | | PUT | `/api/sqleditor/script/{id}` | 保存脚本(body:scriptName/folderId/content) | | DELETE | `/api/sqleditor/script/{id}` | 删除脚本 | | POST | `/api/sqleditor/execute` | 执行 SQL(body:sql/datasourceId/scriptId/scriptName/executor)→ `{columns, rows, affected, truncated, costMs, message}` | | GET | `/api/sqleditor/records?limit=&startDate=&endDate=` | 执行记录(日期区间可选,按用户过滤) | > 鉴权说明:除 login/logout/current-user 外,全部接口需请求头 `X-Token: `;未登录返回 code=401。 ## 测试覆盖 | 模块 | 测试 | 覆盖点 | | --- | --- | --- | | dmp-rpc-boss | `WorkerStatusManagerTest` | 注册、心跳超时失联、恢复 | | dmp-rpc-common | `RpcMessageCodecTest` | 编解码往返 | | dmp-rpc-boss | `BossWorkerIntegrationTest` | boss-worker 注册/心跳/RPC 全链路(不依赖 ZK) | | dmp-metacenter | `MetaDataCollectorTest` | 采集聚合 | | dmp-metacenter | `MetaDataSaverTest` | 落库 + 版本自增 | | dmp-metacenter | `MetaDataDictServiceTest` | 采集一致性(测试案例1)、编辑版本管理、整体编辑版本化 | | dmp-metacenter | `MetaSourceConfigServiceImplTest` | 采集源配置持久化(t_meta_source_config) | | dmp-jobschedular-common | `JobDagExecutorTest` | 链式顺序、分叉并行、SKIP 失败中断、依赖跳过、环检测、FROM_FAILED 子图、RESTART_ALL 重跑 | ## 待办(后续迭代) - [ ] dmp-jobschedular:relation-graph 框架接入(当前为原生 SVG 拖拽实现) - [ ] dmp-jobschedular:worker 定时自动重载调度(当前手动 /reload 或重启) - [ ] dmp-jobschedular:短信通道接入真实服务商 - [ ] dmp-metacenter:数据特征存储与查询(表结构待补) - [x] dmp-metacenter:血缘关系存储 + SQL 解析器(t_lineage_source / t_lineage_edge + SqlLineageParser,已实现采集与图谱查询) - [x] dmp-system:用户/角色/权限完整实现 - [ ] dmp-indexcenter:指标、维度定义管理 - [ ] dmp-datawarehousedesigner:数仓模型设计 - [ ] dmp-rpc-boss:对接 Zookeeper 的 HA 集成测试