#!/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