### 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 python3 ${BASE_DIR}/bin/datax-job-config-generator.py ...` —— 在被选 worker 上生成 json,读的是**该 worker 本地**的 ini + `datasource//-<实例>.ini` 2. `run_single_datax_job()`(L267):`ssh python3 /opt/datax/bin/datax.py ` —— 在被选 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 ← datax.py stdout │ └─ tee → ${LOG_ROOT_DIR}/datax/.../.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/...//-.log`(不分散在各 worker) - 进度要 `tail -f` 独立日志文件 并行模式触发三连:USER=bigdata + CURRENT_HOST=RELEASE_HOST + 显式 `-parallel`,任一缺失退串行。 dataxini sync ini 里 `[reader]` / `[writer]` 的 `dataSource` 字段必须带 `{db_type}/` 前缀,例如 `dataSource = postgresql/prod-hobby`、`dataSource = 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_column`(`postgresql_reader.py:74-76`)、`MySQLReader`、`ClickHouseReader` 都覆盖了基类 `Plugin.load_column`,只读 `column`(字段名列表),`columnType` 不解析;类型靠 JDBC 驱动的 `ResultSetMetaData` 返回。对应的 writer 同样只读 `column`。**只有 HDFS/HBase/Kafka 这类读写文件/非关系型存储的插件**走基类 `Plugin.load_column`(`plugin.py:63-118`),此时 `columnType` 才生效,且字符串字段可省略(基类默认类型是 `string`,见 `plugin.py:77`)。这一条与 kb/20 §8.1 raw 层"DataX ini 不写类型映射"的约定方向一致,但底层机制是上游代码覆盖掉了,不是约定的结果。 **增量/全量区分:** - `dt=19700101` 或 `query={}` → 全量 - `query` 中含 `${start_date}`/`${stop_date}` → 增量