Просмотр исходного кода

docs(kb): kb/00 结构收尾 + manual/ 执行规范并入 kb/30 §6

- §1 目录树补 conf/ 与 tests/ 实际内容(env.sh / spark-defaults.conf
  / spark-tuning.conf / templates/ / bak/,unit/ / integration/)
- §7 DataX 入口 + §8 Spark 入口标题格式修复;编号去跳号重排为
  1/2/3/4/5/6/7 连续,部署架构落在新 §7
- §7 部署架构分清 whoami 分流 + env.sh 外配(已实现)与
  {module}/{dt}/{file}.log 日志统一(待日志模块重写)
- kb/30 §6 删 "详见 kb/00 §8"(§8 已并入 §6 自身)
- kb/30 §4.3 补 DataX ini dataSource = {db_type}/{env}-{实例简称}
  运行时契约(代码由 plugin.py:37 父目录判 db_type)
- kb/90 §1.2 陈旧引用 "kb/00 §5 的样板" 改指 §1 + kb/30 §4.2
- README 0x 00-项目架构 职责描述同步 + 用户侧索引微调
tianyu.chu 2 недель назад
Родитель
Сommit
c81b6b9d57
5 измененных файлов с 108 добавлено и 351 удалено
  1. 9 11
      README.md
  2. 31 338
      kb/00-项目架构.md
  3. 66 1
      kb/30-开发规范.md
  4. 1 1
      kb/90-重构路线.md
  5. 1 0
      kb/92-重构进度.md

+ 9 - 11
README.md

@@ -34,12 +34,12 @@ dw-project/
 
 数据源连接配置(含账密)存放在项目同级目录 `datasource/` 下,由运维维护,不纳入版本控制。
 
-## 主要执行入口
+## 主要执行入口(datax部分待重构)
 
 | 脚本 | 用途 | 示例 |
 |------|------|------|
 | `bin/spark-sql-starter.py` | 执行 Spark SQL | `-f jobs/customs/001india/02incr/01india_im/02dwd.sql -dt 20250101` |
-| `bin/datax-multiple-hive-job-starter.sh` | MySQL→Hive 批量采集(主力) | `-gcd conf/datax/config/mysql-hdfs/prod -start-date 20250101 -parallel` |
+| `bin/datax-multiple-hive-job-starter.sh` | Hive 批量采集(主力) | `-gcd conf/datax/config/mysql-hdfs/prod -start-date 20250101 -parallel` |
 | `bin/datax-multiple-job-starter.sh` | 通用批量 DataX 同步 | `-gcd jobs/customs/001india/02incr/01india_im/ -start-date 20250101` |
 | `bin/datax-single-job-starter.sh` | 单个 DataX 同步 | `-gc jobs/xxx/from_mongo.ini -start-date 20250101` |
 
@@ -54,7 +54,7 @@ PG/ES ──DataX(raw)──> RAW ──> ODS ──> DWD ──> DWS ──> TD
 
 - 使用 PyCharm 远程 SSH 连接服务器开发调试
 - Python 3.6.8,依赖见 `requirements.txt`
-- 部署:`publish.sh` 通过 git pull + rsync 分发到集群各节点
+- 部署:`publish.sh` 通过 git pull + rsync 分发到集群各节点(暂时不使用)
 
 ## 文档索引
 
@@ -64,7 +64,7 @@ PG/ES ──DataX(raw)──> RAW ──> ODS ──> DWD ──> DWS ──> TD
 
 | 文档 | 职责 |
 |----|----|
-| [00-项目架构](kb/00-项目架构.md) | **架构**:模块关系、数据流、DataX/Spark 脚本使用、conf 配置分层、manual/ 目录定位 |
+| [00-项目架构](kb/00-项目架构.md) | **架构**:目录结构、模块关系、执行链、配置管理、DataX / Spark 入口、部署架构 |
 | [01-运行环境](kb/01-运行环境.md) | **基础设施**:CDH 版本矩阵、集群拓扑、开发侧约束 |
 | [02-权限与账号](kb/02-权限与账号.md) | **鉴权链路**:HS2 doAs / PySpark / Ranger / LDAP;job 账号 vs 个人账号 |
 
