Browse Source

chore(bin): 删 bin/common/ 整目录 + 2 个 datax sh 壳 + dw_base no-op cow_says

- 删 bin/datax-{hive-import,hdfs-export}-starter.sh(10 行 × 2)
- 删 bin/common/{init,functions,print-constants}.sh(168 行)
- dw_base/__init__.py 删 cow_says 函数(os.system source 到子 shell 后立即退出,no-op)+ L66 调用点
- tests/integration/datax/**/README.md 调用命令改 python3 bin/...py
- kb/94 #3 行:bash 薄壳 → 纯 Python 入口;§1.4 加 py print 彩色化 TODO
- kb/90 L441 从保留清单移除 cow_says()

dw_base/__init__.py bootstrap_env() 直接 source env.sh,无需 bash 壳;
publish.sh 对 bin/common/ 无实际调用(只 source 不 call),用户后续自改。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
tianyu.chu 1 tuần trước cách đây
mục cha
commit
d3b2239647

+ 0 - 63
bin/common/functions.sh

@@ -1,63 +0,0 @@
-#!/bin/bash
-FONT_COLOR=(31 32 33 34 35 36)
-function cow_says() {
-  font_index=$((RANDOM % ${#FONT_COLOR[@]}))
-  echo -en "\033[0;${FONT_COLOR[${font_index}]};5m"
-  echo -en "${DO_RESET}"
-}
-
-
-function pretty_print() {
-  echo -e "${NORM_CYN}$(date '+%Y-%m-%d %H:%M:%S') ${DO_RESET}${1}${DO_RESET}"
-}
-
-
-function date_range() {
-  dt=${1}
-  if [ "${#dt}" = 17 ] && [[ "${dt}" =~ [0-9]{8}-[0-9]{8} ]]; then
-    start_day=${dt:0:8}
-    end_day=${dt:9:16}
-  elif [ "${#dt}" = 9 ] && [[ "${dt}" =~ [0-9]{8}- ]]; then
-    start_day=${dt:0:8}
-    if [ "$(uname)" = "Linux" ]; then
-      end_day=$(date -d '-1 day' +%Y%m%d)
-    else
-      end_day=$(date -v-1d +%Y%m%d)
-    fi
-  elif [ "${#dt}" -ge 17 ] && [[ "${dt}" =~ [0-9]{8},[0-9]{8}[,[0-9]{8}]* ]]; then
-    DATE_RANGE=(${dt//,/ })
-    return
-  else
-    DATE_RANGE=("${dt}")
-    return
-  fi
-  DATE_RANGE=("${start_day}")
-  while [ "${start_day}" -lt "${end_day}" ]; do
-    if [ "$(uname)" = 'Linux' ]; then
-      start_day=$(date -d "1 day ${start_day}" +%Y%m%d)
-    else
-      start_day_ts=$(date -j -f %Y%m%d "${start_day}" +%s)
-      start_day_ts=$(("${start_day_ts}" + 86400))
-      start_day=$(date -r ${start_day_ts} +%Y%m%d)
-    fi
-    DATE_RANGE+=("${start_day}")
-  done
-}
-
-function waiting() {
-  while true; do
-    echo -en "\r\033[J请稍候."
-    sleep 0.5
-    echo -en "\r\033[J请稍候.."
-    sleep 0.5
-    echo -en "\r\033[J请稍候..."
-    sleep 0.5
-    echo -en "\r\033[J请稍候...."
-    sleep 0.5
-    echo -en "\r\033[J请稍候....."
-    sleep 0.5
-    echo -en "\r\033[J请稍候......"
-    sleep 0.5
-  done
-}
-

+ 0 - 80
bin/common/init.sh

@@ -1,80 +0,0 @@
-#!/bin/bash
-if [ -z "${BASE_DIR}" ]; then
-  BASE_DIR=$(
-    cd "$(dirname "$(realpath "$0")")/.." || exit
-    pwd
-  )
-fi
-. "${BASE_DIR}"/conf/env.sh
-. "${BASE_DIR}"/bin/common/functions.sh
-BANNED_USER="root"
-USER="$(whoami)"
-CURRENT_HOST=$(hostname -s)
-PROJECT_NAME=$(basename "${BASE_DIR}")
-
-# 从 conf/workers.ini 加载 RELEASE_HOST + DATAX_WORKERS + 权重 + 加权随机池
-declare -A DATAX_WORKERS_WEIGHTS
-DATAX_WORKERS=()
-_section=""
-while IFS= read -r _line; do
-  _line="${_line%%[;#]*}"
-  _line="$(echo -n "${_line}" | xargs)"
-  [[ -z "${_line}" ]] && continue
-  if [[ "${_line}" =~ ^\[(.+)\]$ ]]; then
-    _section="${BASH_REMATCH[1]}"
-    continue
-  fi
-  case "${_section}" in
-    release)
-      if [[ "${_line}" =~ ^host[[:space:]]*=[[:space:]]*(.+)$ ]]; then
-        RELEASE_HOST="${BASH_REMATCH[1]}"
-      fi
-      ;;
-    weights)
-      if [[ "${_line}" =~ ^([^[:space:]=]+)[[:space:]]*=[[:space:]]*([0-9]+)$ ]]; then
-        DATAX_WORKERS+=("${BASH_REMATCH[1]}")
-        DATAX_WORKERS_WEIGHTS["${BASH_REMATCH[1]}"]="${BASH_REMATCH[2]}"
-      fi
-      ;;
-  esac
-done < "${BASE_DIR}/conf/workers.ini"
-
-DATAX_WORKERS_QUEUE=()
-for _key in "${!DATAX_WORKERS_WEIGHTS[@]}"; do
-  for ((_i = 0; _i < DATAX_WORKERS_WEIGHTS[$_key]; _i++)); do
-    DATAX_WORKERS_QUEUE+=("${_key}")
-  done
-done
-unset _section _line _key _i
-if [ "${USER}" == "${BANNED_USER}" ]; then
-  pretty_print "${NORM_RED}Project ${NORM_GRN}${PROJECT_NAME}${NORM_RED} is running by banned user ${NORM_GRN}${BANNED_USER}${NORM_RED}, exit with error code ${NORM_GRN}18"
-  exit 18
-elif [ "${USER}" == "${RELEASE_USER}" ]; then
-  IS_RUN_BY_RELEASE_USER="1"
-  pretty_print "${NORM_MGT}Project ${NORM_GRN}${PROJECT_NAME}${NORM_MGT} is running by release user ${NORM_GRN}${RELEASE_USER}"
-else
-  IS_RUN_BY_NORMAL_USER="1"
-  . "${BASE_DIR}"/bin/common/print-constants.sh
-  if [ "${CURRENT_HOST}" == "${RELEASE_HOST}" ] && [ -n "${IS_RUN_BY_NORMAL_USER}" ]; then
-    cow_says
-  fi
-  pretty_print "${NORM_MGT}Project ${NORM_GRN}${PROJECT_NAME}${NORM_MGT} is running by normal user ${NORM_GRN}${USER}"
-fi
-if [[ "${BASE_DIR}" =~ "${RELEASE_ROOT_DIR}/${PROJECT_NAME}/"* ]]; then
-  IS_RUN_IN_RELEASE_DIR="1"
-  pretty_print "${NORM_MGT}Project ${NORM_GRN}${PROJECT_NAME}${NORM_MGT} is running in release dir ${NORM_GRN}${RELEASE_ROOT_DIR}/${PROJECT_NAME}"
-else
-  pretty_print "${NORM_MGT}Project ${NORM_GRN}${PROJECT_NAME}${NORM_MGT} is running in normal user dir ${NORM_GRN}${BASE_DIR}"
-fi
-
-export CURRENT_HOST
-export DATAX_WORKERS
-export BA_LITTLE_CUTE
-export DCP_LITTLE_CUTE
-export ETL_LITTLE_CUTE
-export SKB_LITTLE_CUTE
-export REALTIME_LITTLE_CUTE
-export IS_RUN_IN_RELEASE_DIR
-export IS_RUN_BY_RELEASE_USER
-echo -en "${NORM_GRN}"
-echo -en "${DO_RESET}"

+ 0 - 25
bin/common/print-constants.sh

@@ -1,25 +0,0 @@
-#!/bin/bash
-DO_RESET="\033[0m"
-CHG_BOLD="\033[1m"
-TO_BLINK="\033[5m"
-NORM_RED="\033[0;31m"
-NORM_GRN="\033[0;32m"
-NORM_YEL="\033[0;33m"
-NORM_BLU="\033[0;34m"
-NORM_MGT="\033[0;35m"
-NORM_CYN="\033[0;36m"
-NORM_WHT="\033[0;37m"
-BOLD_RED="\033[1;31m"
-BOLD_GRN="\033[1;32m"
-BOLD_YEL="\033[1;33m"
-BOLD_BLU="\033[1;34m"
-BOLD_MGT="\033[1;35m"
-BOLD_CYN="\033[1;36m"
-BOLD_WHT="\033[1;37m"
-BGRD_RED="\033[41m"
-BGRD_GRN="\033[42m"
-BGRD_YEL="\033[43m"
-BGRD_BLU="\033[44m"
-BGRD_MGT="\033[45m"
-BGRD_CYN="\033[46m"
-BGRD_WHT="\033[47m"

+ 0 - 10
bin/datax-hdfs-export-starter.sh

@@ -1,10 +0,0 @@
-#!/bin/bash
-# DataX hdfs-export 入口 bash 壳:初始化 env(含 workers.ini 展开)后 exec 到 Python 主入口。
-# 参数集见 bin/datax-hdfs-export-starter.py。
-CURRENT_DIR=$(pwd)
-BASE_DIR=$(
-  cd "$(dirname "$(realpath "$0")")/.." || exit
-  pwd
-)
-. "${BASE_DIR}"/bin/common/init.sh
-exec "${PYTHON3_PATH}" -u "${BASE_DIR}"/bin/datax-hdfs-export-starter.py "$@"

+ 0 - 10
bin/datax-hive-import-starter.sh

@@ -1,10 +0,0 @@
-#!/bin/bash
-# DataX hive-import 入口 bash 壳:初始化 env(含 workers.ini 展开)后 exec 到 Python 主入口。
-# 参数集见 bin/datax-hive-import-starter.py。
-CURRENT_DIR=$(pwd)
-BASE_DIR=$(
-  cd "$(dirname "$(realpath "$0")")/.." || exit
-  pwd
-)
-. "${BASE_DIR}"/bin/common/init.sh
-exec "${PYTHON3_PATH}" -u "${BASE_DIR}"/bin/datax-hive-import-starter.py "$@"

+ 0 - 5
dw_base/__init__.py

@@ -11,10 +11,6 @@ from dw_base.utils.env_loader import bootstrap_env
 bootstrap_env()
 
 
-def cow_says():
-    os.system(f'source {PROJECT_ROOT_PATH}/bin/common/functions.sh')
-
-
 # HADOOP_CONF_DIR:spark-submit 启动 YARN 校验需要;DataX JVM 不读 classpath conf,HA 由 ini [hadoop_config] 节显式注入
 os.environ['HADOOP_CONF_DIR'] = '/etc/hadoop/conf'
 # SPARK_CONF_DIR:pip pyspark 默认指向自身空 conf/,显式指到集群配置才能加载 hive-site.xml,否则 enableHiveSupport 回落 in-memory metastore
@@ -63,7 +59,6 @@ elif USER == BANNED_USER:
           f'{DO_RESET}')
     exit(ERROR_CODE)
 else:
-    cow_says()
     print(f'{NORM_CYN}{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} '
           f'{NORM_MGT}Project {NORM_GRN}{PROJECT_NAME} '
           f'{NORM_MGT}is running in normal user {NORM_GRN}{USER}')

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

@@ -438,7 +438,9 @@ record_per_channel = 100000
 
 **未拆分为 `core/env.py` / `core/colors.py` / `core/spark_env.py` 的理由**:findspark 删除后"findspark 按需 import"的懒加载诉求大半消失;剩余颜色/env 检测拆三文件需改 11 处调用点 import,收益比修剪方案差,暂不做。若后续单元测试对 "import dw_base 零副作用" 有刚性需求再拆。
 
-**最终 `__init__.py` 保留**:`PROJECT_ROOT_PATH` / `PROJECT_NAME` / `bootstrap_env()` / `sys.path.append` / `HADOOP_CONF_DIR` / `SPARK_CONF_DIR` / `PYSPARK_*` / `COMMON_SPARK_UDF_FILE` / `BANNED_USER` 退出守卫 / `IS_RUN_BY_RELEASE_USER` / `IS_RUN_IN_RELEASE_DIR` / 启动 print / `cow_says()` / 6 个实际被引用的颜色常量(`DO_RESET` / `NORM_RED` / `NORM_GRN` / `NORM_YEL` / `NORM_MGT` / `NORM_CYN`)。
+**最终 `__init__.py` 保留**:`PROJECT_ROOT_PATH` / `PROJECT_NAME` / `bootstrap_env()` / `sys.path.append` / `HADOOP_CONF_DIR` / `SPARK_CONF_DIR` / `PYSPARK_*` / `COMMON_SPARK_UDF_FILE` / `BANNED_USER` 退出守卫 / `IS_RUN_BY_RELEASE_USER` / `IS_RUN_IN_RELEASE_DIR` / 启动 print / 6 个实际被引用的颜色常量(`DO_RESET` / `NORM_RED` / `NORM_GRN` / `NORM_YEL` / `NORM_MGT` / `NORM_CYN`)。
+
+**2026-04-24 追加清理**:`cow_says()` 函数(os.system source bin/common/functions.sh)已删——bin 层 bash 壳整体清理时确认其为 no-op(子 shell source 后立即退出,无任何可见效果)。
 
 ## 四、代码风格修正(中优先级) [聚簇 B(B3)]
 

+ 4 - 3
kb/94-重构对比.md

@@ -9,9 +9,9 @@
 
 | # | 维度 | 老入口 | 新入口 |
 |---|---|---|---|
-| 1 | 入口文件数 | 5 `.sh` + 3 `.py` 调试壳 + 1 `config-generator.py` = 9(不含独立保留的 `gc-generator.py`)| 2 对 `.sh` + `.py` + `cli.py` = 5 |
-| 2 | 入口组织 | 三层堆叠:`multiple-hive` → `multiple` → `single` | 门面模式:`datax-hive-import-starter` / `datax-hdfs-export-starter` 两条独立入口 |
-| 3 | 核心语言 | bash 脚本为主,Python 做 ini→json 翻译 | Python 为主,bash 薄壳(≤ 10 行)仅 env 引导 |
+| 1 | 入口文件数 | 5 `.sh` + 3 `.py` 调试壳 + 1 `config-generator.py` = 9(不含独立保留的 `gc-generator.py`)| 2 `.py` + `cli.py` = 3(bin 层已无 .sh 壳) |
+| 2 | 入口组织 | 三层堆叠:`multiple-hive` → `multiple` → `single` | 门面模式:`datax-hive-import-starter.py` / `datax-hdfs-export-starter.py` 两条独立入口 |
+| 3 | 核心语言 | bash 脚本为主,Python 做 ini→json 翻译 | 纯 Python 入口;env 由 `dw_base/__init__.py` 的 `bootstrap_env()` 从 conf/env.sh 注入(单源,Python/Bash 不双解析) |
 | 4 | 参数形态 | `-c/-cd/-gc/-gcd/-jc/-jcd` 6 种输入 + `--override` + 脚本内 5 个硬编码数组 | `-ini <file>` / `-inis <dir>` 两种输入 + 8 个选项 |
 | 5 | 能力边界 | json 路径暴露给调用方(`-c` / `-jc`),用户可能手动管 json | json 是内部中间产物,`conf/datax-json/{job_name}.json` 扁平化,调用方不感知 |
 | 6 | 核心抽象 | shell for 循环 + 函数 | Python 分层:`entry`(门面)→ `batch`(调度)→ `runner`(执行)+ `worker` / `partition` / `path_utils` / `mask` / `cli` 旁支 |
@@ -57,6 +57,7 @@
 - kb/93 ADR-02 草案(分布式归 DS worker group)正式拍板后,`worker.py` / `runner.py` 里 ssh 远端分发逻辑可砍
 - kb/93 ADR-03 草案(零点漂移决策)实施时迁 kb/12
 - kb/90 §2.6 后延 ADR 低优先级三项(日期范围展开 / plugin_factory 解耦 / 日志颜色恢复可能也要补)
+- **Python 入口 / runner 阶段 print 彩色化(低优先级)**:当前 entry.py / runner.py 的 `[datax] ...` print 为单色文本,可用 `colorama`(Windows/Unix 跨平台)或手写 ANSI escape helper 给不同阶段标色(worker 选中=紫 / gen=绿 / exec=绿 / 失败=红)。独立于 dw_base/__init__.py banner 彩色(那套自带);此处补的是运行时 log 彩色
 
 ---
 

+ 1 - 1
tests/integration/datax/hdfs_export/README.md

@@ -17,7 +17,7 @@
 2. 跑 DataX:
 
     ```bash
-    bin/datax-hdfs-export-starter.sh \
+    python3 bin/datax-hdfs-export-starter.py \
       -ini tests/integration/datax/hdfs_export/export_user_cert_info.ini \
       -start-date 20260422 -stop-date 20260423 \
       -random

+ 2 - 2
tests/integration/datax/hive_import/README.md

@@ -4,7 +4,7 @@
 
 ## 前置条件
 
-- bigdata 用户、发布目录下执行(`-random` 生效的必要条件,见 `bin/common/init.sh` worker 选择逻辑
+- bigdata 用户、发布目录下执行(`-random` 生效的必要条件,见 `dw_base/datax/worker.py` select_worker 三连回退规则
 - `datasource/postgresql/dev-poyee-xiaoxu.ini` 由运维维护(真实 PG 连接)
 - Hive `test` 数据库已存在
 - 项目代码 + `datasource/` + `/opt/datax` 同步到 cdhmaster02 / cdhnode01 / cdhnode02 / cdhnode03
@@ -16,7 +16,7 @@
 2. 跑 DataX(新入口 `datax-hive-import-starter`):
 
     ```bash
-    bin/datax-hive-import-starter.sh \
+    python3 bin/datax-hive-import-starter.py \
       -ini tests/integration/datax/hive_import/app_user_cert_info.ini \
       -start-date <昨日 yyyymmdd> -stop-date <今日 yyyymmdd> \
       -random