Prechádzať zdrojové kódy

docs(kb): 93 新增 ADR-01/02 草案 + 90 §2.6 联动

ADR-01 按天补数归 DS、DataX 入口不展开日期
ADR-02 分布式归 DS worker group、DataX 不重复随机
90 §2.6 低优先级后延 ADR 两条分别指向 ADR-01/02 草案

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
tianyu.chu 1 týždeň pred
rodič
commit
7c6a0a235d
3 zmenil súbory, kde vykonal 24 pridanie a 2 odobranie
  1. 2 1
      kb/90-重构路线.md
  2. 1 0
      kb/92-重构进度.md
  3. 21 1
      kb/93-架构决策.md

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

@@ -202,7 +202,8 @@ L3   SparkSQL(...) 显式传参  +  extra_spark_config  +  命令行 -sc
 
 **低优先级**(有明确批量回刷场景再做):
 
-- 日期范围自动按日展开 + N 个 json 分发多 worker(`-start-date 20260401 -stop-date 20260410` → 自动切 10 份 json,每份独立选 worker)
+- 日期范围自动按日展开 + N 个 json 分发多 worker(`-start-date 20260401 -stop-date 20260410` → 自动切 10 份 json,每份独立选 worker)——**可能不做**,按天补数职责归 DolphinScheduler 更合理(见 `kb/93 ADR-01` 草案)
+- **DataX 仅本机执行**(砍 ssh 远端分发 + `workers.ini` + `select_worker`):分布式分发由 DolphinScheduler worker group 承担,DataX 不重复随机(见 `kb/93 ADR-02` 草案)
 - **`plugin_factory` 解耦**:当前工厂模块顶层 eager import 所有 reader/writer(mysql/pg/mongo/hdfs/es/kafka/hbase/ch/...),任一 plugin 的 top-level import 破损就连累整个 DataX 链路(2026-04-23 已踩:`dw_base/database/` 删除后 `mysql_reader` 的 `MySQLColumn` import 挂,挂一扯一串)。改造方向二选一:(a) lazy import:`importlib.import_module(f"dw_base.datax.plugins.reader.{db_type}_reader")` 按需加载;(b) registry pattern:每个 reader 用 `@register("postgresql")` 装饰器自注册,工厂解耦于具体 plugin 列表
 - ✅ 2026-04-23 **ini 配置化脱敏** 已落地 `dw_base/datax/mask.py`(PG 5 种脱敏),详见高优先级"DataX 字段级脱敏"条
 

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

@@ -195,3 +195,4 @@
 | 2026-04-23 | **kb/90 §2.6 两入口收口按老入口平迁收敛 + 新增 §九 待讨论议题**:(a) §2.6 命名锁定 `datax-hive-import-starter.sh` / `datax-hdfs-export-starter.sh`(对齐 `-starter` 风格);参数表删 6 项新设计(`-dt` / `-skip-exist` / `-force-overwrite` / `-skip-partitions` / `-src-check` / `-env`),改为老参数平迁集,其中 `-env` 本轮不做且未来不规划(datasource 已扁平化);`-c` / `-cd` / `-jc` / `-jcd` + `--override` + 5 个 `xxx_array=()` 不平迁(后两者在老脚本从未激活使用,2026-04-23 查证);实现建议改为 6 个新模块落 `dw_base/datax/` 包内(放宽 B2 前置)、老脚本冒烟 2 通过后整体删不留转发封装;后延 ADR 锚点 1 项(日期范围展开);(b) 新增 §九 待讨论议题锚点,先登记"分布式任务分发"(DS worker × 新入口内部实现)一项 | — |
 | 2026-04-23 | **聚簇 A.2 `conf/workers.ini` 外配 + 新集群 hostname 适配**:`bin/common/init.sh` 原硬编码 `RELEASE_HOST="m3"` + `DATAX_WORKERS=(m3 d1 d2 d3 d4)` + `DATAX_WORKERS_WEIGHTS` map + 队列展开 for 循环(L13-28),整体外移到 `conf/workers.ini`(`[release] host` + `[weights]` 两 section,ini 格式入库);init.sh 改为纯 bash 读 ini(case + BASH_REMATCH 正则,不调 Python,避免 bash/py 双源漂移)。新集群 hostname 从老短名 m3/d1-d4 换到真实短名 cdhmaster02 / cdhnode01-03(用户 2026-04-23 提供),权重从 1/2/2/3/3 改为 1/3/3/3(master 1、3 个 worker 均权 3)。联动 kb/90 §2.1 行标 ✅ + §八 A 聚簇状态表行标 ✅ | — |
 | 2026-04-23 | **DataX 字段级脱敏配置化落地(插入本轮 scope 完成)**:新建 `dw_base/datax/mask.py` —— PG 方言 5 种脱敏(3 静态 `month_trunc` / `md5` / `mask_middle` + 2 动态 `keep_first_{n}` / `keep_last_{n}`,正则捕获数字参数),列名白名单 `[A-Za-z_][A-Za-z0-9_]*` + mask_type 校验防 SQL 注入;`postgresql_reader.py:load_others` 检测 `[mask]` 段自动调 mask 模块生成 querySql,优先级"手写 querySql > [mask] > table"。新建 `tests/unit/datax/test_mask.py` 9 条单测覆盖静态/动态/综合/各校验分支。`tests/integration/datax/hive_import/app_user_cert_info.ini` 从手写 querySql 切到 `[mask] cert_birthday = month_trunc` 声明式。联动 kb/90 §2.6 高优先级"DataX 字段级脱敏"改写为 [mask] 为规范 + querySql 为手写后备,低优先级"ini 配置化脱敏"条标 ✅ 压缩 | — |
