hive-exec.sh 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. #!/bin/bash
  2. #--------------------------------------------------------------------------------------------------
  3. #--------------------------------------------------------------------------------------------------
  4. set -e
  5. BASE_DIR=$(
  6. cd "$(dirname "$(realpath "$0")")/.." || exit
  7. pwd
  8. )
  9. . "${BASE_DIR}"/bin/common/init.sh
  10. function usage() {
  11. echo -e "${NORM_MGT}Usage: $0
  12. ${NORM_GRN}\t<-e[ /=]HQL语句> HQL语句,需要使用''包括sql语句
  13. ${NORM_CYN}\t[-dt[ /=]日期] %Y%m%d 或 yyyyMMdd 格式的日期(命令行 > 默认)
  14. ${NORM_CYN}\t 可以以四种形式传入日期:
  15. ${NORM_CYN}\t 1. 20211101,表示具体日期
  16. ${NORM_CYN}\t 2. 20211101-,表示20211101至昨天
  17. ${NORM_CYN}\t 3. 20211101-20211107,表示20211101至20211107
  18. ${NORM_CYN}\t 4. 20211101,20211103,表示离散的日期20211101、20211103
  19. ${NORM_CYN}\t[-c 参数名:参数值] Hive参数
  20. ${NORM_CYN}\t[-v 变量名:变量值] Hive变量
  21. ${DO_RESET}"
  22. echo -e "${NORM_MGT}Usage: $0
  23. ${NORM_GRN}\t<-f[ /=]HQL文件> HQL文件
  24. ${NORM_CYN}\t[-dt[ /=]日期] %Y%m%d 或 yyyyMMdd 格式的日期(命令行 > 默认)
  25. ${NORM_CYN}\t 可以以四种形式传入日期:
  26. ${NORM_CYN}\t 1. 20211101,表示具体日期
  27. ${NORM_CYN}\t 2. 20211101-,表示20211101至昨天
  28. ${NORM_CYN}\t 3. 20211101-20211107,表示20211101至20211107
  29. ${NORM_CYN}\t 4. 20211101,20211103,表示离散的日期20211101、20211103
  30. ${NORM_CYN}\t[-c 参数名:参数值] Hive参数
  31. ${NORM_CYN}\t[-v 变量名:变量值] Hive变量
  32. ${DO_RESET}"
  33. exit "$1"
  34. }
  35. function parse_args() {
  36. for index in $(seq 1 $#); do
  37. arg=${*:index:1}
  38. case $arg in
  39. -c)
  40. index=$((index + 1))
  41. HIVE_CONF+=("--hiveconf")
  42. HIVE_CONF+=("${*:index:1}")
  43. ;;
  44. -c=*)
  45. HIVE_CONF+=("--hiveconf")
  46. HIVE_CONF+=("${arg#*=}")
  47. ;;
  48. -dt)
  49. index=$((index + 1))
  50. if [ -z "${DT}" ]; then
  51. DT="${*:index:1}"
  52. fi
  53. ;;
  54. -dt=*)
  55. if [ -z "${DT}" ]; then
  56. DT="${arg#*=}"
  57. fi
  58. ;;
  59. -v)
  60. index=$((index + 1))
  61. # 例如:dt=20220101、dt:20220101
  62. KEY_VALUE="${*:index:1}"
  63. # 截取 dt
  64. KEY="${KEY_VALUE%%[:|=]*}"
  65. # 截取 20220101
  66. VALUE="${KEY_VALUE#*[:|=]}"
  67. if [ "${KEY}" = "dt" ]; then
  68. if [ -z "${DT}" ]; then
  69. DT="${VALUE}"
  70. fi
  71. else
  72. HIVE_GLOBAL_VAR+=("--hivevar")
  73. HIVE_GLOBAL_VAR+=("${KEY_VALUE}")
  74. fi
  75. ;;
  76. -v=*)
  77. KEY_VALUE="${arg#*=}"
  78. KEY="${KEY_VALUE%%[:|=]*}"
  79. VALUE="${KEY_VALUE#*[:|=]}"
  80. if [ "${KEY}" = "dt" ]; then
  81. if [ -z "${DT}" ]; then
  82. DT="${VALUE}"
  83. fi
  84. else
  85. HIVE_GLOBAL_VAR+=("--hivevar")
  86. HIVE_GLOBAL_VAR+=("${KEY_VALUE}")
  87. fi
  88. ;;
  89. -e)
  90. index=$((index + 1))
  91. HIVE_SQL="${*:index:1}"
  92. ;;
  93. -e=*)
  94. HIVE_SQL="${arg#*=}"
  95. ;;
  96. -f)
  97. index=$((index + 1))
  98. HIVE_FILE="${*:index:1}"
  99. ;;
  100. -f=*)
  101. HIVE_FILE="${arg#*=}"
  102. ;;
  103. -h | -H | --h | --H | --help)
  104. usage 0
  105. ;;
  106. *) ;;
  107. esac
  108. done
  109. pretty_print "${NORM_MGT}${0} 收到参数:${NORM_GRN}${*}"
  110. }
  111. function run_execute() {
  112. if [ -n "${HIVE_SQL}" ]; then
  113. pretty_print "${NORM_MGT}执行Shell命令 ${NORM_GRN}hive -e ${HIVE_SQL} ${HIVE_CONF[*]} ${HIVE_LOCAL_VAR[*]}"
  114. # 执行HQL语句
  115. hive -e "${HIVE_SQL}" "${HIVE_CONF[@]}" "${HIVE_LOCAL_VAR[@]}" 2>&1 | tee -a "${LOG_FULL_PATH}"
  116. exit "${PIPESTATUS[0]}"
  117. elif [ -n "${HIVE_FILE}" ]; then
  118. # 执行HQL文件
  119. pretty_print "${NORM_MGT}执行Shell命令 ${NORM_GRN}hive -f ${HIVE_FILE} ${HIVE_CONF[*]} ${HIVE_LOCAL_VAR[*]}"
  120. if [ "${USER}" == "${RELEASE_USER}" ]; then
  121. hive -f "/home/${USER}/release/tendata-warehouse/${HIVE_FILE}" "${HIVE_CONF[@]}" "${HIVE_LOCAL_VAR[@]}" 2>&1 | tee -a "${LOG_FULL_PATH}"
  122. else
  123. hive -f "/home/${USER}/tendata-warehouse/${HIVE_FILE}" "${HIVE_CONF[@]}" "${HIVE_LOCAL_VAR[@]}" 2>&1 | tee -a "${LOG_FULL_PATH}"
  124. fi
  125. EXIT_CODE="${PIPESTATUS[0]}"
  126. if [ "${EXIT_CODE}" -ne 0 ]; then
  127. if [[ "${HIVE_FILE}" =~ .*stg_es_mapping.sql ]]; then
  128. exit $((EXIT_CODE))
  129. fi
  130. if [[ "${HIVE_FILE}" =~ .*stage_es_mapping.sql ]]; then
  131. exit $((EXIT_CODE))
  132. fi
  133. # RELEASE_USER="dev005"
  134. if [ "${USER}" == "${RELEASE_USER}" ]; then
  135. DINGTALK_ALTER_KEY="4eb576296e66f49628447c8f2931c8892583f3283c96fef872577148aa5f88fa"
  136. MESSAGE="在 ${CURRENT_HOST} 上执行HQL文件 /home/${USER}/tendata-warehouse/${HIVE_FILE} 失败"
  137. "${BASE_DIR}"/bin/dingtalk-work-alert.sh -key="${DINGTALK_ALTER_KEY}" -msg="${MESSAGE}"
  138. else
  139. pretty_print "${NORM_MGT}执行HQL文件 ${NORM_GRN}${HIVE_FILE}${NORM_MGT} 失败"
  140. fi
  141. exit $((EXIT_CODE))
  142. fi
  143. else
  144. usage 1
  145. fi
  146. }
  147. function pretty_print() {
  148. # 设置文本颜色和格式
  149. NORM_GRN='\033[0;32m' # 绿色
  150. NORM_CYN='\033[0;36m' # 青色
  151. NORM_MGT='\033[0m' # 重置颜色和格式
  152. # 打印带颜色和格式的消息
  153. echo -e "${1}"
  154. }
  155. HIVE_CONF=()
  156. HIVE_GLOBAL_VAR=()
  157. HIVE_SQL=""
  158. HIVE_FILE=""
  159. parse_args "${@}"
  160. if [ -z "${DT}" ]; then
  161. DT=$(date -d '-1 day' +%Y%m%d)
  162. fi
  163. date_range "${DT}"
  164. for DT in "${DATE_RANGE[@]}"; do
  165. HIVE_LOCAL_VAR=("${HIVE_GLOBAL_VAR[@]}")
  166. HIVE_LOCAL_VAR+=("--hivevar")
  167. HIVE_LOCAL_VAR+=("dt=${DT}")
  168. LOG_DIR="${LOG_ROOT_DIR}/hive-exec/${DT}"
  169. if [ -n "${HIVE_SQL}" ]; then
  170. HIVE_FILE_SIMPLE_NAME=$(echo "${HIVE_SQL}" | base64)
  171. LOG_FILE_NAME="${HIVE_FILE_SIMPLE_NAME}.log"
  172. elif [ -n "${HIVE_FILE}" ]; then
  173. HIVE_FILE_SIMPLE_NAME=$(basename "${HIVE_FILE}" .sql)
  174. LOG_FILE_NAME="${HIVE_FILE_SIMPLE_NAME}.log"
  175. fi
  176. mkdir -p "${LOG_DIR}"
  177. LOG_FULL_PATH="${LOG_DIR}/${LOG_FILE_NAME}"
  178. pretty_print "${NORM_MGT}日志文件将写入 ${NORM_GRN}${LOG_FULL_PATH}${NORM_MGT}"
  179. run_execute
  180. done