这个方法适用于存在多个hql脚本,想要统一调度,或者多个hql存在依赖关系的场景
逻辑简述:
四类文件
1、pkg.sh文件(1个pkg.sh文件),用来调度rpt.sh文件,在linux crontab -e 调度中添加这个文件,用于调度
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文件是否已执行
currPath=/OPT/SHELL/CODE/cc
day_of_the_month=`date +%d`
inc_y_m_d=`date -d "1 day ago ${log_day}" +%Y-%m-%d`
inc_y_m_2d=`date -d "2 day ago ${log_day}" +%Y-%m-%d`
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`上月月末
depend_name=${log}/${log_table}_${log_day}.txt
if [ -f ${depend_name} ]; then
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} &
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}&
rpt.sh文件
- 用于调度hql.q文件
- 如果需要将hive执行后的结果导出到mysql、orcal、es也写在这个文件里(另一个sh导出文件)
- .q文件之间的依赖关系
- .q文件执行成功后生成执行成功log文件
currPath=/OPT/SHELL/CODE/cc
data_date=`date -d "1 day ago ${log_day}" +%Y-%m-%d`
q_depend1=${log}/${qdep_table}_${log_day}.txt
z_depend1=${log}/${zdep_table}_${log_day}.txt
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
echo ''>>${log}/${scr_name}_day_${log_day}.txt
scr_name1=rpt_2mysql_${scr_name}_day.sh
sh ${currPath}/${scr_name1}
导出.sh文件
- 源表、目标表、导出列
- 用于将hive处理后的数据导出
source /OPT/SHELL/CODE/public_to_new_mysql.cfg
inc_day=`date -d "1 day ago ${log_day}" +%Y-%m-%d`
log_tab=rpt_2mysql_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
echo '数据导出完毕' > ${log}/${log_tab}${log_day}.txt
---------------------本文来自 lili_wuwu 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/lili_wuwu/article/details/82968341?utm_source=copy