+| 2026-04-23 | **kb/93 新增 2 条架构 ADR 草案 + kb/90 §2.6 联动**:(a) kb/93 §3 决策清单从"待补充"填入 ADR-01(按天补数归 DS,DataX 入口不做日期展开)+ ADR-02(分布式分发归 DS worker group,DataX 不重复随机),两条状态 = 草案、等正式拍板转"已采纳"。背景 / 决策 / 后果 / 候选方案 / 反悔条件五段精简写法。(b) kb/90 §2.6 后延 ADR 低优先级"日期范围展开"条追加"可能不做"备注指向 ADR-01;新增"DataX 仅本机执行"条(低优先级)指向 ADR-02。破例:CLAUDE.md 里 kb/93 "暂不改动除非显式要求",本次用户显式要求开口 | — |

+ 21 - 1
kb/93-架构决策.md

@@ -25,4 +25,24 @@
 
 ## 决策清单
 
-待补充
+### ADR-01 DataX 入口不做日期展开,按天补数归 DolphinScheduler
+
+- **状态**:草案(2026-04-23 讨论成型,待正式拍板转"已采纳")
+- **背景**:老 `spark-sql-starter` 的 `get_date_range` 支持 `20260401-20260410` 范围格式自动展开;DataX 入口从未用过。本项目调度用 DolphinScheduler,DS 原生支持**业务日期补数**(时间区间选定后,按调度周期逐日实例化 task)。用户老 DS 配置即 `-start-date=${dt} -stop-date=${cdt}` 单日传参。
+- **决策**:DataX 入口只接受单日语义(`start_date` / `stop_date` 对应一个 dt 分区);按天展开 / 批量补数 / 回溯全部交由 DS 工作流承担。
+- **后果**:
+  - 正面:DataX 层职责单一;补数、回溯、失败重跑在 DS 层统一可视化 / 可审计;DataX 不维护日期展开状态(哪天已做、哪天失败、重试)
+  - 负面:不走 DS 的一次性手工补 N 天需要外部 bash 循环或 `workspace/` 下临时 dispatcher
+- **候选方案**:DataX 入口层实现"日期范围自动展开 + 多 json 分发多 worker"——否决,理由是**重复 DS 职责** + 引入状态管理复杂度
+- **反悔条件**:项目从 DS 迁走到无补数功能的调度系统;或出现"必须在 DataX 层展开"的硬场景
+
+### ADR-02 分布式分发归 DolphinScheduler worker group,DataX 不重复随机
+
+- **状态**:草案(2026-04-23 讨论成型,待正式拍板转"已采纳")
+- **背景**:DataX 老入口 `single-job-starter.sh` 内置 `-random` + `workers.ini` 权重加权随机选 worker + ssh 分发。DS 自身亦有 **worker group** 机制(group 绑定机器列表、task 落到 group 内一台 worker)。两层叠加:DS 选 node01 → node01 上 DataX 再 random 到 node03。【查证 kb/91 §4.4】:用户老 DS 配置不传 `-random`,说明 DS 层已完成分发,DataX 只在本机跑——两层分发在实际运营中就没被"同时启用"过
+- **决策**:DataX 入口不做 worker 分发;分布式执行在 task 粒度靠 DS worker group 承担。DataX 入口的 `select_worker` 等同"返回 `current_host`",ssh 分支可删,`workers.ini` 可移除
+- **后果**:
+  - 正面:消除两层独立随机叠加打乱 DS 负载均衡;DataX 链路大幅简化(`worker.py` / ssh 远端执行 / `workers.ini` 可裁);维护成本下降
+  - 负面:单 DS 任务节点内部的批量(多 ini + `-parallel`)场景无法在 DataX 层散到多 worker,要分布式必须在 DS 层拆成多 task
+- **候选方案**:保留 DataX 两层分发——否决,"两层独立随机"破坏 DS worker group 语义
+- **反悔条件**:DS 换成无 worker group 支持的调度器;或单 task 内批量规模大到 DS 拆分成本过高