Ver Fonte

docs(kb): ADR-14 小表小文件分治——类1 raw+ods全量快照/类2增量保留+raw TTL

kb/90 加待办 7 追踪实施(复用待办 2/3 工具 + 类1 表名转 _ful_d)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
tianyu.chu há 3 semanas atrás
pai
commit
6d2d0575a6
2 ficheiros alterados com 39 adições e 0 exclusões
  1. 1 0
      kb/90-演进路线.md
  2. 38 0
      kb/93-架构决策.md

+ 1 - 0
kb/90-演进路线.md

@@ -33,3 +33,4 @@
 | 4 | 数据质量首批 + runner(schema drift 探查 + PG/Hive 行数比对) | `dw_base/dq/` + `bin/dq-runner.py` | `93` ADR-07(表数 ≥ 5 张启动) |
 | 5 | TAPD API 集成 + Claude Code hook 同步操作(hook 主动同步,非 commit→任务 ID 联动;细节待展开) | `dw_base/pm/` + hook | — |
 | 6 | DWS 上线前回算窗对齐 DWD 滚动 N=30(`jobs/dws` 现 N=2,未上线;上线前改滚动 30 与 DWD 同口径) | `jobs/dws/` | `25-dws建模` §1.4 · ADR-09 |
+| 7 | 小表小文件分治实施(类 1 raw+ods 全量快照 + 月末/2099 生命周期;类 2 raw TTL 保留窗);类 1 表名 `_inc_d`→`_ful_d` | `jobs/raw`·`jobs/ods` + `dw_base/ops/` | `93` ADR-14(复用待办 2 / 3) |

+ 38 - 0
kb/93-架构决策.md

@@ -565,3 +565,41 @@
   - 产品坚持不改 → 数仓退守:在 ods 用映射表把长尾事件归一到行为大类(治标不治本)
   - 引入半结构化无痛 schema 漂移的引擎(全 JSON + schema-on-read 贯穿),event explosion 的仓库代价下降
   - 团队规模 / 分析诉求变化使具名事件 ROI 反超
+
+### ADR-14 小表小文件治理:全量快照(类 1)vs 增量 + raw TTL(类 2)分治
+
+- **状态**:草案(方向记录,待实施)
+
+- **背景**:raw 层小文件累积。查证实况:DataX 每分区落 **1 个文件**(`channel=10` 未 fan-out,并非"每 channel 一文件"),两大交易表分区 ~400KB、fillback 历史大分区 `dt=20211027` 114MB 均健康;碎点集中在**低量小表(panini KB 级)× 按天分区无限增长**。按 ADR-03,raw 是落地暂存、ods 是历史真源(跨 dt 多版本),且 ods 每日只读 `raw.dt IN (${dt}, ${pdt})` 两天——更老的 raw 日分区对日常链路是死重。
+
+- **决策**:按 OneData「全量表(df)/ 增量表(di)」判据(数据量 × 变更率 × 历史诉求)分两类分治,不一刀切统一。
+
+  **类 1 · 全量快照**(`panini_checklist_base` / `panini_checklist_version_config` / `prd_checklist_base` / `shp_tzy_merchant`):
+  - raw + ods 均改**全量拉**(`where 1=1`,去 update_time 窗)
+  - 生命周期 = 每月末一张 + `dt=20991231` 最新,两任务实现:**月度任务**(每月 1 号跑,落 `dt=上月最后一天`)+ **日任务**(每日覆盖 `dt=20991231`)
+  - 下游维度读 `dt=20991231` 做 SCD1,要历史取月末快照 diff;不走 update_time 增量、不双源 union
+  - 分区数有界(12/年 + 1 哨兵)→ 小文件天然消除
+  - 命名随语义 `_inc_d` → `_ful_d`(DDL / ini / DS / ods 引用级联,另开实施工单)
+  - `prd_checklist` 归类 1 依据:jobs 无 dim/dws/下游消费;kb/24 §dim 明确 `category` 取自 `cgi.sport`、不经 checklist 反查,list 字段仅作快照冗余
+
+  **类 2 · 增量保留**(`usr_app_base_user` / `usr_app_user_cert_info` / `card_group_info` / `card_group_order_info`):
+  - raw 维持 ADR-03 update_time 增量、ods 维持双源 union + 跨 dt 多版本(拉链底座,一律不动)
+  - raw 小文件用 **TTL 保留窗**:只留最近 N 天 raw 日分区,更老的 drop(复用 kb/90 待办 3 分区保留工具);安全性由"数据已固化进 ods 真源"保证;代价是超窗的远期 ods 重算需从 PG 重抽(DataX `-backfill`)。N 取 14~30 天,可配
+  - fillback 历史大分区(`dt=20211027` 等)不入 TTL,单独留存 / 用完即删
+  - ods 不清理(历史真源全留)
+
+- **后果**:
+  - 正面:小文件根治(类 1 分区有界、类 2 raw 窗有界);类 2 不动 ADR-03/08 增量链与拉链底座;对齐 OneData 全量 / 增量分治;类 1 快照模型下游 SCD1 更直观
+  - 负面:两类两套运维;类 1 需改全量 SQL + 表名级联(`_ful_d`);raw TTL 超窗分区不可直接回溯(回退到 PG 重抽);`dt=20991231` 是非标"哨兵日期"分区(换取下游免 `max_pt` 查询)
+
+- **候选方案**:
+  - **全表统一 ods 全量快照**(含 usr / 交易表):usr 喂拉链、交易表是事件源,全量快照既贵又丢 update_time 版本史、废 ADR-03/08 底座——否决
+  - **全表统一增量**:小表低量按天分区无限碎,小文件无解——否决
+  - **分区内 `concatenate` 压实**:每分区已 1 文件,无可合;治不了"分区数太多"这一形态——否决(该工具仍留作类 2 ods 未来兜底,见 kb/90 待办 2)
+  - **`dt=20991231` 哨兵换 `max_pt(表)` 取最新**:省"假日期"分区,代价多一次元数据查询 + 下游需知晓最新分区名——本项目取哨兵图下游写死方便,可反悔
+  - **raw 也 TTL、类 1 不做快照**(仅靠 TTL 统一治理):类 1 是静态维表,快照 + 月末归档天然留历史且分区更省,优于"增量 + TTL 丢历史"——否决类 1 用 TTL
+
+- **反悔条件**:
+  - 类 1 表出现需按天增量的下游 → 转类 2
+  - 迁 Iceberg / Hudi(原生小文件合并 + MERGE INTO + 分区生命周期)→ 快照 / TTL 两套方案可简化统一
+  - 表数据量级或变更率变化使 df / di 判据失效 → 重新分类