소스 검색

fix: 移除 SQL SET 资源类参数不生效 的错误注释/文档

tianyu.chu 2 주 전
부모
커밋
834d06658f
4개의 변경된 파일4개의 추가작업 그리고 8개의 파일을 삭제
  1. 1 3
      conf/spark-tuning.conf
  2. 1 1
      dw_base/spark/spark_sql.py
  3. 1 3
      kb/90-重构路线.md
  4. 1 1
      kb/92-重构进度.md

+ 1 - 3
conf/spark-tuning.conf

@@ -2,9 +2,7 @@
 # 本文件收录资源/并行度/队列类参数,新业务落地早期会频繁调整以找到合适默认值。
 # 底层行为/开关类参数见 conf/spark-defaults.conf。
 # 加载入口:dw_base/spark/spark_sql.py 构造 SparkSession 前加载(在 spark-defaults.conf 之后,相同 key 覆盖 defaults)
-# 覆盖规则:L1 spark-defaults.conf + 本文件 < L2 SQL 内 SET(仅 spark.sql.*)< L3 构造函数显式传参 / extra_spark_config
-# 注意:spark.driver.* / spark.executor.* / spark.executor.memoryOverhead 属于资源类参数,session 启动后不可变,
-#       SQL 内 SET 不生效;需临时改资源走 L3(命令行 -sc 或调用方 SparkSQL(...) 显式传参)。
+# 覆盖规则:L1 spark-defaults.conf + 本文件 < L2 SQL 内 SET < L3 构造函数显式传参 / extra_spark_config
 
 # Driver
 spark.driver.cores                              2

+ 1 - 1
dw_base/spark/spark_sql.py

@@ -152,7 +152,7 @@ class SparkSQL(object):
         pretty_print(f'{NORM_MGT}L1 加载 {NORM_GRN}{len(l1_defaults)}{NORM_MGT} 条 conf 默认')
         for key, value in l1_defaults.items():
             builder.config(key, value)
-        # L2:SQL 内 SET(仅 spark.sql.* 生效,资源类参数 session 启动后不可变
+        # L2:SQL 内 SET(query() 预扫描,session 启动前写入 builder
         for key, value in self._final_spark_config.items():
             pretty_print(f'{NORM_MGT}L2 应用 SQL SET {NORM_GRN}{key} => {str(value)}')
             builder.config(key, value)

+ 1 - 3
kb/90-重构路线.md

@@ -150,13 +150,11 @@ conf/
 ```
 L1   conf/spark-defaults.conf  +  conf/spark-tuning.conf     (相同 key tuning 覆盖 defaults)
-L2   SQL 文件内 SET spark.xxx=yyy     (仅 spark.sql.* 生效,资源类参数 session 启动后不可变
+L2   SQL 文件内 SET spark.xxx=yyy     (query() 预扫描塞入 _final_spark_config,session 启动前写入 builder
 L3   SparkSQL(...) 显式传参  +  extra_spark_config  +  命令行 -sc
 ```
 
-**落地坑**:`SET spark.executor.memory=16g` 等资源类参数 session 启动后锁定,SQL 内 SET 不生效(Spark 行为,非本项目限制)。改资源只能走 L3。代码实现见 `dw_base/spark/spark_sql.py:_load_spark_conf_file` 与 `__init_spark_session`。
-
 **与仓库改名的联动** ✅ 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 脚本多环境支持与路径解耦

+ 1 - 1
kb/92-重构进度.md

@@ -71,7 +71,6 @@
 - [x] 建立 `conf/spark-defaults.conf`(底层行为/开关类 11 条,少改)+ `conf/spark-tuning.conf`(资源/并行度 10 条,业务常改)(2026-04-21,Spark 原生格式;两文件拆分,见 `90-重构路线.md` §2.3)
 - [x] 改造 `dw_base/spark/spark_sql.py`:构造函数 10 个 tuning 默认值 → `None` sentinel;新增 `_load_spark_conf_file()`;`__init_spark_session` 按 L1(两 conf 叠加) < L2(SQL SET) < L3(构造参数非 None + `extra_spark_config`) 三级覆盖(2026-04-21)
 - [ ] 验证:同一条 SQL 在无 SET、有 SET、命令行 -sc 三种场景下 `spark.conf.get(...)` 返回值符合优先级预期
