hive多脚本统一调度

这个方法适用于存在多个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 

 

你可能感兴趣的:(每天一点HIVE)