@@ -73,15 +73,15 @@ PG/ES ──DataX(raw)──> RAW ──> ODS ──> DWD ──> DWS ──> TD
 | 文档 | 职责 |
 |----|----|
 | [10-业务流程](kb/10-业务流程.md) | **业务全景**:用户 + 商家 + 售后全链路流程 |
-| [11-数据资产](kb/11-数据资产.md) | **数据源清单**:业务库 / 埋点 / 爬虫 / 采购(同步方案见 12) |
+| [11-数据资产](kb/11-数据资产.md) | **数据源清单**:业务库 / 埋点 / 爬虫 / 采购 |
 | [12-同步方案](kb/12-同步方案.md) | **同步策略**:PG→Hive 存量 / 增量 / 历史归档 / CDC 阶段演进 |
 
 ### 2x 数仓建模
 
 | 文档 | 职责 |
 |----|----|
-| [20-数仓分层与建模](kb/20-数仓分层与建模.md) | **建模方法论**:分层定义、主题域、总线矩阵、维度五步法;存储 / raw 类型契约 |
-| [21-命名规范](kb/21-命名规范.md) | **命名规则**:Hive 表 / 字段 / 词根字典 + 建表 Checklist |
+| [20-数仓分层与建模](kb/20-数仓分层与建模.md) | **建模方法论**:分层定义、主题域、总线矩阵、维度五步法 |
+| [21-命名规范](kb/21-命名规范.md) | **命名规则**:Hive 表 / 字段 / 词根字典 + 建表 Checklist |
 | [22-指标体系](kb/22-指标体系.md) | **指标字典**:指标 / 维度 / 度量定义与口径 |
 | [23-标签体系](kb/23-标签体系.md) | **TDM 画像**:用户 / 商品 / 商家标签 |
 
@@ -89,7 +89,7 @@ PG/ES ──DataX(raw)──> RAW ──> ODS ──> DWD ──> DWS ──> TD
 
 | 文档 | 职责 |
 |----|----|
-| [30-开发规范](kb/30-开发规范.md) | **开发方法论**:TPAD、数据开发流程、代码/SQL/Git 规范、DDL/jobs 文件组织、manual/ 临时 SQL、样板 |
+| [30-开发规范](kb/30-开发规范.md) | **开发方法论**:TPAD、数据开发流程、代码/SQL/Git 规范、DDL/jobs 文件组织、manual/ 临时 SQL、样板、存储 / raw 类型契约 |
 | [31-UDF手册](kb/31-UDF手册.md) | **UDF 登记表**:通用 + 业务 UDF 清单 |
 
 ### 9x 过渡资料
@@ -105,7 +105,5 @@ PG/ES ──DataX(raw)──> RAW ──> ODS ──> DWD ──> DWS ──> TD
 1. [00-项目架构](kb/00-项目架构.md) — 了解模块全貌
 2. [01-运行环境](kb/01-运行环境.md) — 了解基础设施
 3. [20-数仓分层与建模](kb/20-数仓分层与建模.md) — 了解建模方法论
-4. [21-命名规范](kb/21-命名规范.md) — 熟悉命名规则(★ 最高频参考)
+4. [21-命名规范](kb/21-命名规范.md) — 熟悉命名规则
 5. [30-开发规范](kb/30-开发规范.md) — 熟悉开发流程