-- [ ] 验证:`SET spark.executor.memory=Xg` 不会影响已启动 executor(文档里说清楚这条限制)
 - [x] `RELEASE_USER="alvis"` → `RELEASE_USER="bigdata"` 并迁入 `conf/env.sh`
 - [x] `RELEASE_ROOT_DIR="/home/alvis/release"` → `/home/bigdata/release` 并迁入 `conf/env.sh`
 - [ ] `DATAX_WORKERS=(m3 d1 d2 d3 d4)` + 权重 map 迁入 `conf/workers.ini`
@@ -179,5 +178,6 @@
 | 2026-04-21 | **SQL 风格基线尝试后撤回**:本轮前半段把 `sql_style.xml` 从 `conf/` 挪到项目根,并在 kb/30 §3.2.1 / §3.2.2 立了强基线(关键字/类型 UPPER、SELECT/FROM/ORDER/GROUP 一项一行、JOIN/ON 缩进、CASE/CTE/UNION/OVER/INSERT OVERWRITE/分号九条换行与缩进样例)。实测 IDEA formatter 支持面不足(KEYWORD_CASE 仅作用于新输入不改存量、SELECT 前置逗号长期不支持、ORDER/GROUP 一项一行的 option 名 JetBrains 非公开、UNION 前后空行 formatter 不管、CASE THEN/END 独立行无选项控制),强约束无法靠 formatter 落地。本轮后半段全部回退:删 `sql_style.xml`、kb/30 §3.2.1 / §3.2.2 整节删除、原 §3.2.3 不对齐 AS 重编号为 §3.2.1。团队 SQL 格式化改由各自 IDEA 默认 + 项目 SQL 方言统一设为 Spark 承担,冲突走 review | — |
 | 2026-04-21 | **下线"阶段 3:业务 SQL 从零开发" + 取消 UDF 注释补齐 + kb/31 首批登记 13 个通用 UDF**:(a) 业务 SQL 从零开发属于新开发、不属于重构 scope:kb/92 总览表删阶段 3 行、阶段 3 整节删除、阶段 5 前置条件从"阶段 3 稳定"改为"新业务 SQL 稳定";kb/90 §〇 聚簇表删 E 行、DAG 图删 E 节点、关键依赖边 "A+B+C→E" 与 "E→F" 合并为 "新业务 SQL 生产稳定→F"、§八 聚簇 E 整节删除、当前推进建议"等待前置"里 E 行改为 F 行。(b) 通用 UDF 注释已由开发者手动补完(`spark_common_udf.py` 13 个 `@udf` 函数均带 `UDF-XX` 顺序编号 + 分节注释),kb/90 §2.12 删"5 段模板 + 5 批 commit"规划、"40 函数"更正为"13 个注册 UDF"、标题从"注释完整化 + 自查表"改为"自查表"。(c) `kb/31-UDF手册.md` §1 通用 UDF 表从空壳填入 13 行(UDF-01/02/21/22/23/31/32/33/41/42/51/52/53),分类按代码中分节注释(JSON / ARRAY / STRING / NUMERIC-DATE-HASH / CROSS-TYPE),函数编号按代码中 `UDF-XX` 注释;§2 业务 UDF 保持占位;非 `@udf` 普通 `def`(18 个辅助 / 工具函数)不登记 | — |
 | 2026-04-21 | **聚簇 B.1 `__init__.py` 瘦身(修剪式,不拆 `core/`)**:`dw_base/__init__.py` 从 127 行 → 83 行。三处删除:(a) `import findspark` + `findspark.init()` —— 查证 3 条事实后安全删:findspark 全仓仅此 2 处引用;入口全走 `python3 xxx.py`(非 `spark-submit`),`SPARK_HOME` 从未被代码注入,findspark 在 CDH 节点上 `which spark-submit → readlink -f` 反推出 parcel `$SPARK_HOME` 把 `$SPARK_HOME/python` 前插进 sys.path,但 pip pyspark 2.4.0 和 parcel pyspark 2.4.0 同版本,业务表现零差异(见里程碑 `datax+spark-smoke-2026-04-20` 冒烟链路,HMS 真正入口是 `SPARK_CONF_DIR=/etc/spark/conf/hive-site.xml`,与 findspark 无关);(b) 删 21 个外部零引用的颜色常量 —— `CHG_BOLD` / `NORM_BLU` / `NORM_WHT` / 7×`BOLD_*` / 7×`BGRD_*`(if/else 两分支同步删),保留实际被引用的 6 个(`DO_RESET` / `NORM_RED` / `NORM_GRN` / `NORM_YEL` / `NORM_MGT` / `NORM_CYN`);(c) 删 `IS_RUN_BY_NORMAL_USER` 状态变量(两处赋值外部无引用,仅内部 `elif` 分支走到时为 `True`,无消费者)。**不拆 `core/*` 的理由**:findspark 去掉后"懒加载"诉求大半消失,拆分需改 11 处调用点 import,ROI 低;py/sh 颜色双份是运行时分家的必然(跨 runtime 单源化要加 subprocess 解析,得不偿失),真冗余只是 py 侧定义超过实际被用的部分。联动:`requirements.txt:3` 删 `findspark==2.0.1`;`tests/README.md:26` findspark 段改写为 HMS 入口说明;`kb/00 §1` `__init__.py` 行注释去 findspark;`kb/90 §三` 改写为"已完成 · 修剪式"并附未拆 `core/` 的理由;`kb/90 §7.1` KEEP 行去 findspark + 末尾 TODO 行改写为"已删除" | — |
