| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- #!/bin/bash
- #--------------------------------------------------------------------------------------------------
- #--------------------------------------------------------------------------------------------------
- set -e
- BASE_DIR=$(
- cd "$(dirname "$(realpath "$0")")/.." || exit
- pwd
- )
- . "${BASE_DIR}"/bin/common/init.sh
- function usage() {
- echo -e "${NORM_MGT}Usage: $0
- ${NORM_GRN}\t<-e[ /=]HQL语句> HQL语句,需要使用''包括sql语句
- ${NORM_CYN}\t[-dt[ /=]日期] %Y%m%d 或 yyyyMMdd 格式的日期(命令行 > 默认)
- ${NORM_CYN}\t 可以以四种形式传入日期:
- ${NORM_CYN}\t 1. 20211101,表示具体日期
- ${NORM_CYN}\t 2. 20211101-,表示20211101至昨天
- ${NORM_CYN}\t 3. 20211101-20211107,表示20211101至20211107
- ${NORM_CYN}\t 4. 20211101,20211103,表示离散的日期20211101、20211103
- ${NORM_CYN}\t[-c 参数名:参数值] Hive参数
- ${NORM_CYN}\t[-v 变量名:变量值] Hive变量
- ${DO_RESET}"
- echo -e "${NORM_MGT}Usage: $0
- ${NORM_GRN}\t<-f[ /=]HQL文件> HQL文件
- ${NORM_CYN}\t[-dt[ /=]日期] %Y%m%d 或 yyyyMMdd 格式的日期(命令行 > 默认)
- ${NORM_CYN}\t 可以以四种形式传入日期:
- ${NORM_CYN}\t 1. 20211101,表示具体日期
- ${NORM_CYN}\t 2. 20211101-,表示20211101至昨天
- ${NORM_CYN}\t 3. 20211101-20211107,表示20211101至20211107
- ${NORM_CYN}\t 4. 20211101,20211103,表示离散的日期20211101、20211103
- ${NORM_CYN}\t[-c 参数名:参数值] Hive参数
- ${NORM_CYN}\t[-v 变量名:变量值] Hive变量
- ${DO_RESET}"
- exit "$1"
- }
- function parse_args() {
- for index in $(seq 1 $#); do
- arg=${*:index:1}
- case $arg in
- -c)
- index=$((index + 1))
- HIVE_CONF+=("--hiveconf")
- HIVE_CONF+=("${*:index:1}")
- ;;
- -c=*)
- HIVE_CONF+=("--hiveconf")
- HIVE_CONF+=("${arg#*=}")
- ;;
- -dt)
- index=$((index + 1))
- if [ -z "${DT}" ]; then
- DT="${*:index:1}"
- fi
- ;;
- -dt=*)
- if [ -z "${DT}" ]; then
- DT="${arg#*=}"
- fi
- ;;
- -v)
- index=$((index + 1))
- # 例如:dt=20220101、dt:20220101
- KEY_VALUE="${*:index:1}"
- # 截取 dt
- KEY="${KEY_VALUE%%[:|=]*}"
- # 截取 20220101
- VALUE="${KEY_VALUE#*[:|=]}"
- if [ "${KEY}" = "dt" ]; then
- if [ -z "${DT}" ]; then
- DT="${VALUE}"
- fi
- else
- HIVE_GLOBAL_VAR+=("--hivevar")
- HIVE_GLOBAL_VAR+=("${KEY_VALUE}")
- fi
- ;;
- -v=*)
- KEY_VALUE="${arg#*=}"
- KEY="${KEY_VALUE%%[:|=]*}"
- VALUE="${KEY_VALUE#*[:|=]}"
- if [ "${KEY}" = "dt" ]; then
- if [ -z "${DT}" ]; then
- DT="${VALUE}"
- fi
- else
- HIVE_GLOBAL_VAR+=("--hivevar")
- HIVE_GLOBAL_VAR+=("${KEY_VALUE}")
- fi
- ;;
- -e)
- index=$((index + 1))
- HIVE_SQL="${*:index:1}"
- ;;
- -e=*)
- HIVE_SQL="${arg#*=}"
- ;;
- -f)
- index=$((index + 1))
- HIVE_FILE="${*:index:1}"
- ;;
- -f=*)
- HIVE_FILE="${arg#*=}"
- ;;
- -h | -H | --h | --H | --help)
- usage 0
- ;;
- *) ;;
- esac
- done
- pretty_print "${NORM_MGT}${0} 收到参数:${NORM_GRN}${*}"
- }
- function run_execute() {
- if [ -n "${HIVE_SQL}" ]; then
- pretty_print "${NORM_MGT}执行Shell命令 ${NORM_GRN}hive -e ${HIVE_SQL} ${HIVE_CONF[*]} ${HIVE_LOCAL_VAR[*]}"
- # 执行HQL语句
- hive -e "${HIVE_SQL}" "${HIVE_CONF[@]}" "${HIVE_LOCAL_VAR[@]}" 2>&1 | tee -a "${LOG_FULL_PATH}"
- exit "${PIPESTATUS[0]}"
- elif [ -n "${HIVE_FILE}" ]; then
- # 执行HQL文件
- pretty_print "${NORM_MGT}执行Shell命令 ${NORM_GRN}hive -f ${HIVE_FILE} ${HIVE_CONF[*]} ${HIVE_LOCAL_VAR[*]}"
- if [ "${USER}" == "${RELEASE_USER}" ]; then
- hive -f "/home/${USER}/release/tendata-warehouse/${HIVE_FILE}" "${HIVE_CONF[@]}" "${HIVE_LOCAL_VAR[@]}" 2>&1 | tee -a "${LOG_FULL_PATH}"
- else
- hive -f "/home/${USER}/tendata-warehouse/${HIVE_FILE}" "${HIVE_CONF[@]}" "${HIVE_LOCAL_VAR[@]}" 2>&1 | tee -a "${LOG_FULL_PATH}"
- fi
- EXIT_CODE="${PIPESTATUS[0]}"
- if [ "${EXIT_CODE}" -ne 0 ]; then
- if [[ "${HIVE_FILE}" =~ .*stg_es_mapping.sql ]]; then
- exit $((EXIT_CODE))
- fi
- if [[ "${HIVE_FILE}" =~ .*stage_es_mapping.sql ]]; then
- exit $((EXIT_CODE))
- fi
- # RELEASE_USER="dev005"
- if [ "${USER}" == "${RELEASE_USER}" ]; then
- DINGTALK_ALTER_KEY="4eb576296e66f49628447c8f2931c8892583f3283c96fef872577148aa5f88fa"
- MESSAGE="在 ${CURRENT_HOST} 上执行HQL文件 /home/${USER}/tendata-warehouse/${HIVE_FILE} 失败"
- "${BASE_DIR}"/bin/dingtalk-work-alert.sh -key="${DINGTALK_ALTER_KEY}" -msg="${MESSAGE}"
- else
- pretty_print "${NORM_MGT}执行HQL文件 ${NORM_GRN}${HIVE_FILE}${NORM_MGT} 失败"
- fi
- exit $((EXIT_CODE))
- fi
- else
- usage 1
- fi
- }
- function pretty_print() {
- # 设置文本颜色和格式
- NORM_GRN='\033[0;32m' # 绿色
- NORM_CYN='\033[0;36m' # 青色
- NORM_MGT='\033[0m' # 重置颜色和格式
- # 打印带颜色和格式的消息
- echo -e "${1}"
- }
- HIVE_CONF=()
- HIVE_GLOBAL_VAR=()
- HIVE_SQL=""
- HIVE_FILE=""
- parse_args "${@}"
- if [ -z "${DT}" ]; then
- DT=$(date -d '-1 day' +%Y%m%d)
- fi
- date_range "${DT}"
- for DT in "${DATE_RANGE[@]}"; do
- HIVE_LOCAL_VAR=("${HIVE_GLOBAL_VAR[@]}")
- HIVE_LOCAL_VAR+=("--hivevar")
- HIVE_LOCAL_VAR+=("dt=${DT}")
- LOG_DIR="${LOG_ROOT_DIR}/hive-exec/${DT}"
- if [ -n "${HIVE_SQL}" ]; then
- HIVE_FILE_SIMPLE_NAME=$(echo "${HIVE_SQL}" | base64)
- LOG_FILE_NAME="${HIVE_FILE_SIMPLE_NAME}.log"
- elif [ -n "${HIVE_FILE}" ]; then
- HIVE_FILE_SIMPLE_NAME=$(basename "${HIVE_FILE}" .sql)
- LOG_FILE_NAME="${HIVE_FILE_SIMPLE_NAME}.log"
- fi
- mkdir -p "${LOG_DIR}"
- LOG_FULL_PATH="${LOG_DIR}/${LOG_FILE_NAME}"
- pretty_print "${NORM_MGT}日志文件将写入 ${NORM_GRN}${LOG_FULL_PATH}${NORM_MGT}"
- run_execute
- done
|