فهرست منبع

docs(kb): 00 项目架构改名项目导览;93 补 ADR 模板;91 入库

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
tianyu.chu 2 هفته پیش
والد
کامیت
a8fbd72d1f
8فایلهای تغییر یافته به همراه270 افزوده شده و 10 حذف شده
  1. 2 2
      README.md
  2. 2 2
      kb/00-项目导览.md
  3. 1 1
      kb/02-权限与账号.md
  4. 1 1
      kb/30-开发规范.md
  5. 1 1
      kb/90-重构路线.md
  6. 244 0
      kb/91-重构备忘.md
  7. 2 1
      kb/92-重构进度.md
  8. 17 2
      kb/93-架构决策.md

+ 2 - 2
README.md

@@ -64,7 +64,7 @@ PG/ES ──DataX(raw)──> RAW ──> ODS ──> DWD ──> DWS ──> TD
 
 | 文档 | 职责 |
 |----|----|
-| [00-项目架构](kb/00-项目架构.md) | **架构**:目录结构、模块关系、执行链、配置管理、DataX / Spark 入口、部署架构 |
+| [00-项目导览](kb/00-项目导览.md) | **项目导览**:目录结构、配置管理、DataX / Spark 入口、执行链路、基础模块、部署架构 |
 | [01-运行环境](kb/01-运行环境.md) | **基础设施**:CDH 版本矩阵、集群拓扑、开发侧约束 |
 | [02-权限与账号](kb/02-权限与账号.md) | **鉴权链路**:HS2 doAs / PySpark / Ranger / LDAP;job 账号 vs 个人账号 |
 
@@ -103,7 +103,7 @@ PG/ES ──DataX(raw)──> RAW ──> ODS ──> DWD ──> DWS ──> TD
 ## 阅读建议
 
 **新成员上手路径:**
-1. [00-项目架构](kb/00-项目架构.md) — 了解模块全貌
+1. [00-项目导览](kb/00-项目导览.md) — 了解模块全貌
 2. [01-运行环境](kb/01-运行环境.md) — 了解基础设施
 3. [20-数仓分层与建模](kb/20-数仓分层与建模.md) — 了解建模方法论
 4. [21-命名规范](kb/21-命名规范.md) — 熟悉命名规则

+ 2 - 2
kb/00-项目架构.md → kb/00-项目导览.md

@@ -1,6 +1,6 @@
-# 项目架构
+# 项目导览
 
-> `poyee-data-warehouse` 数据仓库工程的模块划分、执行时序与配置管理。
+> `poyee-data-warehouse` 数据仓库工程的模块划分、执行时序与配置管理;面向团队新人 / 外部协作者的入口文档
 
 **项目状态**:重构中,目前采用**原地渐进式重构**模式。
 

+ 1 - 1
kb/02-权限与账号.md

@@ -185,7 +185,7 @@ sequenceDiagram
 
 ## 4. 数据源账号(非 LDAP/Ranger 链路)
 
-DataX 采集需要访问外部数据源(PG / MySQL / MongoDB / ES 等),这些账号**不走 LDAP/Ranger**,而是以明文/加密形式存放在项目同级目录,按 `{db_type}/{env}-{实例简称}.ini` 扁平组织(不再按 env 分子目录)。完整目录结构见 `00-项目架构.md` §1。
+DataX 采集需要访问外部数据源(PG / MySQL / MongoDB / ES 等),这些账号**不走 LDAP/Ranger**,而是以明文/加密形式存放在项目同级目录,按 `{db_type}/{env}-{实例简称}.ini` 扁平组织(不再按 env 分子目录)。完整目录结构见 `00-项目导览.md` §1。
 
 由运维同学维护,**不纳入本仓库版本控制**。开发 DataX 作业时 sync ini 里 `dataSource = {db_type}/{env}-{实例简称}`,代码按首段斜杠定位 source ini。
 

+ 1 - 1
kb/30-开发规范.md

@@ -470,7 +470,7 @@ jobs/ads/trd/
 
 ## 6. manual/ 临时 SQL 规范
 
