Explorar o código

docs(kb): 21 §3.9 DataX ini 命名移出 Hive 命名规范文档

kb/21 主题收敛到 Hive 表/字段/词根命名,DataX ini 命名前任污染删除;
kb/00/30/90 内 7 处 §3.9 引用同步清理;kb/21 §5.1 顺手清一条残留字符。
tianyu.chu hai 2 semanas
pai
achega
d775d6e7e1
Modificáronse 5 ficheiros con 8 adicións e 40 borrados
  1. 2 2
      kb/00-项目架构.md
  2. 0 33
      kb/21-命名规范.md
  3. 1 1
      kb/30-开发规范.md
  4. 4 4
      kb/90-重构路线.md
  5. 1 0
      kb/92-重构进度.md

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

@@ -140,7 +140,7 @@ python datax.py generated.json       (DataX 框架执行数据同步)
 
 **HDFS 数据检查**(`check_data_exists()`):当 JSON 配置路径包含 `hdfs-` 时,会自动检查 HDFS reader 路径是否存在且有数据,无数据则跳过执行。
 
-**示例**(目标态,用 `-env` 切环境;命名见 `21-命名规范.md` §3.9)
+**示例**:
 ```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
@@ -579,7 +579,7 @@ jobs/ads/trd/
 | `manual/ddl/tmp/{目标表名}/` | `.sql` | `tmp_{目标表名}_{NN}_create.sql` | 多步表的单目标加速中间表 DDL |
 | `jobs/raw/{domain}/` | `.ini`(DataX)或 `.sql`(CSV 导入) | `{目标表名}.ini` 或 `{目标表名}.sql` | DataX 采集或 CSV 导入任务定义 |
 | `jobs/{ods\|dwd\|dws\|tdm}/{domain}/` | `.sql` | **简单表**:`{目标表名}.sql`;**多步表**:子目录 `{目标表名}/{目标表名}-{NN}-{描述}.sql`(`99` 为最终 insert) | 每日 `INSERT OVERWRITE` 计算,详见 §9.2 |
-| `jobs/ads/{domain}/` | `.sql` + `.ini` | **简单表**:`{ads 表名}.sql` + `{ads 表名}__{db_type}_{instance}.ini`;**多步**:`{ads 表名}/{ads 表名}-{NN}-{描述}.sql` + 同级目录放 ini | 产出 + 导出;同一张 ads 表扇出多下游时各一份 ini(见 `21-命名规范.md` §3.9) |
+| `jobs/ads/{domain}/` | `.sql` + `.ini` | **简单表**:`{ads 表名}.sql` + `{ads 表名}__{db_type}_{instance}.ini`;**多步**:`{ads 表名}/{ads 表名}-{NN}-{描述}.sql` + 同级目录放 ini | 产出 + 导出;同一张 ads 表扇出多下游时各一份 ini |
 | `manual/backfill/` | `.sql` | `{yyyymmdd}_{表名}_history.sql` | 一次性历史回刷脚本 |
 | `manual/imports/{yyyymmdd}/` | `.ini` / `.sql` | `{任务描述}.ini` 或 `.sql` | 一次性入仓任务(离线硬盘、历史 dump、外部 CSV 等),按执行日期归档 |
 | `manual/exports/{yyyymmdd}/` | `.ini` | `{任务描述}.ini` | 一次性出仓任务,按执行日期归档 |

+ 0 - 33
kb/21-命名规范.md

@@ -247,35 +247,6 @@ ads 是面向具体应用场景的输出表(报表、接口、导出),表
 | `tmp` | 临时表 | ETL 中间结果 |
 | `test` | 测试表 | 开发测试用 |
 
-### 3.9 DataX ini 文件命名
-
-按**数据流向**分三类,各自命名规则不同;ini 文件名全局唯一,等于生成的 JSON 文件名(去扩展名)和 JOB_NAME。
-
-| 场景 | 方向 | 命名模板 | 存放位置 | 示例 |
-|------|------|---------|---------|------|
-| 采集 | 外部源 → Hive | `{目标 Hive 表名}.ini` | `jobs/raw/{域}/` | `raw_trd_order_pay_inc_d.ini` |
-| **导出** | **Hive → 外部服务** | `{源 Hive 表名}__{目标 db_type}_{目标 instance}.ini` | `jobs/ads/{域}/` | `ads_trd_gmv_d__mysql_bi.ini`、`ads_trd_gmv_d__pg_api.ini` |
-| 一次性 | 任意 | `{yyyymmdd}_{描述}.ini` | `manual/{子类}/` | `20260415_backfill_hobby_orders.ini` |
-
-**导出类双下划线规则:**
-
-- **`__`(双下划线)是"导出"的视觉标志**,和五段式表名内部的单下划线分层,一眼能识别"这是 Hive 往外写"
-- 前段 = 源 Hive 表名(五段式),后段 = `{目标 db_type}_{目标 instance}`,直接对应 writer 里的 `dataSource = {db_type}/{instance}`,写 ini 时不用二次翻译
-- 同一张 Hive 表扇出多个下游时(如 `ads_trd_gmv_d` 同时导出到 MySQL BI 库和 PG API 库)**不撞名**;撞名的唯一可能是同源表 + 同目标实例,那本来就是同一个任务
-
-**通用约定:**
-
-- **sync ini 文件名不加 env 前缀**:前期跨环境同步是常态(test 业务库 → prod HDFS),不存在"全局 env"概念,sync ini 由其 `[reader]` / `[writer]` 分别显式指向各自 env 的 source ini
-- ini 内 reader/writer 的 `dataSource` 字段写 `{db_type}/{env}-{实例简称}`,例如 `dataSource = postgresql/prod-hobby`、`dataSource = hdfs/prod-ha`;source ini 落位与引用规则见 `00-项目架构.md` §1
-- DataX 生成引擎(`dw_base/datax/job_config_generator.py`)对文件名**不做校验**,上述命名规则是开发者写作约定,靠 code review 保证
-- 命名唯一性保证 JSON 输出目录 `conf/datax-json/{ini_basename}.json` 不会互相覆盖
-
-**参考样板**:`conf/templates/datax/{raw,ads,manual}/*.template.ini` 提供各类同步场景的字段齐全样本,新开发者写新 ini 时抄这里。
-
-**为什么不按老项目的 `{from}-{to}-{db}-{table}.ini` 命名**:
-- 同步方向已经在 ini 的 `[reader]` / `[writer]` section 的 `dataSource` 里体现,文件名再写一遍是冗余
-- 目标/源表名命名能与 `manual/ddl/{layer}/{domain}/{表名}_create.sql` 和 `jobs/{layer}/{domain}/{表名}.sql`(或多步表子目录 `{表名}/{表名}-{NN}-{描述}.sql`)一一对应,便于 `grep` 追一张表的完整生命周期
-
 ---
 
 ## 4. 字段命名规则
@@ -302,7 +273,6 @@ ads 是面向具体应用场景的输出表(报表、接口、导出),表
 > - **标准缩写**:数仓 dwd 及以上层使用的字段名词根
 > - **类型**:实体 / 动作 / 属性 / 金额 / 状态 / 指标 / 枚举值
 
-buyc1
 ### 5.2 数仓技术术语
 
 | 词根 | 含义 |
@@ -422,9 +392,6 @@ STORED AS ORC;
 | dws | `dws_{域}_{实体}_{主题}_{窗口}` | 聚合维度+主题 | 时间窗口后缀 |
 | tdm | `tdm_{域}_{tag\|profile\|crowd_*}_ful_d` | 表类型(长表/宽表/人群包) | `ful_d` |
 | ads | `ads_{域}_{用途描述}` | 应用场景 | 无 |
-| DataX ini 采集 | `{目标 Hive 表名}.ini`(见 §3.9) | 五段式表名 | `.ini` |
-| DataX ini 导出 | `{源 Hive 表名}__{目标 db_type}_{目标 instance}.ini`(见 §3.9) | 双下划线分隔源/目标 | `.ini` |
-| DataX ini 一次性 | `{yyyymmdd}_{描述}.ini`(见 §3.9) | 日期前缀避撞 | `.ini` |
 
 ## 9. 合规 Checklist(建表前自检)
 

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

@@ -279,7 +279,7 @@ flowchart LR
 |------|------|------|
 | `feat` | 新功能 / 新 job / 新表 | `feat(raw/crm): 新增 ods_crm_ent_contact_di` |
 | `fix` | Bug 修复 / 数据订正 | `fix(dwd/trd): 修复订单金额币种换算错误` |
-| `docs` | 只改文档(含 `kb/`、注释、README) | `docs(kb): 更新 21-命名规范.md §3.9 示例` |
+| `docs` | 只改文档(含 `kb/`、注释、README) | `docs(kb): 更新 21-命名规范.md §3.4 示例` |
 | `refactor` | 不改变外部行为的重构 | `refactor(dw_base): tendata → dw_base 模块改名` |
 | `perf` | 性能优化 | `perf(dws): 拆 tmp 表减少 shuffle` |
 | `test` | 只增/改测试 | `test(udf): 补 safe_cast_decimal 边界用例` |

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

@@ -112,11 +112,11 @@ D 基础设施 ─────┘
 | `HADOOP_CONF_DIR='/etc/hadoop/conf'` | `__init__.py` | 使用系统环境变量 |
 | 告警 Webhook(钉钉 / 企微 Key) | `dw_base/common/alerter_constants.py`(老告警模块已于 2026-04-20 删除,含 `dingtalk_notifier.py` / `ent_interface_dingtalk*` / `bin/dingtalk-work-alert.sh`) | 新告警模块重写时 Webhook Key 外移到 `conf/alerter.ini`(**入库**——部署靠 git pull,gitignore 会拉不到;webhook key 不算高敏感,最多被拿去发垃圾消息),Python 侧改 ConfigParser 加载;`alerter_constants.py` 整个删除;新项目不再使用钉钉 |
 | Spark 默认参数(executor/driver/shuffle/sql.*) | `dw_base/spark/spark_sql.py` 构造函数 + `.config(...)` 链 | 移入 `conf/spark-defaults.conf`,SQL 文件可用 `SET` 覆盖,见 §2.3 |
-| DataX ini 路径前缀剥离 `conf/datax/config/` | `bin/datax-single-job-starter.sh`(TEMP 处理)、`bin/datax-job-config-generator.py`(`replace('conf/datax/config/', '')`)、`bin/datax-multiple-job-starter.sh`(日志路径派生) | 原目录已整体挪到 `conf/bak/` 并 gitignore,脚本里 replace 现在是 no-op 死逻辑。去除前缀假设,改为靠 ini 文件名(= 任务唯一标识,见 `21-命名规范.md` §3.9)识别用途 |
-| DataX 生成 JSON 输出目录名 `conf/datax/generated` | `bin/datax-job-config-generator.py` 末尾 `default_output_dir`、`bin/datax-single-job-starter.sh` 第 89/118 行、`bin/datax-multiple-job-starter.sh` 第 187 行、`.gitignore` | 目录改名 `conf/datax-json/`;子路径扁平化为 `conf/datax-json/{ini_basename}.json`(去掉 src_dst / project_layer_env 等派生层级;`ini_basename` 由 `21-命名规范.md` §3.9 保证全局唯一);`.gitignore` 同步改 |
+| DataX ini 路径前缀剥离 `conf/datax/config/` | `bin/datax-single-job-starter.sh`(TEMP 处理)、`bin/datax-job-config-generator.py`(`replace('conf/datax/config/', '')`)、`bin/datax-multiple-job-starter.sh`(日志路径派生) | 原目录已整体挪到 `conf/bak/` 并 gitignore,脚本里 replace 现在是 no-op 死逻辑。去除前缀假设,改为靠 ini 文件名(= 任务唯一标识)识别用途 |
+| DataX 生成 JSON 输出目录名 `conf/datax/generated` | `bin/datax-job-config-generator.py` 末尾 `default_output_dir`、`bin/datax-single-job-starter.sh` 第 89/118 行、`bin/datax-multiple-job-starter.sh` 第 187 行、`.gitignore` | 目录改名 `conf/datax-json/`;子路径扁平化为 `conf/datax-json/{ini_basename}.json`(去掉 src_dst / project_layer_env 等派生层级,依赖 ini 文件名全局唯一);`.gitignore` 同步改 |
 | JOB_NAME / JSON 文件名的 `ini→json` 转换逻辑重复实现 | Python 侧 `bin/datax-job-config-generator.py:126`(`os.path.basename(gcf).replace('.ini', '.json')`)+ Bash 侧 `bin/datax-single-job-starter.sh:88`(`basename .ini`) | 合一到 `dw_base.datax.path_utils.job_name_from_ini()`(或类似工具);Bash 侧通过 `python3 -c` 调用或在 `bin/common/init.sh` 定义等价 shell 函数,单一来源 |
 | ini 里 `dataSource` 字段拼接环境后缀 | 老项目写法 `dataSource = pg-hobby-prod` | 改为 `dataSource = {db_type}/{env}-{实例简称}`,代码按首段斜杠判 db_type(即父目录名);source ini 落位 `datasource/{db_type}/{env}-{实例简称}.ini`,无 env 子目录。已于 2026-04-22 落地(`dw_base/datax/plugins/plugin.py:37`、`plugin_factory.py:34`) ✅ |
-| 导出类 ini 扇出撞名风险 | `jobs/ads/{域}/` 下 ini 若都以源 Hive 表名命名,同一张 ads 表扇出到多个目标库时会重名覆盖 | 命名规则改为 `{源 Hive 表名}__{目标 db_type}_{目标 instance}.ini`(双下划线分隔源/目标),见 `21-命名规范.md` §3.9 |
+| 导出类 ini 扇出撞名风险 | `jobs/ads/{域}/` 下 ini 若都以源 Hive 表名命名,同一张 ads 表扇出到多个目标库时会重名覆盖 | 命名规则改为 `{源 Hive 表名}__{目标 db_type}_{目标 instance}.ini`(双下划线分隔源/目标) |
 | `dw_base/common/template_constants.py` 大量死代码 | 定义了 20+ 个 SQL 模板路径常量,实际只有 2 个(`MYSQL_HIVE_CREATE_TABLE_TEMPLATE` / `MYSQL_HIVE_HBASE_CREATE_TABLE_TEMPLATE`)被引用,其余 18 个零 import | 整个文件删除;连带废弃下一条 |
 | `MySQLReader.generate_hive_ddl()` / `generate_hive_over_hbase_ddl()` 自动建表 DDL 路径 | `dw_base/datax/plugins/reader/mysql_reader.py:195/222`,被 `bin/datax-gc-generator.py:616/728` 调用;且 `conf/template/` 目录在新项目根本不存在,真调用会 FileNotFoundError | 整段路径废弃——与 CLAUDE.md 约定的 `manual/ddl/` 是 DDL 唯一来源相冲突。`datax-gc-generator.py` 仅生成 ini 配置,不再输出 CREATE TABLE DDL;DDL 由开发者按 `21-命名规范.md` 手写到 `manual/ddl/` |
 | 缺少集中的开发者参考模板目录 | —(新增) | 已建 `conf/templates/{datasource,datax/{raw,ads,manual},sql,ddl}/`,模板用 `*.template.{ini,sql}` 双扩展名。与上条废弃的运行时模板完全不同:这里的模板不被任何代码读取,只供开发者对照写新文件;项目根 `README.md` 已加入口 |
@@ -159,7 +159,7 @@ L3   SparkSQL(...) 显式传参  +  extra_spark_config  +  命令行 -sc
 
 **现状**:`bin/datax-single-job-starter.sh` 和 `bin/datax-job-config-generator.py` 仍通过剥离 `conf/datax/config/` 前缀从源 ini 路径里派生 `SRC_DST` / `PROJECT_LAYER_ENV`,用于生成 JSON 输出路径和 `datax-multiple-job-starter.sh` 的日志目录。该目录已整体挪到 `conf/bak/` 并 gitignore,新项目 ini 放在 `jobs/raw/{domain}/` / `jobs/ads/{domain}/` / `manual/`,前缀不匹配时剥离变成 no-op,输出会落到形如 `conf/datax/generated/jobs/raw/trd/xxx.json` 的位置——能跑但与新约定不符。
 
-**目标态**:清理死路径派生逻辑,JSON 输出扁平化为 `conf/datax-json/{ini_basename}.json`(基名由 `21-命名规范.md` §3.9 保证全局唯一),日志目录简化为 `${LOG_ROOT_DIR}/datax/${START_DATE}/${JOB_NAME}.log`。
+**目标态**:清理死路径派生逻辑,JSON 输出扁平化为 `conf/datax-json/{ini_basename}.json`(依赖 ini 文件名全局唯一),日志目录简化为 `${LOG_ROOT_DIR}/datax/${START_DATE}/${JOB_NAME}.log`。
 
 **已作废的子项**(2026-04-22 方向反转):`-env` 参数 + datasource 按 env 分子目录 + 一套代码跑多环境。前期跨环境同步是常态(test 业务库 → prod HDFS),不存在"全局 env"概念,sync ini 里 `dataSource = {db_type}/{env}-{实例简称}` 显式指向具体 source ini;source ini 落位 `datasource/{db_type}/{env}-{实例简称}.ini`,扁平组织。代码侧 db_type 判定改按首段斜杠(= 父目录)在 `plugin.py:37` + `plugin_factory.py:34` 落地(✅ 2026-04-22)。
 

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

@@ -182,3 +182,4 @@
 | 2026-04-22 | **仓库改名 `tendata-warehouse-release` → `poyee-data-warehouse` 收尾**:项目根目录由用户手动改名完成;代码侧 `dw_base/utils/file_utils.py:9` + `dw_base/utils/hdfs_merge_small_file.py:7` 两处 `re.sub(r"tendata-warehouse.*", ...)` 字面量同步更新。`.idea/*.iml` / `modules.xml` / `workspace.xml` 因 `.idea` + `*.iml` 在 `.gitignore`,属本地 IDE 状态,不入库亦不影响运行(老 `tendata-warehouse-release.iml` + modules.xml / workspace.xml 里的 module name 残留不处理)。联动 kb/90 §1.1 L88 表格行打勾 + §2.3 末尾"与仓库改名的联动"段压缩为一行记录 | — |
 | 2026-04-21 | **聚簇 A.4 Spark 参数外配 + `spark_sql.py` 三级覆盖**:按业务调整频率拆两文件入库 —— `conf/spark-defaults.conf`(12 条底层行为/开关类,初始化后少改:`spark.sql.adaptive/broadcastTimeout/codegen/arrow*/files/statistics.*` + `spark.dynamicAllocation.enabled` + `spark.files.ignoreCorruptFiles` + `spark.debug.maxToStringFields` + `spark.port.maxRetries` + `hive.exec.orc.default.block.size`)+ `conf/spark-tuning.conf`(10 条资源/并行度/队列,业务早期常改:`spark.{driver,executor}.{memory,cores}` + `spark.executor.instances` + `spark.executor.memoryOverhead` + `spark.driver.maxResultSize` + `spark.default.parallelism` + `spark.sql.shuffle.partitions` + `spark.yarn.queue`)。`dw_base/spark/spark_sql.py` 改造:(a) 模块级新增 `_load_spark_conf_file(path)`,读 Spark 原生 `key value` 格式,支持 `#` 注释与空行,文件缺失返回 `{}` 容错单测;(b) `__init__` 10 个 tuning 相关构造参数默认值 `'2g' / 200 / ...` → `Optional[...] = None` sentinel,不破坏既有调用点显式传参;(c) `__init_spark_session` 原 22 条硬编码 `.config(...)` 链替换为三段:L1 先 `spark-defaults.conf` 后 `spark-tuning.conf`(相同 key tuning 覆盖 defaults)→ L2 `self._final_spark_config`(SQL 内 SET)→ L3 构造参数非 None 项 + `extra_spark_config`(L3 内 extra 覆盖 named),保持原"extra > SQL SET > named" 的向后兼容;日志分层打 `L1/L2/L3` 前缀便于排查。联动:`kb/90 §2.2` conf 结构加 `spark-tuning.conf` + `§2.3` 改写为两文件模型(去单文件草案)+ 删"坑 2"(B1 → A2 依赖边)+ 聚簇 L59 依赖边删 | — |
 | 2026-04-22 | **datasource 扁平化 + db_type 按父目录段判定(方向反转)**:反转 2026-04-15 起立项的"一套代码跑多环境"设计(kb/90 原 §2.5:`-env` 参数 + `datasource/{db_type}/{env}/{instance}.ini` 分层 + env 注入)。实际前期跨环境同步是常态(test 业务库 → prod HDFS),"全局 env"概念不成立。新方案:(a) source ini 落位 `datasource/{db_type}/{env}-{实例简称}.ini`,env 写进文件名(env ∈ dev/test/prod),扁平组织;(b) sync ini 内 `dataSource = {db_type}/{env}-{实例简称}`(强制带 db_type 前缀;旧裸名 `hdfs-ha` 不再支持);(c) 代码侧 `dw_base/datax/plugins/plugin.py:37` + `plugin_factory.py:34` 的 db_type 提取从"文件名按 `-` 切首词"改为"按 `/` 切首段"(父目录名)—— 旧算法在新文件名出现 `-` 时会把 `env` 误判为 db_type,必须改。联动:kb/00 §1 目录树重绘(去 env 子目录,加样例 `prod-hobby.ini` / `test-hobby.ini` / `prod-ha.ini` 等 + sync ini 引用形式说明段)+ §6.1 配置分类表落位描述、kb/02 §4 同步、kb/21 §3.9 过时 3 行修正(废 `-env` 注入表述;引用形式 `{db_type}/{env}-{实例简称}`;JSON 输出路径去 `{env}/` 层)、kb/90 §2.1 硬编码表合并 3 行为 1 行 + §2.5 大幅压缩(三阶段设计整段删,保留路径解耦部分)+ §2.8 末尾表行更新 + §八 状态表合并、kb/92 L90 checklist 落位改扁平。conf/templates/datasource/\*.template.ini × 3 头注释补"落位"+"dataSource 引用"两行。`bin/datax-job-config-generator.py` L5/L114/L115 的路径注释讲的是另一个 `conf/datax/config/` 作业分组层级,与本次 datasource 扁平化无关,不动;`dw_base/datax/plugins/reader/mysql_reader.py:178` `{group}/mysql-{database}` 生成逻辑是非活跃代码(批量采集未启动),留到 §2.7 重构时对齐 | — |
+| 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` | — |