+| 2026-04-22 | **勘误:移除 "SQL SET 资源类参数不生效" 的错误表述**:A.4 落地时误把 "`SparkSession.conf.set()` 对已启动 session 不改变资源" 这条 Spark 固有行为类推到"SQL 里的 SET"。实际 `spark_sql.py:query()` L433-440 对 SQL 内 `SET spark.*` 做预扫描,在 session 启动前塞进 `_final_spark_config`,`__init_spark_session` 通过 `builder.config()` 写入后才 `getOrCreate()`——**资源类 SET 同样生效**。清理 4 处错误:`dw_base/spark/spark_sql.py:155` 注释、`conf/spark-tuning.conf` L6-7 注意段、`kb/90 §2.3` "落地坑"段 + L2 行括号、本文 L74 基于错误前提的验证项 | — |
 | 2026-04-22 | **仓库改名 `tendata-warehouse-release` → `poyee-data-warehouse` 收尾**:项目根目录由用户手动改名完成;代码侧 `dw_base/utils/file_utils.py:9` + `dw_base/utils/hdfs_merge_small_file.py:7` 两处 `re.sub(r"tendata-warehouse.*", ...)` 字面量同步更新。`.idea/*.iml` / `modules.xml` / `workspace.xml` 因 `.idea` + `*.iml` 在 `.gitignore`,属本地 IDE 状态,不入库亦不影响运行(老 `tendata-warehouse-release.iml` + modules.xml / workspace.xml 里的 module name 残留不处理)。联动 kb/90 §1.1 L88 表格行打勾 + §2.3 末尾"与仓库改名的联动"段压缩为一行记录 | — |
 | 2026-04-21 | **聚簇 A.4 Spark 参数外配 + `spark_sql.py` 三级覆盖**:按业务调整频率拆两文件入库 —— `conf/spark-defaults.conf`(12 条底层行为/开关类,初始化后少改:`spark.sql.adaptive/broadcastTimeout/codegen/arrow*/files/statistics.*` + `spark.dynamicAllocation.enabled` + `spark.files.ignoreCorruptFiles` + `spark.debug.maxToStringFields` + `spark.port.maxRetries` + `hive.exec.orc.default.block.size`)+ `conf/spark-tuning.conf`(10 条资源/并行度/队列,业务早期常改:`spark.{driver,executor}.{memory,cores}` + `spark.executor.instances` + `spark.executor.memoryOverhead` + `spark.driver.maxResultSize` + `spark.default.parallelism` + `spark.sql.shuffle.partitions` + `spark.yarn.queue`)。`dw_base/spark/spark_sql.py` 改造:(a) 模块级新增 `_load_spark_conf_file(path)`,读 Spark 原生 `key value` 格式,支持 `#` 注释与空行,文件缺失返回 `{}` 容错单测;(b) `__init__` 10 个 tuning 相关构造参数默认值 `'2g' / 200 / ...` → `Optional[...] = None` sentinel,不破坏既有调用点显式传参;(c) `__init_spark_session` 原 22 条硬编码 `.config(...)` 链替换为三段:L1 先 `spark-defaults.conf` 后 `spark-tuning.conf`(相同 key tuning 覆盖 defaults)→ L2 `self._final_spark_config`(SQL 内 SET)→ L3 构造参数非 None 项 + `extra_spark_config`(L3 内 extra 覆盖 named),保持原"extra > SQL SET > named" 的向后兼容;日志分层打 `L1/L2/L3` 前缀便于排查。联动:`kb/90 §2.2` conf 结构加 `spark-tuning.conf` + `§2.3` 改写为两文件模型(去单文件草案)+ 删"坑 2"(B1 → A2 依赖边)+ 聚簇 L59 依赖边删 | — |