-`manual/` 目录存放**一次性、非幂等**的 SQL 脚本,与 `jobs/` 的语义完全独立。子目录树见 `00-项目架构.md` §1。开发团队核心规则:
+`manual/` 目录存放**一次性、非幂等**的 SQL 脚本,与 `jobs/` 的语义完全独立。子目录树见 `00-项目导览.md` §1。开发团队核心规则:
 
 1. **严禁接入定时调度**:`manual/` 下任何脚本都不得被 DolphinScheduler 定时工作流引用;仅允许通过一次性工作流或命令行手动触发
 2. **命名必须带日期前缀**:`{yyyymmdd}_{层}_{域}_{简述}.sql`,便于按时间排序与过期归档

+ 1 - 1
kb/90-重构路线.md

@@ -94,7 +94,7 @@ D 基础设施 ─────┘
 
 **重要澄清**:老项目 `launch-pad/` 中的业务代码**与新项目业务完全无关**(属于上个项目的历史业务),**不存在内容迁移**。`launch-pad/` 在重构期间作为**样板 SQL 代码的参考**(看写法、看 `${dt}` 用法、看 DataX ini 结构),新项目所有业务 SQL 从零开发完成后,`launch-pad/` 整体删除。
 
-**新 `jobs/` 目录**按数仓分层 × 业务域二维组织,结构见 `00-项目架构.md` §1 目录树与 `30-开发规范.md` §4.2。业务域代码统一使用命名规范定义的 `trd`/`usr`/`prd`/`shp`/`pub`/`dim`(见 `21-命名规范.md` §3.2)。
+**新 `jobs/` 目录**按数仓分层 × 业务域二维组织,结构见 `00-项目导览.md` §1 目录树与 `30-开发规范.md` §4.2。业务域代码统一使用命名规范定义的 `trd`/`usr`/`prd`/`shp`/`pub`/`dim`(见 `21-命名规范.md` §3.2)。
 
 **需要处理的代码引用**:
 - 脚本中 `list_files('launch-pad/...')` 的硬编码路径 → 改为 `jobs/...`

+ 244 - 0
kb/91-重构备忘.md

