91-重构备忘.md 6.2 KB

0. 待办

0.1 1 期 tdm 重跑(2026-05-12 加)

代码已改完 + commit + sync m2/cdh(批 1 commit e42c6ae):

  • jobs/tdm/usr/tdm_usr_tag_d.sql:4 段 stat 跨层下钻 dwd + order_type='group' + tag_code 改 usr_trade_* + cnt 改 COUNT(DISTINCT order_id)
  • manual/backfill/20260511_tdm_usr_tag_o_y2025.sql:同上 + 扫 dwd 2025 全年

待 DS UI 手动跑:

# 工作流 项目 参数 备注
1 tdm_usr_tag_d_init manual ${dt}=20260508 对齐 dim_usr 现有分区;INSERT OVERWRITE 自动覆盖
2 tdm_usr_tag_o_y2025 manual dt 固定 20251231(SQL 内 PARTITION 已写死) 跑完凝固永不变

dws_usr_user_trade_1d 不重跑(SQL 未改,保通用聚合语义;kb/93 ADR-10)。

验证:跑完按 kb/34 §6.2 INTERSECT 圈选 SQL 跑"上海男 × 篮球 25 年 > 200",能查到用户即口径正确。


0.2 raw 同步策略备忘:小表转全量 + cgoi 保留增量(2026-05-20 加,待评)

方向:8 张 raw 中 cgoi(订单)外 7 张走全量(每天一份 ful_d 快照分区),cgoi 保留 inc_d 双源 union(数据量大,按年分 6 段回填验证过)。

观察支撑(2026-05-20 raw 重刷实测):cgoi 外 7 张全量耗时都很短;cgi(拼团商品)也属可接受。

触发条件:1 期 tdm 端到端跑稳一周后翻出来评;评估时一并看 raw 调度耗时分布 + ods/dim/dwd SQL 重写工作量 + 全量 vs 增量在补数/重跑场景下的运维差异。

潜在影响(评估前点出来):

  • ods 模式:双源 union + dedupe 退化为单源最新快照(kb/93 ADR-03 退化为 cgoi 单表特例)
  • 设计语义清晰:cgoi = 大事实表(增量)/ 其他 7 张 = 维度类(全量),符合 Kimball 直觉
  • raw 层 his_o + inc_d 双表设计对小表不再必要(小表只需每天一份全量分区)

阻塞 / 反悔退路:现在动 = ods/dim/dwd 7 张 SQL 重写 + 重新 backfill,1 期闭环要停半个月;全量模式在数据量增长后可能反悔,ADR-03 双源 union 设计保留作为退路。


4.4 老 DataX 脚本 Worker 分发与日志链路(2026-04-23 查证)

本节描述的是老脚本datax-single/multiple/multiple-hive-job-starter.sh)的分发和日志行为。 老脚本已于 2026-04-23 批次 5 随工作 3 新入口落地整体删除(见 kb/92 changelog)。 本节作为老行为档案保留,给 kb/93 ADR-02(分布式归 DS worker group)提供历史背景。

4.4.1 分发位置

分发在 bin/datax-single-job-starter.sh 这层;multiple-*-starter.sh 只是 for 循环调 single,每个 single 独立调 select_worker() 掷骰子(参数 -random 触发;缺省回退本机)。

单次 single-job-starter 执行 两次 ssh

  1. generate_job_config()(L67):ssh <worker> python3 ${BASE_DIR}/bin/datax-job-config-generator.py ... —— 在被选 worker 上生成 json,读的是该 worker 本地的 ini + datasource/<db_type>/<env>-<实例>.ini
  2. run_single_datax_job()(L267):ssh <worker> python3 /opt/datax/bin/datax.py <json> —— 在被选 worker 上跑 DataX JVM

含义:所有 worker 节点必须同路径具备 项目代码 + datasource/ + /opt/datax + Python 解释器。本项目部署的 base_dir = /home/bigdata/release/poyee-data-warehouse/、datasource 路径 = /home/bigdata/release/datasource/(项目同级)。

4.4.2 串行模式日志链路(默认,不加 -parallel

idea 控制台 ← ssh ← m2 bash ← ssh ← <worker> datax.py stdout
                      │
                      └─ tee → ${LOG_ROOT_DIR}/datax/.../<job>.log(m2 本地文件)

【查证 multiple-job-starter.sh:231】single-job-starter ... | tee "${LOG_FILE}":ssh 回传的 stdout 经 tee 同时写入 m2 本地日志文件 + 沿发起方 ssh 通道回到 idea 控制台。远端 DataX 日志在 idea 控制台完整可见,顺序打印。

4.4.3 并行模式(加 -parallel

【查证 multiple-job-starter.sh:240】single-job-starter ... > "${LOG_FILE}" 2>&1 &:每个 single 后台跑 + stdout 重定向到独立文件,不经 tee、不回当前 shell

  • idea 控制台只看到 "所有 DataX 作业都已启动(共启动 N 个)" 一行
  • 每个任务日志落 m2 本地 ${LOG_ROOT_DIR}/datax/.../<START_DATE>/<START_DATE>-<JOB_NAME>.log(不分散在各 worker)
  • 进度要 tail -f 独立日志文件

并行模式触发三连:USER=bigdata + CURRENT_HOST=RELEASE_HOST + 显式 -parallel,任一缺失退串行。

dataxini

sync ini 里 [reader] / [writer]dataSource 字段必须带 {db_type}/ 前缀,例如 dataSource = postgresql/prod-hobbydataSource = 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_columnpostgresql_reader.py:74-76)、MySQLReaderClickHouseReader 都覆盖了基类 Plugin.load_column,只读 column(字段名列表),columnType 不解析;类型靠 JDBC 驱动的 ResultSetMetaData 返回。对应的 writer 同样只读 column只有 HDFS/HBase/Kafka 这类读写文件/非关系型存储的插件走基类 Plugin.load_columnplugin.py:63-118),此时 columnType 才生效,且字符串字段可省略(基类默认类型是 string,见 plugin.py:77)。这一条与 kb/20 §8.1 raw 层"DataX ini 不写类型映射"的约定方向一致,但底层机制是上游代码覆盖掉了,不是约定的结果。

增量/全量区分:

  • dt=19700101query={} → 全量
  • query 中含 ${start_date}/${stop_date} → 增量