|
|
@@ -113,11 +113,9 @@ D 基础设施 ─────┘
|
|
|
| 告警 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/{env}/{ini_basename}.json`(仅按 env 分一级,去掉 src_dst / project_layer_env 等派生层级);`.gitignore` 同步改 |
|
|
|
+| 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` 同步改 |
|
|
|
| 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 函数,单一来源 |
|
|
|
-| DataX 脚本不支持 `-env` 参数 | `bin/datax-*.sh` / `bin/datax-job-config-generator.py` 参数解析 | 新增 `-env` 参数,由 ini 内 `dataSource = {db_type}/{instance}` 拼接成 `datasource/{db_type}/{env}/{instance}.ini` 的完整路径;详见 §2.5 |
|
|
|
-| `datasource/` 单层组织(无环境子目录) | `datasource/{db_type}/{instance}.ini` | 改为 `datasource/{db_type}/{env}/{instance}.ini`(运维侧权限隔离 + 支持一套代码跑多环境) |
|
|
|
-| ini 里 `dataSource` 字段拼接环境后缀 | 老项目写法 `dataSource = pg-hobby-prod` | 改为 `dataSource = {db_type}/{instance}`(不含环境),env 由脚本注入 |
|
|
|
+| 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 |
|
|
|
| `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/` |
|
|
|
@@ -157,88 +155,13 @@ L3 SparkSQL(...) 显式传参 + extra_spark_config + 命令行 -sc
|
|
|
|
|
|
**与仓库改名的联动** ✅ 2026-04-22:仓库改名 `tendata-warehouse-release` → `poyee-data-warehouse` 已完成(项目根由用户手动改名 + 路径正则两处字面量同步)。`.idea/*.iml` + `modules.xml` 因 `.idea` + `*.iml` 在 `.gitignore`,老 iml / modules.xml 引用 / workspace.xml module name 残留是本地 IDE 状态,不入库亦不影响运行,不处理。
|
|
|
|
|
|
-### 2.5 DataX 脚本多环境支持与路径解耦
|
|
|
+### 2.5 DataX 脚本路径解耦
|
|
|
|
|
|
-**现状(脚本残留老逻辑,新项目的业务 ini 未走这条路径):**
|
|
|
+**现状**:`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` 的位置——能跑但与新约定不符。
|
|
|
|
|
|
-1. **脚本里残留路径前缀剥离**:`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` 的位置——能跑但与新约定不符。代码里这段死逻辑要清理,同时输出根目录也一并改名为 `conf/datax-json/`。
|
|
|
-2. **没有 `-env` 参数**:所有脚本不认 `-env`。
|
|
|
-3. **数据源配置单层组织**:老约定 `datasource/{db_type}/{instance}.ini` 把环境和实例扁平混在一起,要么靠不同的 `{instance}` 名字(如 `hobby-prod` / `hobby-dev`)区分,要么靠部署时替换文件。第一种让 ini 里写 `dataSource = pg-hobby-prod` 这种绑死环境的字符串;第二种让开发侧不知道当前跑的是哪套。
|
|
|
+**目标态**:清理死路径派生逻辑,JSON 输出扁平化为 `conf/datax-json/{ini_basename}.json`(基名由 `21-命名规范.md` §3.9 保证全局唯一),日志目录简化为 `${LOG_ROOT_DIR}/datax/${START_DATE}/${JOB_NAME}.log`。
|
|
|
|
|
|
-**目标态:一套代码多环境运行**
|
|
|
-
|
|
|
-**三件事联动(顺序重要):**
|
|
|
-
|
|
|
-#### 阶段 1:datasource 改按环境分子目录
|
|
|
-
|
|
|
-- 改为 `datasource/{db_type}/{env}/{instance}.ini`
|
|
|
-- 运维在集群侧按 `prod` / `test` / `dev` 建子目录,各自放一套连接配置
|
|
|
-- 权限隔离更方便:prod 子目录只给生产账号可读
|
|
|
-
|
|
|
-#### 阶段 2:ini 里 `dataSource` 字段去掉环境后缀
|
|
|
-
|
|
|
-- 老写法:`dataSource = pg-hobby-prod`
|
|
|
-- 新写法:`dataSource = pg/hobby`(只写 `{db_type}/{instance}`,不含 env)
|
|
|
-- **变更项目下所有存量 ini**:当前 `conf/bak/` 下的老配置不处理,等业务新 ini 从零写起时就按新规范
|
|
|
-
|
|
|
-#### 阶段 3:DataX 脚本加 `-env` 参数 + env 注入逻辑
|
|
|
-
|
|
|
-**`bin/common/init.sh` 扩展:**
|
|
|
-
|
|
|
-```bash
|
|
|
-# 从命令行参数里挑出 -env,或 fall back 到 conf/env.sh
|
|
|
-# 不读环境变量(用户明确要求不污染 shell 环境)
|
|
|
-# 不做"按用户/部署目录自动派生"——env 必须来自 -env 或 conf/env.sh,二者都没给就退出
|
|
|
-resolve_env() {
|
|
|
- for arg in "$@"; do
|
|
|
- case $arg in
|
|
|
- -env) NEXT_IS_ENV=1 ;;
|
|
|
- -env=*) DW_ENV="${arg#*=}" ;;
|
|
|
- *) [ -n "$NEXT_IS_ENV" ] && DW_ENV="$arg" && unset NEXT_IS_ENV ;;
|
|
|
- esac
|
|
|
- done
|
|
|
- if [ -z "$DW_ENV" ]; then
|
|
|
- # fall back 到 conf/env.sh(入仓库的默认配置)
|
|
|
- [ -f "${BASE_DIR}/conf/env.sh" ] && . "${BASE_DIR}/conf/env.sh"
|
|
|
- fi
|
|
|
- if [ -z "$DW_ENV" ]; then
|
|
|
- echo "[FATAL] DW_ENV not set: pass -env <dev|test|prod> or define DW_ENV in conf/env.sh" >&2
|
|
|
- exit 1
|
|
|
- fi
|
|
|
- export DW_ENV
|
|
|
-}
|
|
|
-```
|
|
|
-
|
|
|
-**`conf/env.sh` 草案**(**入仓库**,开发者维护,服务本地调试):
|
|
|
-
|
|
|
-```bash
|
|
|
-# 全局环境变量默认值
|
|
|
-# env 判定优先级:命令行 -env > 本文件 DW_ENV
|
|
|
-# 默认锁定为 dev:本地调试开箱即用;DolphinScheduler / 生产脚本总是命令行显式 -env prod 覆盖
|
|
|
-DW_ENV=dev
|
|
|
-LOG_ROOT_DIR="${HOME}/log"
|
|
|
-```
|
|
|
-
|
|
|
-**`dw_base/datax/job_config_generator.py` 改造**:
|
|
|
-
|
|
|
-- `JobConfigGenerator.__init__` 接受新参数 `env`
|
|
|
-- 各 reader/writer 插件在解析 `dataSource = pg/hobby` 时,自动拼成 `datasource/pg/{env}/hobby.ini` 的完整路径再去读连接信息
|
|
|
-
|
|
|
-**`bin/datax-job-config-generator.py` 改造**:
|
|
|
-
|
|
|
-- 新增 `-env` 参数
|
|
|
-- **去掉** `temp = os.path.dirname(gcf).replace('conf/datax/config/', '').split('/')` 这段路径前缀剥离
|
|
|
-- JSON 输出目录从 `conf/datax/generated/` 改名为 `conf/datax-json/`,子路径简化为 `conf/datax-json/{env}/{ini_basename}.json`(扁平,按 env 分一级;`ini_basename` 由 `21-命名规范.md` §3.9 保证全局唯一——采集类 = 目标 Hive 表名、导出类 = `{源}__{db_type}_{instance}`、一次性 = 日期前缀)
|
|
|
-- `.gitignore` 同步把 `conf/datax/generated` 改成 `conf/datax-json`
|
|
|
-
|
|
|
-#### 阶段 4:启动脚本层串起来
|
|
|
-
|
|
|
-- `datax-single-job-starter.sh` 调用 generator 时把 `$DW_ENV` 透传过去
|
|
|
-- `datax-multiple-job-starter.sh` 日志目录改为 `${LOG_ROOT_DIR}/datax/${DW_ENV}/${START_DATE}/${JOB_NAME}.log`(把 `SRC_DST` / `PROJECT_LAYER_ENV` 彻底移除)
|
|
|
-
|
|
|
-**兼容性**:阶段 1-3 期间 `conf/bak/` 下的老 ini 不参与新流程,保留作为老项目历史资产;新业务 ini 全部从零按新规范写。
|
|
|
-
|
|
|
-**参考**:kb/00-项目架构.md §4.3(DataX 脚本详细使用)、§6.4(多环境机制)、kb/21-命名规范.md §3.9(DataX ini 文件命名)。
|
|
|
+**已作废的子项**(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)。
|
|
|
|
|
|
### 2.6 DataX 入口脚本收口为两条命令(中优先级)
|
|
|
|
|
|
@@ -375,7 +298,7 @@ dfs.client.failover.proxy.provider.nameservice1 = org.apache.hadoop.hdfs.server.
|
|
|
| `dw_base/datax/plugins/reader/hdfs_reader.py` / `writer/hdfs_writer.py` | **不用改**,`defaultFS + hadoopConfig` 由 `load_data_source()` 自动注入到 `parameter` |
|
|
|
| `dw_base/__init__.py` | **保留** `os.environ['HADOOP_CONF_DIR']`(Spark on YARN 启动强校验)+ `os.environ.setdefault('SPARK_CONF_DIR', '/etc/spark/conf')`(pip pyspark 默认指向自身空 conf/,需显式指到集群配置才能加载 hive-site.xml);DataX JVM 不读这些,HA 靠 ini `[hadoop_config]`。详见 `01-运行环境.md §4` |
|
|
|
| `bin/datax-gc-generator.py` | §2.7 从零重写时一并处理,这里不单独列 |
|
|
|
-| `datasource/hdfs/{env}/*.ini` | 按新 schema 新建(prod 带 `[hadoop_config]`;dev/test 只写 `[base] defaultFS`) |
|
|
|
+| `datasource/hdfs/{env}-{实例简称}.ini` | 按新 schema 新建(HA 集群带 `[hadoop_config]`;单 NN 只写 `[base] defaultFS`) |
|
|
|
|
|
|
**回归测试**:
|
|
|
- prod HA 集群:新 ini 跑一次真实 PG→HDFS 任务,生成 json 含完整 `hadoopConfig`,任务成功(2026-04-18 已用手写 json 预验证)
|
|
|
@@ -659,9 +582,8 @@ else:
|
|
|
| `conf/alerter.ini`(告警 Webhook,入库) | 待启动 | 旧告警代码删除(已 2026-04-20 完成) | §2.1 |
|
|
|
| `conf/spark-defaults.conf`(底层 11 条)+ `conf/spark-tuning.conf`(调优 10 条)+ `spark_sql.py` 三级覆盖 | ✅ 2026-04-21 | — | §2.3 |
|
|
|
| `conf/datax-speed.ini`(DataX 分时速率) | 待启动 | — | §2.9 |
|
|
|
-| `datasource/{db_type}/{env}/{instance}.ini` 多环境分层 | 待启动 | — | §2.5 |
|
|
|
-| DataX 脚本去前缀剥离 + 加 `-env` 参数 | 待启动 | datasource 多环境 | §2.5 |
|
|
|
-| JSON 输出目录改名 `conf/datax-json/` | 待启动 | — | §2.1 |
|
|
|
+| datasource 扁平化 `{db_type}/{env}-{实例简称}.ini` + db_type 按父目录段判定 | ✅ 2026-04-22 | — | §2.1 / §2.5 |
|
|
|
+| DataX 脚本去前缀剥离 + JSON 输出目录改名扁平化 `conf/datax-json/{ini_basename}.json` | 待启动 | — | §2.1 / §2.5 |
|
|
|
|
|
|
### B `dw_base/` 重组
|
|
|
|