@@ -0,0 +1,244 @@
+### 4.3 DataX 脚本详细使用说明 (即将重构)
+
+DataX 脚本分为**执行脚本**和**辅助工具**两类,调用链如下:
+
+```
+datax-multiple-hive-job-starter.sh   (MySQL→Hive 专用批量入口,含自动分区管理)
+        │
+        ▼
+datax-multiple-job-starter.sh        (通用批量入口)
+        │
+        ▼
+datax-single-job-starter.sh          (单任务入口)
+        │
+        ├─► datax-job-config-generator.py   (ini→json 配置生成)
+        │           │
+        │           ▼
+        │   dw_base/datax/job_config_generator.py(生成引擎)
+        │
+        ▼
+python datax.py generated.json       (DataX 框架执行数据同步)
+```
+
+辅助工具:`datax-gc-generator.py`(连接源库元数据,批量生成 ini 配置文件)
+
+> **`.py` 同名包装器**:`datax-single-job-starter.py`、`datax-multiple-job-starter.py`、`datax-multiple-hive-job-starter.py` 是对应 `.sh` 的薄 Python 包装,**仅供本地调试**,禁止在 DolphinScheduler 调度中使用。
+
+---
+
+#### 4.3.1 `datax-single-job-starter.sh` —— 单任务启动
+
+**用途**:启动单个 DataX 同步任务。接受已生成的 JSON 或待生成的 ini 配置。
+
+**参数**:
+
+| 参数                     | 必填   | 说明                                                      |
+| ------------------------ | ------ | --------------------------------------------------------- |
+| `-c <path>`              | 二选一 | DataX 作业 JSON 配置文件(绝对路径)                      |
+| `-gc <path>`             | 二选一 | DataX ini 配置文件(项目内相对路径或绝对路径),`-c` 优先 |
+| `-start-date <yyyyMMdd>` | 否     | 开始日期,默认昨天                                        |
+| `-stop-date <yyyyMMdd>`  | 否     | 结束日期,默认今天                                        |
+| `-host <hostname>`       | 否     | 指定执行主机,优先于 `-random`                            |
+| `-random`                | 否     | 随机选择 Worker 节点                                      |
+| `-skip-datax`            | 否     | 跳过实际 DataX 执行(仅生成配置)                         |
+
+**Worker 选择逻辑**(`select_worker()`):
+
+1. 非 `bigdata` 用户 → 强制本机执行
+2. 非发布目录下执行 → 强制本机执行
+3. 指定了 `-host` → 使用指定主机
+4. 指定了 `-random` → 从 `DATAX_WORKERS_QUEUE` 随机选一台
+5. 都未指定 → 本机执行
+
+**HDFS 数据检查**(`check_data_exists()`):当 JSON 配置路径包含 `hdfs-` 时,会自动检查 HDFS reader 路径是否存在且有数据,无数据则跳过执行。
+
+**示例**:
+
+```bash
+# 采集任务(raw 层 ini)
+bin/datax-single-job-starter.sh -gc jobs/raw/trd/raw_trd_order_pay_inc_d.ini -start-date 20260415 -env prod
+
+# 导出任务(ads 层 ini)
+bin/datax-single-job-starter.sh -gc jobs/ads/trd/ads_trd_gmv_d_export.ini -start-date 20260415 -env prod
+
+# 使用已生成的 JSON(跳过生成,env 已嵌入 JSON)
+bin/datax-single-job-starter.sh -c /abs/path/to/generated.json
+```
+
+> **待重构项**(见 `90-重构路线.md` §2.1 DataX 条目):
+>
+> - `-env` 参数目前**尚未实现**,现阶段切环境靠改 `datasource/` 下的实际文件或 `conf/env.sh`(待新建)
+> - `bin/` 下几个 DataX 启动脚本 / 生成器里还残留 `conf/datax/config/` 前缀剥离逻辑(老项目遗留;该目录已迁至 `conf/bak/` 并忽略入库),新项目 ini 放在 `jobs/raw/` / `jobs/ads/` / `manual/`,这段逻辑要清理掉
+
+---
+
+#### 4.3.2 `datax-multiple-job-starter.sh` —— 通用批量启动
+
+**用途**:批量启动多个 DataX 任务,支持串行/并行执行。DolphinScheduler 调度的主要入口。
+
+**参数**:
+
+| 参数          | 优先级    | 说明                      |
+| ------------- | --------- | ------------------------- |
+| `-c <path>`   | 1(最高) | JSON 配置文件,可多次传入 |
+| `-cd <dir>`   | 2         | JSON 配置文件目录         |
+| `-gc <path>`  | 3         | ini 配置文件,可多次传入  |
+| `-gcd <dir>`  | 4(最低) | ini 配置文件目录          |
+| `-start-date` | —         | 开始日期,默认昨天        |
+| `-stop-date`  | —         | 结束日期,默认今天        |
+| `-host`       | —         | 指定 Worker 节点          |
+| `-random`     | —         | 随机选择 Worker           |
+| `-parallel`   | —         | 并行执行(默认串行)      |
+| `-skip-datax` | —         | 跳过 DataX 执行           |
+
+**执行模式**:
+
+- **串行**(默认):逐个调用 `datax-single-job-starter.sh`,日志实时输出(`tee`),结束后汇报成功/失败计数
+- **并行**(`-parallel`):后台启动所有任务,日志写入文件,仅限 `bigdata` 用户 + 发布主机
+
+**日志路径**:`${LOG_ROOT_DIR}/datax/${src-dst}/${project_layer_env}/${START_DATE}/${START_DATE}-${JOB_NAME}.log`
+
+**示例**(目标态):
+
+```bash
+# 批量执行整个业务域下的 raw 采集 ini
+bin/datax-multiple-job-starter.sh -gcd jobs/raw/trd -start-date 20260415 -env prod -parallel
+
+# 指定多个 ini 文件串行执行
+bin/datax-multiple-job-starter.sh \
+  -gc jobs/raw/trd/raw_trd_order_pay_inc_d.ini \
+  -gc jobs/raw/usr/raw_usr_user_info_inc_d.ini \
+  -start-date 20260415 -env prod
+```
+
+---
+
+#### 4.3.3 `datax-multiple-hive-job-starter.sh` —— 带 Hive 分区自动管理的批量启动
+
+**用途**:在 `datax-multiple-job-starter.sh` 之上封装了 **Hive 分区自动管理**。任何写入 Hive 分区表的 DataX 同步作业(不限于 MySQL→Hive)都可以用它,脚本头注释里"MySQL-Hive 作业"只是历史命名。**日常采集作业的主力入口**。
+
+**与 multiple-job-starter 的区别**:
+
+1. 自动从 ini 配置中解析 Hive 表名和分区路径(`parse_ddl()` 函数,`grep "path =" <ini>`)
+2. 在执行 DataX 前自动执行 `ALTER TABLE ... ADD IF NOT EXISTS PARTITION(dt=...)` 
+3. 支持在脚本内硬编码配置列表(`partitioned_tables`、`generator_config_array` 等数组),适合固定调度场景
+4. 支持 `--override` 参数临时覆盖脚本内硬编码配置
+
+> **自动建分区只对 ini 输入生效**:`parse_ddl()` 读的是 ini 里的 `path = ...` 行。如果走 `-jc` / `-jcd` 传已生成的 JSON,脚本没有 ini 可解析,自动建分区**不触发**,此时要么改用 `-t db.table` 显式声明分区、要么把分区记录在脚本内 `partitioned_tables` 数组。
+
+**额外参数**:
+
+| 参数                                    | 说明                                               |
+| --------------------------------------- | -------------------------------------------------- |
+| `--override`                            | 忽略脚本内硬编码的配置列表,只执行命令行传入的配置 |
+| `-t <db.table>`                         | 显式指定需要建分区的 Hive 表,可多次传入           |
+| `-skip-add-partition`                   | 跳过 Hive 分区创建                                 |
+| `-jc` / `-jcd` / `-gc` / `-gcd`         | 同 multiple-job-starter                            |
+| `-start-date` / `-stop-date`            | 同上                                               |
+| `-random` / `-parallel` / `-skip-datax` | 同上                                               |
+
+**分区解析逻辑**(`parse_ddl()`):
+
+1. 读取 ini 文件中 `path =` 行
+2. 检查路径是否包含 `/dt=${dt}`(分区标识)
+3. 从 HDFS 路径中提取 `{db}.db/{table_name}` → 拼接 `ALTER TABLE {db}.{table} ADD IF NOT EXISTS PARTITION(dt={START_DATE})`
+
+**示例**(目标态):
+
+```bash
+# 执行某业务域下所有 raw 采集 ini + 自动建 Hive 分区
+bin/datax-multiple-hive-job-starter.sh \
+  -gcd jobs/raw/trd \
+  -start-date 20260415 -env prod -parallel
+
+# 覆盖脚本内硬编码配置,只跑指定的失败任务
+bin/datax-multiple-hive-job-starter.sh --override \
+  -gc jobs/raw/trd/raw_trd_order_pay_inc_d.ini \
+  -start-date 20260415 -env prod
+```
+
+---
+
+#### 4.3.4 `datax-job-config-generator.py` —— ini→JSON 配置生成器
+
+**用途**:将人类可读的 `.ini` 任务配置转换为 DataX 框架所需的 `.json` 作业配置文件。通常由 `datax-single-job-starter.sh` 自动调用,也可独立执行。
+
+**参数**:
+
+| 参数          | 说明                                     |
+| ------------- | ---------------------------------------- |
+| `-c <path>`   | ini 配置文件路径,可多次传入或逗号分隔   |
+| `-d <dir>`    | 扫描指定目录下的 ini 文件                |
+| `-r`          | 配合 `-d` 使用,递归扫描子目录           |
+| `-start-date` | 开始日期,默认昨天                       |
+| `-stop-date`  | 结束日期,默认今天                       |
+| `-o <dir>`    | 输出目录(默认 `conf/datax/generated/`) |
+
+**生成路径规则**(**当前脚本残留老逻辑,待清理**):脚本里仍保留 `temp = os.path.dirname(gcf).replace(project_root_dir, '').replace('conf/datax/config/', '').split('/')` 这段——老项目的 ini 放在 `conf/datax/config/{src-dst}/{env}/` 下,前缀剥离后能派生出 `src_dst` / `project_layer_env` 拼接输出路径。新项目 ini 已经不走这条路径(`conf/datax/config/` 整体挪到 `conf/bak/` 并 gitignore),但脚本里的 replace 语句仍在执行一次无效剥离,输出会落到 `conf/datax/generated/jobs/raw/trd/xxx.json`——能跑但路径形态不符合新约定。
+
+重构目标:去掉路径前缀剥离逻辑,输出统一扁平为 `conf/datax/generated/{env}/{目标表名}.json`。登记为硬编码待重构项,见 `90-重构路线.md` §2.1。
+
+**示例**(目标态):
+
+```bash
+# 生成单个 ini 对应的 JSON
+python3 bin/datax-job-config-generator.py -c jobs/raw/trd/raw_trd_order_pay_inc_d.ini -env prod
+
+# 批量生成某业务域下所有 ini(递归)
+python3 bin/datax-job-config-generator.py -d jobs/raw/trd -r -env prod
+
+# 指定日期和输出路径
+python3 bin/datax-job-config-generator.py -c jobs/raw/trd/raw_trd_order_pay_inc_d.ini \
+  -start-date 20260415 -stop-date 20260416 -env prod -o /tmp/datax-out
+```
+
+---
+
+#### 4.3.5 `datax-gc-generator.py` —— ini 配置元生成器
+
+此部分需要完全重构,此记录仅为重构提供思路。
+
+**用途**:连接源数据库读取表结构元数据,自动生成 DataX ini 配置文件。是开发阶段的**辅助工具**,用于批量初始化 ini 配置,生成后通常需要人工检查和调整。
+
+**通用参数**:
+
+| 参数             | 说明                                                         |
+| ---------------- | ------------------------------------------------------------ |
+| `--from <type>`  | 源系统类型(`mysql` / `hdfs`,默认 `mysql`)                 |
+| `--to <type>`    | 目标系统类型(`hdfs` / `hbase` / `kafka` / `mongo` / `elasticsearch` / `mysql`,默认 `hdfs`) |
+| `--output <dir>` | 生成的 ini 文件存储目录                                      |
+
+**MySQL 作为源(`--from mysql`)额外参数**:`-h`(主机)、`-P`(端口)、`-u`(用户)、`-p`(密码)、`-D`(数据库)、`-t`(指定表)、`-tr`(表名正则)、`-e`(排除表)、`-er`(排除表正则)、`--inc-col`(增量字段,默认 `update_time`)
+
+**HDFS 作为源(`--from hdfs`)额外参数**:`-d`(Hive 数据库)、`-t`(Hive 表)、`-e`(排除表)、`--partitioned`(是否分区表)
+
+**示例**:
+
+```bash
+# 为 MySQL 库中所有表生成 mysql→hdfs 的 ini 配置,输出到 raw/trd 业务域
+python3 bin/datax-gc-generator.py --from mysql --to hdfs \
+  -h 10.0.0.1 -u reader -p xxx -D hobby_prod \
+  --output jobs/raw/trd
+
+# 只为指定表生成,排除临时表
+python3 bin/datax-gc-generator.py --from mysql --to hdfs \
+  -h 10.0.0.1 -u reader -p xxx -D hobby_prod \
+  -tr "^order" -er "^tmp_" \
+  --output jobs/raw/trd
+
+# 为 Hive 表生成 hdfs→elasticsearch 的 ini 配置
+python3 bin/datax-gc-generator.py --from hdfs --to elasticsearch \
+  -d ads --partitioned \
+  --output conf/datax/config/hdfs-elasticsearch/prod
+```
+
+> **安全提示**:该脚本接受数据库账密作为命令行参数。生产环境中建议通过环境变量或临时文件传递敏感信息,避免密码出现在 shell history 和进程列表中。
+
+
+
+
+
+
+
+ 已查证:whoami 分流 + env.sh 外配 2026-04-21 完成(kb/92 L175);{module}/{dt}/{file}.log 统一结构
+  仍目标态(日志模块统一 kb/92 L617 待启动)

