这个方法适用于存在多个hql脚本,想要统一调度,或者多个hql存在依赖关系的场景
逻辑简述:
四类文件
1、pkg.sh文件(1个pkg.sh文件),用来调度rpt.sh文件,在linux crontab -e 调度中添加这个文件,用于调度
- 可同时调度多个rpt.sh文件
2、rpt.sh文件(n个rpt.sh文件),用来调度.q文件,并在.q文件执行成功后,自动生成执行log文件
- .q文件存在依赖关系的场景,判断rpt.sh文件是否生成log文件来决定是否继续执行;
3、q文件(n个.q文件),即hql文件,用于数据清洗文件
4、导出文件,如果需要将hive处理后的结果导出到其他数据库(mysql、orcal)或者写入ES,则需要再写一个导出.sh文件
文件内容简述:
pkg.sh文件
- 在crontab -e 调度添加的是这个文件,在多脚本的情况下便于管理,也避免脚本过多时遗漏的问题
- 通过判断rpt.sh执行成功log是否存在,在确定rpt.sh文件是否已执行
#!/bin/bash
source /etc/profile
log=/LOG/SHELL/CODE
currPath=/OPT/SHELL/CODE/cc
###################################################
##起始时间变量
#变量根据自己的需要添加
###################################################
day_week=`date +%w` #用于判断星期几 %w 星期一 为1 星期二 为2
day_of_the_month=`date +%d`
log_day=`date +%Y-%m-%d`
inc_y_m_d=`date -d "1 day ago ${log_day}" +%Y-%m-%d` #1天前
inc_y_m_2d=`date -d "2 day ago ${log_day}" +%Y-%m-%d` #2天前
#取上月月初和上上月月末
last_month_y_m_01=`date -d "${log_day} 1 month ago" +%Y-%m-01` #上月 月初
last_month_y_m_end=`date -d "${last_month_y_m_01} 1 month 1 day ago" +%Y-%m-%d`上月月末
###################################################
##从这里开始 是多脚本执行逻辑
##这里举得例子是 同时调度日报 周报 月报
###################################################
log_table=rpt_name
depend_name=${log}/${log_table}_${log_day}.txt
scr_name=rpt_name
while [ 1 ]
do
if [ -f ${depend_name} ]; then
#每天跑一次 日报和周报
###################################################
#说明:
#第三个变量的作用,当.q文件不存在依赖关系的时候,逻辑相同只是时间区间不同,用来区分表名的例如周\日、月报表表名,1表示日报,7表示周报,在.q文件中可以写成insert overwrite table tmp_tablename_${day_type}day_tmp1就不用拆成三个.q文件,可以写成一个.q文件
###################################################
sh ${currPath}/${scr_name}_day.sh ${inc_y_m_d} ${inc_y_m_d} 1 ${scr_name}_day ${inc_y_m_d} 0 0 0 0 &
sh ${currPath}/${scr_name}_model.sh ${inc_y_m_14d} ${inc_y_m_d} 7 ${scr_name}_7day ${last_7day} &
sh ${currPath}/${scr_name}_model.sh ${inc_y_m_60d} ${inc_y_m_d} 30 ${scr_name}_30day ${last_30day} &
#每周一执行
if [ ${day_week} -eq 1 ]; then
sh ${currPath}/${scr_name}_model.sh ${before_after_week1} ${after_week7} 14 ${scr_name}_14day ${last_week_num} &
fi
#每月1号执行
if [ ${day_of_the_month} -eq 01 ]; then
sh ${currPath}/${scr_name}_model.sh ${before_last_month_y_m_01} ${last_month_y_m_31} 60 ${scr_name}_60day ${last_month_y_m}&
fi
break
else
echo 'no depend'
sleep 60
continue
fi
done
rpt.sh文件
- 用于调度hql.q文件
- 如果需要将hive执行后的结果导出到mysql、orcal、es也写在这个文件里(另一个sh导出文件)
- .q文件之间的依赖关系
- .q文件执行成功后生成执行成功log文件
#! /bin/bash
source /etc/profile
log=/LOG/SHELL/CODE
currPath=/OPT/SHELL/CODE/cc
#起始时间变量
log_day=`date +%Y-%m-%d`
data_date=`date -d "1 day ago ${log_day}" +%Y-%m-%d` #1天前
qdep_table=rpt_q_day
zdep_table=rpt_z_day
q_depend1=${log}/${qdep_table}_${log_day}.txt
z_depend1=${log}/${zdep_table}_${log_day}.txt
scr_name=rpt_qz
################################################
#scr_name.q文件要在q和z文件执行成功后执行
################################################
if [ -f ${q_depend1} -a -f ${z_depend1} ]; then
hive -hivevar data_date=${data_date} -f ${currPath}/&{scr_name}_day.q --verbose >>${log}/${scr_name}_${log_day}.log 2>&1
if [ $? -eq 0 ];then
echo ''>>${log}/${scr_name}_day_${log_day}.txt
fi
fi
################################################
#scr_name.q文件执行成功后将数据导出到mysql数据库
#调用导出sh文件
################################################
scr_name1=rpt_2mysql_${scr_name}_day.sh
if [ $? -eq 0 ]
then
sh ${currPath}/${scr_name1}
导出.sh文件
- 源表、目标表、导出列
- 用于将hive处理后的数据导出
#!/bin/bash
source /etc/profile
source /OPT/SHELL/CODE/public_to_new_mysql.cfg #导出文件包 包含用户名库名等
run_data_date=$1
log_day=`date +%Y-%m-%d`
inc_day=`date -d "1 day ago ${log_day}" +%Y-%m-%d` #1天前
log=/LOG/SHELL/CODE
target_dir=/RESULT/CODE
src_tab=RPT_TABLE_DAY
log_tab=rpt_2mysql_rpt_table_day
desc_tab=RPT_TABLE_DAY
columns=DATA_DATE,COMPANY_CODE,WAREHOUSE_CODE,WAREHOUSE_NAME,INDUSTRY_TYPE,Q_SKU_NUM,Q_RATE
sqoop eval -D mapred.queue.name=wlh -D mapred.job.queue.name=wlh --connect jdbc:mysql://${MysqlHost}:${MysqlPort}/${MysqlDB}?characterEncoding=UTF-8 --username ${MysqlUser} --password ${MysqlPwd} -e "truncate table ${desc_tab}" --verbose >>${log}/${log_tab}${log_day}.log 2>&1
sqoop export -D mapred.queue.name=wlh -D mapred.job.queue.name=wlh --connect jdbc:mysql://${MysqlHost}:${MysqlPort}/${MysqlDB}?characterEncoding=UTF-8 --username ${MysqlUser} --password ${MysqlPwd} --table ${desc_tab} --export-dir ${target_dir}/${src_tab}/pt_date=${inc_day} --columns ${columns} --fields-terminated-by '\001' --input-null-string '\\N' --input-null-non-string '\\N' -m 1 --verbose >>${log}/${log_tab}${log_day}.log 2>&1
if [ $? -eq 0 ]
then
echo '数据导出完毕' > ${log}/${log_tab}${log_day}.txt
fi