-
-**开发样板**:`conf/templates/` 下按引擎分 datax / spark 两类,详见 [30-开发规范 §7](kb/30-开发规范.md#7-开发样板)。

+ 31 - 338
kb/00-项目架构.md

@@ -3,6 +3,7 @@
 > `poyee-data-warehouse` 数据仓库工程的模块划分、执行时序与配置管理。
 
 **项目状态**:重构中,目前采用**原地渐进式重构**模式。
+
 ## 1. 目录结构(更新中)
 
 ```
@@ -24,7 +25,7 @@ poyee-data-warehouse/              # 项目根目录(仓库名 = 部署名)
 │   ├── ads/                       #   应用层计算 SQL + 导出 ini
 │   └── archive/                   #   已弃用的过期脚本归档
 ├── manual/                        # 一次性脚本(禁止接入定时调度)
-│   ├── ddl/                       #   所有 DDL(初始 CREATE + 后续 ALTER),唯一来源;按 {layer}/{domain}/ 分子目录
+│   ├── ddl/                       #   所有 DDL(初始 CREATE + 后续 ALTER)
 │   ├── backfill/                  #   历史数据回刷
 │   ├── fix/                       #   线上脏数据订正(必须带工单号)
 │   ├── adhoc/                     #   临时取数 / 排查
@@ -33,9 +34,9 @@ poyee-data-warehouse/              # 项目根目录(仓库名 = 部署名)
 ├── dw_base/                       # 通用库层
 │   ├── __init__.py                #   全局初始化(环境检测、用户/权限判断、颜色常量)
 │   ├── common/                    #   常量、容器(alerter / config / template 常量)
-│   ├── spark/                     #   SparkSQL 引擎(Session 管理、UDF 注册、SQL 执行、数据导出)
+│   ├── spark/                     #   SparkSQL 相关
 │   ├── udf/                       #   UDF 库(common 通用 + business 业务专用)
-│   ├── datax/                     #   DataX 配置生成引擎(ini→json),含 datasources/ + plugins/
+│   ├── datax/                     #   DataX 相关
 │   ├── utils/                     #   通用工具(参数解析、日期、文件、日志、SQL 解析、字符串等)
 │   ├── io/                        #   (占位)I/O 边界:db / file / hdfs 跨进程读写
 │   ├── ops/                       #   (占位)仓内数据运维(小文件合并、分区清理)
@@ -43,8 +44,16 @@ poyee-data-warehouse/              # 项目根目录(仓库名 = 部署名)
 │   ├── pm/                        #   (占位)项目管理工具集成(TAPD / Jira API)
 │   └── wiki/                      #   (占位)外部文档同步(Docmost → kb/inbox)
 ├── kb/                            # 知识库:项目文档
-├── conf/                          # 配置层(非敏感配置入库:alerter.ini / workers.ini / datax-speed.ini / spark-defaults.conf 等)
-├── tests/                         # 测试:unit/ 纯函数单测 + integration/ Spark datax 集成测试
+├── conf/                          # 配置层(非敏感配置,入库)
+│   ├── env.sh                     #   环境变量 / 路径(bash + Python 单源)
+│   ├── spark-defaults.conf        #   Spark 行为 / 开关类默认(少改)
+│   ├── spark-tuning.conf          #   Spark 资源 / 调优类默认(常改)
+│   ├── templates/                 #   开发样板,按引擎分 datax/ + spark/(见 30-开发规范.md §7)
+│   └── bak/                       #   老 conf/datax/config/ 归档(gitignore)
+├── tests/                         # 测试
+│   ├── unit/                      #   纯函数单测
+│   ├── integration/               #   Spark / DataX 集成测试
+│   └── README.md
 ├── publish.sh                     # 集群部署脚本
 ├── requirements.txt               # Python 依赖
 └── README.md
@@ -56,7 +65,7 @@ poyee-data-warehouse/              # 项目根目录(仓库名 = 部署名)
 /home/bigdata/release/
 ├── poyee-data-warehouse/          # 本项目部署目录
 └── datasource/                    # 数据源连接配置(含账密,由运维管理,不入仓库)
-    ├── postgresql/                #   文件名约定 {env}-{实例简称}.ini;env ∈ {dev,test,prod}
+    ├── postgresql/                #   文件名约定 {env}-{实例简称}.ini
     │   ├── prod-hobby.ini         #     生产 PG hobby 业务库
     │   ├── prod-hobby-ro.ini      #     同环境多实例加二次后缀(ro = 只读从库)
     │   ├── test-hobby.ini
@@ -74,248 +83,17 @@ poyee-data-warehouse/              # 项目根目录(仓库名 = 部署名)
     └── hbase/
 ```
 
-sync ini 里 `[reader]` / `[writer]` 的 `dataSource` 字段必须带 `{db_type}/` 前缀,例如 `dataSource = postgresql/prod-hobby`、`dataSource = hdfs/prod-ha`。代码按首段斜杠判 db_type(= 父目录),裸名(`hobby`)会找不到文件。前期跨环境同步常态(test 业务库 → prod HDFS),不设全局 env 概念,每个 sync ini 显式指向各自 env 的 source ini。
-
-
-
-## 3. 模块关系图
+## 2. 模块关系图
 
 待补充
 
-## 4. 执行链详解
+## 3. 执行链详解
 
 待补充
 
-### 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。
+## 4. 配置管理体系
 
-**示例**(目标态):
-```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 和进程列表中。
-
-## 6. 配置管理体系
-
-### 6.1 配置分类
+### 4.1 配置分类
 
 | 配置类型 | 存放位置 | 是否入仓库 | 维护角色 |
 |----------|---------|-----------|------|
@@ -326,7 +104,15 @@ python3 bin/datax-gc-generator.py --from hdfs --to elasticsearch \
 | 环境变量 / 路径 | `conf/env.sh`(`bin/common/init.sh` + `dw_base/utils/env_loader.py` 消费) | 是 | 开发   |
 | 告警 Webhook | `dw_base/common/alerter_constants.py` | 是(待改 `conf/alerter.ini`,入库) | 开发   |
 
-### 6.2 Spark 参数优先级(三级覆盖)
+## 5. DataX 入口使用说明(待重构后完善)
+
+## 6. Spark 入口使用说明
+
+### 6.1 常用参数
+
+待补充
+
+### 6.2 Spark 参数优先级(三级覆盖已实现)
 
 ```
 命令行 -sc key=value / SparkSQL(...) 显式传参   (L3,最高优先级,临时 override)
@@ -336,65 +122,6 @@ SQL 文件内 SET spark.x.y=z                      (L2,单作业级别,开
 conf/spark-defaults.conf + conf/spark-tuning.conf   (L1,全局默认,大数据负责人维护)
 ```
 
-**目标态由 `dw_base/spark/spark_sql.py` 启动时按 Spark 原生 `key value` 格式加载 L1,再让 Spark 本身处理 L2/L3 的覆盖**。详细改造计划见 `90-重构路线.md` §2.3。
-
-### 6.3 DataX ini 配置格式
-
-**关键约定**:
-- `dataSource` 字段只写 `{db_type}/{instance}`,**不含环境**。环境由启动脚本的 `-env` 参数注入
-- 新项目推荐规范见 §6.4;老项目里 `dataSource = pg-hobby-prod` 这种把环境拼进字符串的写法是历史遗留,重构中统一改为上述新形式
-
-**⚠️ 当前代码实现现状(2026-04-20 实测,与目标态有差距,`datax-gc-generator` 重写时一并对齐)**:
-
-1. **`dataSource` 前缀必须用数据源全名**,`dw_base/datax/plugins/plugin_factory.py:33` 按 `-` 拆取第 0 段作为 ds_type,与 `plugin_factory.py` 的类型白名单比对。白名单仅 8 个全名:`postgresql` / `mysql` / `clickhouse` / `hdfs` / `hbase` / `kafka` / `mongo` / `elasticsearch`。`pg-xxx` / `ch-xxx` / `mq-xxx` 这种简写**当前会报 `DataSource type pg ... is not supported yet`**;上面样例里写 `dataSource = pg/hobby` 是目标态,当前代码未支持(`split('-')` 逻辑 + `/` 路径推导都要跟着 §6.4 改)。
-2. **RDBMS reader 的 `columnType` 当前被完全忽略**:`PostgreSQLReader.load_column`(`postgresql_reader.py:74-76`)、`MySQLReader`、`ClickHouseReader` 都覆盖了基类 `Plugin.load_column`,只读 `column`(字段名列表),`columnType` 不解析;类型靠 JDBC 驱动的 `ResultSetMetaData` 返回。对应的 writer 同样只读 `column`。**只有 HDFS/HBase/Kafka 这类读写文件/非关系型存储的插件**走基类 `Plugin.load_column`(`plugin.py:63-118`),此时 `columnType` 才生效,且字符串字段可省略(基类默认类型是 `string`,见 `plugin.py:77`)。这一条与 kb/20 §8.1 raw 层"DataX ini 不写类型映射"的约定方向一致,但底层机制是上游代码覆盖掉了,不是约定的结果。
-
-**增量/全量区分:**
-- `dt=19700101` 或 `query={}` → 全量
-- `query` 中含 `${start_date}`/`${stop_date}` → 增量
-
-### 6.4 多环境机制与 env 注入
-
-**原则:业务代码一套,环境差异收敛在 `datasource/` 和 `conf/env.sh`,运行时注入。**
-
-**环境集合**:`dev` / `test` / `prod`(由运维在 `datasource/` 下分别维护一套实例配置)。
-
-**注入链路**:
-
-```
-启动脚本(-env prod)
-        │
-        ▼
-ini 里 dataSource = pg/hobby
-        │
-        │  脚本拼接
-        ▼
-实际路径 datasource/pg/prod/hobby.ini
-        │
-        ▼
-DataX Reader/Writer 建立连接
-```
-
-**env 判定优先级**(两级,不引入环境变量,避免污染 shell 历史和 CI 环境):
-
-| 级别 | 来源 | 用途 |
-|------|------|------|
-| L1(最高) | 命令行 `-env <name>` | 调试 / 跨环境临时切换 |
-| L2 | `conf/env.sh` 里的 `DW_ENV` 默认值 | **入仓库**的一份配置,由开发者维护。默认值通常锁死为 `dev`(服务本地调试方便)。DolphinScheduler / 生产脚本总是命令行显式挂 `-env prod` 覆盖。不做任何"按用户/目录"的自动派生 |
-
-**执行示例**:
-
-```bash
-# 跑生产环境
-bin/datax-multiple-hive-job-starter.sh -gcd jobs/raw/trd -start-date 20260415 -env prod -parallel
-
-# 本地调试(通常省略 -env,走 conf/env.sh 默认值 dev)
-bin/datax-single-job-starter.sh -gc jobs/raw/trd/raw_trd_order_pay_inc_d.ini -start-date 20260415
-
-# 跑测试环境(测试 Hive 集群 + 测试后端库 + 测试服务库都在 datasource/*/test/ 下)
-bin/datax-multiple-hive-job-starter.sh -gcd jobs/raw/trd -start-date 20260415 -env test -parallel
-```
-
 ## 7. 部署架构
 
 ```
@@ -402,43 +129,9 @@ bin/datax-multiple-hive-job-starter.sh -gcd jobs/raw/trd -start-date 20260415 -e
 部署目录:/home/bigdata/release/poyee-data-warehouse/
 部署用户:bigdata
 部署方式:git pull + rsync (publish.sh → re-all 分发)
-
-日志目录:
-  统一输出到 ${LOG_ROOT_DIR}/{module}/{dt}/{file}.log
-  (LOG_ROOT_DIR 默认 ${HOME}/log,外配在 conf/env.sh;
-   release 用户 bigdata 落 /home/bigdata/log/...,个人落各自家目录。
-   老项目 whoami 分流 /opt/data/log 与 ~/data/log 已废弃,见 90-重构路线.md §7.2.1)
 ```
 
-## 8. manual/ 目录执行规范
-
-**定位**:一次性、非幂等的 SQL 脚本;与 `jobs/` 语义完全独立,**严禁接入 DolphinScheduler 定时调度**。
-
-**子目录职责**:
-
-| 目录 | 用途 |
-|------|------|
-| `manual/ddl/` | 所有 DDL(初始 CREATE + 后续 ALTER),唯一来源;内部按 `{layer}/{domain}/` 分子目录 |
-| `manual/backfill/` | 历史数据回刷(跨日期重算) |
-| `manual/fix/` | 线上脏数据订正,**必须附工单号** |
-| `manual/adhoc/` | 临时取数、问题排查 |
-| `manual/imports/{yyyymmdd}/` | 一次性入仓任务(离线硬盘、历史 dump、外部 CSV 等),按执行日期归档 |
-| `manual/exports/{yyyymmdd}/` | 一次性出仓任务,按执行日期归档 |
-| `manual/archive/` | 执行完毕的历史脚本归档,保留审计痕迹 |
-
-**命名规则**:`{yyyymmdd}_{层}_{域}_{简述}.sql`,例如 `20260414_dwd_trd_add_refund_col.sql`
-
-**文件头强制注释**:
-```sql
--- 作者:xxx
--- 日期:2026-04-14
--- 工单:TPAD-1234
--- 目的:补录 2026-Q1 的退款维度
--- 状态:[待执行 | 已执行 2026-04-14]
-```
+**日志目录**:
 
-**执行与回收**:
-- 执行入口复用 `bin/spark-sql-starter.py`,不新增脚本
-- 仅通过 DS 一次性工作流或命令行手动触发
-- `fix/` 和 `backfill/` 类脚本上线前必须经过 1 人以上 Review
-- 执行完成后保留 3-6 个月作为审计证据,过期移入 `archive/` 或删除
+- **已实现**(2026-04-21,kb/92 A.1):`LOG_ROOT_DIR` 外配到 `conf/env.sh`(默认 `${HOME}/log`);老项目 whoami 分流(`/opt/data/log` vs `~/data/log`)已删除,统一由 `LOG_ROOT_DIR` 决定落点(release 用户 bigdata 落 `/home/bigdata/log/`,个人落各自家目录)
+- **目标态**(待日志模块重写,见 `90-重构路线.md` §7.2 / §7.2.1,kb/92 D):统一按 `${LOG_ROOT_DIR}/{module}/{dt}/{file}.log` 结构输出

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

@@ -400,6 +400,8 @@ raw 层的 `jobs/` 有两类主要任务,根据源数据形态选择:
 
 **raw 层数据类型约定**:全字段 `STRING`,类型转换与脏数据识别下推到 ods 层。契约详见 `20-数仓分层与建模.md` §8.1。
 
+**DataX ini 引用数据源约定**:sync ini 里 `[reader]` / `[writer]` 的 `dataSource` 字段必须写成 `{db_type}/{env}-{实例简称}`(例如 `postgresql/prod-hobby`、`hdfs/prod-ha`),指向项目同级目录 `datasource/{db_type}/{env}-{实例简称}.ini`。裸名(如 `hobby`)无法解析。代码按 `/` 切首段取 db_type(即父目录名),实现在 `dw_base/datax/plugins/plugin.py:37`、`plugin_factory.py:34`。跨环境同步(如 test 业务库 → prod HDFS)是常态,不设全局 env 概念,每个 sync ini 显式指向各自 env 的 source ini。
+
 **CSV 导入流程**:
 
 1. 本地 CSV 文件如果较大,先 `gzip` 压缩
@@ -468,7 +470,7 @@ jobs/ads/trd/
 
 ## 6. manual/ 临时 SQL 规范
 
-`manual/` 目录存放**一次性、非幂等**的 SQL 脚本,与 `jobs/` 的语义完全独立。详细目录约定见 `00-项目架构.md` §8,这里只列开发团队必须遵守的核心规则:
+`manual/` 目录存放**一次性、非幂等**的 SQL 脚本,与 `jobs/` 的语义完全独立。子目录树见 `00-项目架构.md` §1。开发团队核心规则:
 
 1. **严禁接入定时调度**:`manual/` 下任何脚本都不得被 DolphinScheduler 定时工作流引用;仅允许通过一次性工作流或命令行手动触发
 2. **命名必须带日期前缀**:`{yyyymmdd}_{层}_{域}_{简述}.sql`,便于按时间排序与过期归档
@@ -496,6 +498,69 @@ jobs/ads/trd/
 - 文件名用双扩展名 `*.template.{ini,sql}`,避免被 DataX / Spark SQL 引擎误拾
 - 新增样板归到对应子目录;新增引擎类时顶层并列目录
 
+## 8. manual/ 目录执行规范
+
+**定位**:一次性、非幂等的 SQL 脚本;与 `jobs/` 语义完全独立,**严禁接入 DolphinScheduler 定时调度**。
+
+**子目录职责**:
+
+| 目录                         | 用途                                                         |
+| ---------------------------- | ------------------------------------------------------------ |
+| `manual/ddl/`                | 所有 DDL(初始 CREATE + 后续 ALTER),唯一来源;内部按 `{layer}/{domain}/` 分子目录 |
+| `manual/backfill/`           | 历史数据回刷(跨日期重算)                                   |
+| `manual/fix/`                | 线上脏数据订正,**必须附工单号**                             |
+| `manual/adhoc/`              | 临时取数、问题排查                                           |
+| `manual/imports/{yyyymmdd}/` | 一次性入仓任务(离线硬盘、历史 dump、外部 CSV 等),按执行日期归档 |
+| `manual/exports/{yyyymmdd}/` | 一次性出仓任务,按执行日期归档                               |
+| `manual/archive/`            | 执行完毕的历史脚本归档,保留审计痕迹                         |
+
+**命名规则**:`{yyyymmdd}_{层}_{域}_{简述}.sql`,例如 `20260414_dwd_trd_add_refund_col.sql`
+
+**文件头强制注释**:
+
+```sql
+-- 作者:xxx
+-- 日期:2026-04-14
+-- 工单:TPAD-1234
+-- 目的:补录 2026-Q1 的退款维度
+-- 状态:[待执行 | 已执行 2026-04-14]
+```
+
+dataxini
+
+sync ini 里 `[reader]` / `[writer]` 的 `dataSource` 字段必须带 `{db_type}/` 前缀,例如 `dataSource = postgresql/prod-hobby`、`dataSource = hdfs/prod-ha`。代码按首段斜杠判 db_type(= 父目录),裸名(`hobby`)会找不到文件。
+
+
+
+
+
+-- 作者:xxx
+-- 日期:2026-04-14
+-- 工单:TPAD-1234
+-- 目的:补录 2026-Q1 的退款维度
+-- 状态:[待执行 | 已执行 2026-04-14]
+
+
+
+
+
+**执行与回收**:
+
+- 执行入口复用 `bin/spark-sql-starter.py`,不新增脚本
+- 仅通过 DS 一次性工作流或命令行手动触发
+- `fix/` 和 `backfill/` 类脚本上线前必须经过 1 人以上 Review
+
+
+
+### 6.3 DataX ini 配置格式
+
+1. **RDBMS reader 的 `columnType` 当前被完全忽略**:`PostgreSQLReader.load_column`(`postgresql_reader.py:74-76`)、`MySQLReader`、`ClickHouseReader` 都覆盖了基类 `Plugin.load_column`,只读 `column`(字段名列表),`columnType` 不解析;类型靠 JDBC 驱动的 `ResultSetMetaData` 返回。对应的 writer 同样只读 `column`。**只有 HDFS/HBase/Kafka 这类读写文件/非关系型存储的插件**走基类 `Plugin.load_column`(`plugin.py:63-118`),此时 `columnType` 才生效,且字符串字段可省略(基类默认类型是 `string`,见 `plugin.py:77`)。这一条与 kb/20 §8.1 raw 层"DataX ini 不写类型映射"的约定方向一致,但底层机制是上游代码覆盖掉了,不是约定的结果。
+
+**增量/全量区分:**
+
+- `dt=19700101` 或 `query={}` → 全量
+- `query` 中含 `${start_date}`/`${stop_date}` → 增量
+
 ## 8. 相关文档
 
 - [命名规范](21-命名规范.md)

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

@@ -94,7 +94,7 @@ D 基础设施 ─────┘
 
 **重要澄清**:老项目 `launch-pad/` 中的业务代码**与新项目业务完全无关**(属于上个项目的历史业务),**不存在内容迁移**。`launch-pad/` 在重构期间作为**样板 SQL 代码的参考**(看写法、看 `${dt}` 用法、看 DataX ini 结构),新项目所有业务 SQL 从零开发完成后,`launch-pad/` 整体删除。
 
-**新 `jobs/` 目录**按数仓分层 × 业务域二维组织,结构见 `00-项目架构.md` §5 的样板。业务域代码统一使用命名规范定义的 `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/...`

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

@@ -186,3 +186,4 @@
 | 2026-04-22 | **kb/21 §3.9 DataX ini 命名移出**:kb/21 主题收敛到 Hive 表/字段/词根命名,§3.9 "DataX ini 文件命名"(命名模板表 + 导出类双下划线规则 + 通用约定 + 样板指引 + 老命名反思)整节删除,§8 速查表同删 3 行 DataX ini;DataX ini 命名示例已在 kb/00 §1 目录树 + §9.5 文件命名速查中体现,不再单独成节。连带清理 7 处跨文档 §3.9 引用:kb/00(L143 示例标题 + L582 §9.5 jobs/ads 行)、kb/30(§3.4.7 docs commit 示例改指 §3.4)、kb/90(§2.1 硬编码表 3 行 + §2.5 目标态段)。kb/21 §5.1 顺手清理一条残留垃圾字符 `buyc1` | — |
 | 2026-04-22 | **kb/00 §9 样板 job 结构迁入 kb/30 §4**:kb/00 主题收敛到架构(模块/数据流/配置),§9 "DDL/jobs 组织 + migration 模式 + 命名速查" 属数仓开发方法论,整节(§9.1–§9.6)迁入 kb/30 新增的 §4 数仓开发文件组织;kb/30 原 §4/§5/§6/§7 顺序后移为 §5/§6/§7/§8,§6 manual/ 临时 SQL 规范里 "详见 `00-项目架构.md` §9.6" 改指本文 §4.6(就近内引)。外部引用更新:kb/90 §八 csv-to-hdfs 行"参见"列改指 kb/30 §4.3;kb/92 阶段 1 csv-to-hdfs checklist 里 "§9.3 模板" 改指 kb/30 §4.3。历史 changelog 里带 "§9.x" 的条目保留不改(历史 snapshot) | — |
 | 2026-04-22 | **README 文档索引加入 SSOT 职责边界**:索引段起首加一行 SSOT 原则(每篇文档是其主题的唯一权威,跨文档用 `§` 锚点互引不复述);5 张分组表 "内容" 列改为 "职责",每行重写为加粗前缀(**架构** / **基础设施** / **鉴权链路** / **建模方法论** / **命名规则** / **开发方法论** 等)+ 边界简述。顺带修两处:02-权限与账号行原来缺尾 `|` 表格闭合;末尾开发样板链接 `§6` 改 `§7`(对齐上一条 kb/30 §4 插入后的重编号) | — |
+| 2026-04-22 | **kb/00 结构收尾**:用户侧删除 §4.3 DataX 脚本说明 / §6.3 DataX ini 格式 / §6.4 env 注入 / §8 manual/ 执行规范四大块,保留 §1 目录树 + §3/§4 待补充骨架 + §6 配置分类 + Spark 参数优先级。AI 侧:(a) §1 目录树补 `conf/` 与 `tests/` 实际文件(env.sh / spark-defaults.conf / spark-tuning.conf / templates/ / bak/;unit/ / integration/);(b) §7 DataX 入口 + §8 Spark 入口半成品标题格式修复(`7 。` → `## 7.`、`8 .` / `8.1` 补 heading level);(c) 编号去跳号重排:1/3/4/6/7/8 + 重复的 7 → 1/2/3/4/5/6/7 连续,§7 部署架构规避冲突后落在新 §7;(d) §7 部署架构说明改写,分清已实现(whoami 分流删除 + LOG_ROOT_DIR 外配,2026-04-21 A.1)与目标态(`{module}/{dt}/{file}.log` 日志统一,待日志模块重写 kb/90 §7.2 / §7.2.1)。联动:kb/30 §6 删 "详见 kb/00 §8"(§8 已删);kb/30 §4.3 raw 层下补 DataX ini `dataSource = {db_type}/{env}-{实例简称}` 运行时契约(代码由 `plugin.py:37` 父目录判 db_type)—— kb/00 删掉的接口约定移到 kb/30 归属;kb/90 §1.2 L97 陈旧引用 `kb/00 §5 的样板` 改指 kb/00 §1 + kb/30 §4.2;README 0x 表 00-项目架构 行职责描述同步为"目录结构、模块关系、执行链、配置管理、DataX / Spark 入口、部署架构" | — |