+ 2 - 1
kb/92-重构进度.md

@@ -23,7 +23,7 @@
 
 ## 阶段 0:知识库梳理 ✅
 
-- [x] 项目架构文档 `00-项目架构.md`
+- [x] 项目导览文档 `00-项目导览.md`
 - [x] 运行环境 `01-运行环境.md`
 - [x] 权限与账号 `02-权限与账号.md`
 - [x] 业务流程 `10-业务流程.md`
@@ -191,3 +191,4 @@
 | 2026-04-23 | **kb/00 章节顺序再调**:执行链详解后移到入口说明之后(理由:先有入口才有调用链),最终顺序 §1 目录结构 / §2 模块关系图 / §3 配置管理体系(§3.1 配置分类)/ §4 DataX 入口 / §5 Spark 入口(§5.1 常用参数 / §5.2 Spark 参数优先级)/ §6 执行链详解 / §7 部署架构。kb/90 + kb/30 外部引用仅指向 §1 目录树,不受影响 | — |
 | 2026-04-23 | **kb/00 §2 模块关系图并入 §5 执行链路 + 新增 §6 基础模块骨架**:`模块关系图`(静态依赖拓扑)与 `执行链详解`(动态调用)在本项目线性链式结构下几乎 1:1,合并为 §5 **执行链路**(业界更通用表述);新增 §6 **基础模块** 骨架,后续介绍 `dw_base/` 除 `spark/` / `datax/` / `udf/` 外的其他模块。子节编号随父节上移:§3.1 配置分类 → §2.1;§5.1 常用参数 → §4.1;§5.2 Spark 参数优先级 → §4.2。最终 §1 目录结构 / §2 配置管理体系 / §3 DataX 入口 / §4 Spark 入口 / §5 执行链路 / §6 基础模块 / §7 部署架构 | — |
 | 2026-04-23 | **新增 kb/93-架构决策.md 骨架(永久文档)**:作为重构收尾后 `90-重构路线.md` / `91-重构备忘.md` / `92-重构进度.md` 三份过程文档压缩留档的 ADR 沉淀点;当前仅留"说明 + 决策清单(待补充)"骨架;README §9x 过渡资料表加行 | — |
