|
|
@@ -42,11 +42,11 @@
|
|
|
| `RELEASE_USER="alvis"` | `bin/common/init.sh` | 改为 `RELEASE_USER="bigdata"` 并移入 `conf/env.sh` |
|
|
|
| `RELEASE_ROOT_DIR="/home/alvis/release"` | `init.sh`、`__init__.py` | 改为 `/home/bigdata/release` 并移入 `conf/env.sh` |
|
|
|
| 项目部署目录 `poyee-data-warehouse/` | `publish.sh` | 新项目发布目录为 `/home/bigdata/release/poyee-data-warehouse/` |
|
|
|
-| `DATAX_WORKERS=(m3 d1 d2 d3 d4)` + `DATAX_WORKERS_WEIGHTS` 权重 map | `init.sh:18-31`(含展开 `DATAX_WORKERS_QUEUE` 的循环) | workers 列表 + 权重 map **整体**移入 `conf/workers.conf`(ini 或 yaml 格式),`init.sh` 仅保留读取 + 展开逻辑 |
|
|
|
+| `DATAX_WORKERS=(m3 d1 d2 d3 d4)` + `DATAX_WORKERS_WEIGHTS` 权重 map | `init.sh:18-31`(含展开 `DATAX_WORKERS_QUEUE` 的循环) | workers 列表 + 权重 map **整体**移入 `conf/workers.ini`(ini 格式),`init.sh` 仅保留读取 + 展开逻辑 |
|
|
|
| `HADOOP_CONF_DIR='/etc/hadoop/conf'` | `__init__.py` | 使用系统环境变量 |
|
|
|
| `LOG_ROOT_DIR="/opt/data/log"` + whoami 分流 | `init.sh`、`__init__.py` | 删除 whoami 分支,单值改为 `${HOME}/log` 并迁入 `conf/env.sh`,见 §7.2.1 |
|
|
|
| 告警 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.yaml`,SQL 文件可用 `SET` 覆盖,见 §2.3 |
|
|
|
+| 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` 同步改 |
|
|
|
| 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 函数,单一来源 |
|
|
|
@@ -64,12 +64,9 @@
|
|
|
conf/
|
|
|
├── env.sh # Shell 环境变量(路径、用户、日志目录等)
|
|
|
├── env.py # Python 环境变量(或直接读 env.sh)
|
|
|
-├── workers.conf # DataX Worker 列表与权重
|
|
|
+├── workers.ini # DataX Worker 列表与权重
|
|
|
├── alerter.ini # 告警 Webhook 配置(入库;见 §2.1)
|
|
|
-├── spark-defaults.yaml # Spark 默认参数
|
|
|
-└── ds/
|
|
|
- ├── base_config.yaml # DolphinScheduler 配置
|
|
|
- └── process_code.yaml # 工作流编码映射
|
|
|
+└── spark-defaults.conf # Spark 默认参数(Spark 原生格式)
|
|
|
```
|
|
|
|
|
|
### 2.3 Spark 配置三级覆盖策略
|
|
|
@@ -84,53 +81,55 @@ conf/
|
|
|
**目标态:三级覆盖**
|
|
|
|
|
|
```
|
|
|
-conf/spark-defaults.yaml (L1) 全局默认,运维可改,发版同步到集群
|
|
|
+conf/spark-defaults.conf (L1) 全局默认,运维可改,发版同步到集群
|
|
|
↓ 被覆盖
|
|
|
SQL 文件内 SET spark.xxx=yyy (L2) 单作业级别的覆盖,业务开发写
|
|
|
↓ 被覆盖
|
|
|
命令行 -sc key=value / Python 构造函数传参 (L3) 临时/调试 override
|
|
|
```
|
|
|
|
|
|
-**`conf/spark-defaults.yaml` 草案**:
|
|
|
+**`conf/spark-defaults.conf` 草案**:
|
|
|
|
|
|
-```yaml
|
|
|
+沿用 Spark 官方 `$SPARK_HOME/conf/spark-defaults.conf` 的格式:**flat `spark.x.y value`**,空白分隔,`#` 注释,无 section。好处:运维熟悉、与 `spark-submit --properties-file` 原生兼容、代码侧零映射转换。
|
|
|
+
|
|
|
+```conf
|
|
|
# 全局 Spark 默认参数,dw_base/spark/spark_sql.py 启动时加载
|
|
|
# 单作业需要覆盖时,在对应 jobs/*.sql 文件开头写 SET;不要改本文件
|
|
|
|
|
|
-executor:
|
|
|
- instances: 4
|
|
|
- cores: 4
|
|
|
- memory: 8g
|
|
|
- memoryOverhead: 2g
|
|
|
-
|
|
|
-driver:
|
|
|
- cores: 2
|
|
|
- memory: 4g
|
|
|
- maxResultSize: 2g
|
|
|
-
|
|
|
-sql:
|
|
|
- shuffle.partitions: 200
|
|
|
- adaptive.enabled: true
|
|
|
- broadcastTimeout: -1
|
|
|
- codegen.wholeStage: false
|
|
|
- execution.arrow.enabled: true
|
|
|
- execution.arrow.fallback.enabled: true
|
|
|
- files.ignoreCorruptFiles: true
|
|
|
- statistics.fallBackToHdfs: true
|
|
|
-
|
|
|
-default:
|
|
|
- parallelism: 400
|
|
|
+# Executor
|
|
|
+spark.executor.instances 4
|
|
|
+spark.executor.cores 4
|
|
|
+spark.executor.memory 8g
|
|
|
+spark.executor.memoryOverhead 2g
|
|
|
+
|
|
|
+# Driver
|
|
|
+spark.driver.cores 2
|
|
|
+spark.driver.memory 4g
|
|
|
+spark.driver.maxResultSize 2g
|
|
|
+
|
|
|
+# SQL
|
|
|
+spark.sql.shuffle.partitions 200
|
|
|
+spark.sql.adaptive.enabled true
|
|
|
+spark.sql.broadcastTimeout -1
|
|
|
+spark.sql.codegen.wholeStage false
|
|
|
+spark.sql.execution.arrow.enabled true
|
|
|
+spark.sql.execution.arrow.fallback.enabled true
|
|
|
+spark.sql.files.ignoreCorruptFiles true
|
|
|
+spark.sql.statistics.fallBackToHdfs true
|
|
|
+
|
|
|
+# Default parallelism
|
|
|
+spark.default.parallelism 400
|
|
|
```
|
|
|
|
|
|
**代码改动要点**:
|
|
|
|
|
|
1. `dw_base/spark/spark_sql.py`
|
|
|
- - 新增 `_load_default_config() -> dict`:读 `conf/spark-defaults.yaml`,扁平化为 `{"spark.executor.instances": 4, ...}` 形式(dot-notation 按 yaml 嵌套路径拼)
|
|
|
- - 构造函数接收的显式参数(`spark_executor_cores` 等)改为 `None` 默认,若未传则 fall back 到 yaml
|
|
|
+ - 新增 `_load_default_config() -> dict`:逐行读 `conf/spark-defaults.conf`,跳过空行与 `#` 注释,首段空白切成 `(key, value)`;key 已是全限定 `spark.x.y`,直接作为 dict key 返回,不做任何变换
|
|
|
+ - 构造函数接收的显式参数(`spark_executor_cores` 等)改为 `None` 默认,若未传则 fall back 到 conf
|
|
|
- `SparkSession.builder` 的 `.config(...)` 链改成 `for k, v in resolved_config.items(): builder.config(k, v)`
|
|
|
2. SQL 文件内的 `SET spark.xxx=yyy` 本来就由 `spark.sql(...)` 原生支持,无需改动
|
|
|
3. 命令行 `-sc` 参数保持现有语义,覆盖 L1
|
|
|
-4. **Python 单测要能跑**:yaml 读取要容错(测试环境下找不到 conf 文件时回退到一套最小内置默认,不阻塞 `tests/unit/`)
|
|
|
+4. **Python 单测要能跑**:conf 读取要容错(测试环境下找不到 conf 文件时回退到一套最小内置默认,不阻塞 `tests/unit/`)
|
|
|
|
|
|
**兼容性**:老代码里已在写 `SparkSQL(spark_executor_cores=8, ...)` 的调用站点不破坏,因为显式传参仍是最高级(L3)。
|
|
|
|
|
|
@@ -140,12 +139,12 @@ default:
|
|
|
- `spark.sql.*`、`spark.default.parallelism` 等运行时参数 —— `spark.conf.set(...)` 或 SQL 内 `SET` 可动态改写
|
|
|
- `spark.executor.*`、`spark.driver.*`、`spark.executor.memoryOverhead` 等资源类参数 —— **session 启动时锁定**,SQL 里写 `SET spark.executor.memory=16g` 不会真的扩容已启动的 executor
|
|
|
|
|
|
- 因此开发写 SQL 内 `SET` 时只能调 `spark.sql.*` 和并行度;需要改资源的场景只能走 L3(命令行 `-sc` 或调用方在构造 `SparkSQL(...)` 时显式传参)。文档里和 `spark-defaults.yaml` 注释里都要讲清楚这条,避免开发以为 `SET spark.executor.memory` 有效。
|
|
|
+ 因此开发写 SQL 内 `SET` 时只能调 `spark.sql.*` 和并行度;需要改资源的场景只能走 L3(命令行 `-sc` 或调用方在构造 `SparkSQL(...)` 时显式传参)。文档里和 `spark-defaults.conf` 注释里都要讲清楚这条,避免开发以为 `SET spark.executor.memory` 有效。
|
|
|
|
|
|
-2. **`conf/spark-defaults.yaml` 的路径解析依赖 `PROJECT_ROOT_PATH`**,这和 §三 `__init__.py` 瘦身存在先后依赖:
|
|
|
+2. **`conf/spark-defaults.conf` 的路径解析依赖 `PROJECT_ROOT_PATH`**,这和 §三 `__init__.py` 瘦身存在先后依赖:
|
|
|
- 现状 `PROJECT_ROOT_PATH` 在 `dw_base/__init__.py` 顶部定义,`import dw_base` 就会拿到
|
|
|
- - 瘦身后 `__init__.py` 只保留最基本路径定义,`PROJECT_ROOT_PATH` 仍可用,但拆分过程中要保证 `spark_sql.py` 加载 yaml 的那行代码拿到的根路径与瘦身前一致
|
|
|
- - **执行顺序建议**:先做 §三 `__init__.py` 瘦身,把 `PROJECT_ROOT_PATH` 的定义稳定下来;再做 §2.3 的 `spark-defaults.yaml` 接入。反过来做会踩到"瘦身后路径变了"的返工
|
|
|
+ - 瘦身后 `__init__.py` 只保留最基本路径定义,`PROJECT_ROOT_PATH` 仍可用,但拆分过程中要保证 `spark_sql.py` 加载 conf 的那行代码拿到的根路径与瘦身前一致
|
|
|
+ - **执行顺序建议**:先做 §三 `__init__.py` 瘦身,把 `PROJECT_ROOT_PATH` 的定义稳定下来;再做 §2.3 的 `spark-defaults.conf` 接入。反过来做会踩到"瘦身后路径变了"的返工
|
|
|
|
|
|
**与仓库改名的联动**:
|
|
|
|