+| 2026-04-23 | **kb/00 改名项目导览 + kb/93 补 ADR 模板 + kb/91 入库**:(a) `kb/00-项目架构.md` → `kb/00-项目导览.md`(git mv),文档定位收敛为"新人 / 外部协作者入口";级联改 README(索引行 + 阅读建议 #1)、CLAUDE.md 冷启动必读、kb/02 §4 + kb/30 §6 + kb/90 §1.2 跨文档引用、kb/92 阶段 0 checklist;历史 changelog 里的 `00-项目架构.md` 字面量保留为 snapshot 不改;(b) kb/93 按业界主流(Michael Nygard)补 5 段 ADR 模板(Context / Decision / Consequences / Alternatives / Reversal Trigger);(c) `kb/91-重构备忘.md` 从 untracked 入库(保留现有 DataX 脚本使用说明内容,作为重构期间的独立备忘文件) | — |

+ 17 - 2
kb/93-架构决策.md

@@ -6,8 +6,23 @@
 
 - 本文档是**重构完成态**的沉淀:`90-重构路线.md` / `91-重构备忘.md` / `92-重构进度.md` 三份过程文档会在重构收尾时删除,关键决策、权衡、反悔条件压到这里留档。
 - 当前仍在重构中,本文档先留骨架,内容待重构收尾时填入。
-- 记录粒度:**选了什么方案 / 为什么选 / 否决了哪些替代 / 什么条件下会反悔**。操作性细节留在代码与 commit history 里,不在此复述
+- 单条 ADR 格式按业界主流(Michael Nygard 版精简):**Context / Decision / Consequences / Alternatives / Status** 五段;不套公司标准模板的多余字段
 
-## 1. 决策清单
+## 模板
+
+> 新增一条决策时,复制以下模板到 §2 列表内。编号连续,不复用已弃用编号。
+
+```markdown
+### ADR-NN 决策标题
+
+- **Status**:Accepted / Superseded by ADR-MM / Deprecated
+- **Context**:当时面对的问题、约束、触发决策的场景。
+- **Decision**:最终选了什么方案,一句话。
+- **Consequences**:带来的好处、新增的代价、影响到的模块。
+- **Alternatives**:考察过但否决的方案,以及否决理由。
+- **Reversal Trigger**:什么条件下会重新评估或反悔。
+```
+
+## 决策清单
 
 待补充