hive 调度

浏览: 2904

这个方法适用于存在多个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文件是否已执行
  1. #!/bin/bash
  2. source /etc/profile
  3. log=/LOG/SHELL/CODE
  4. currPath=/OPT/SHELL/CODE/cc
  5. ###################################################
  6. ##起始时间变量
  7. #变量根据自己的需要添加
  8. ###################################################
  9. day_week=`date +%w` #用于判断星期几 %w 星期一 为1 星期二 为2
  10. day_of_the_month=`date +%d`
  11. log_day=`date +%Y-%m-%d`
  12. inc_y_m_d=`date -d "1 day ago ${log_day}" +%Y-%m-%d` #1天前
  13. inc_y_m_2d=`date -d "2 day ago ${log_day}" +%Y-%m-%d` #2天前
  14. #取上月月初和上上月月末
  15. last_month_y_m_01=`date -d "${log_day} 1 month ago" +%Y-%m-01` #上月 月初
  16. last_month_y_m_end=`date -d "${last_month_y_m_01} 1 month 1 day ago" +%Y-%m-%d`上月月末
  17. ###################################################
  18. ##从这里开始 是多脚本执行逻辑
  19. ##这里举得例子是 同时调度日报 周报 月报
  20. ###################################################
  21. log_table=rpt_name
  22. depend_name=${log}/${log_table}_${log_day}.txt
  23. scr_name=rpt_name
  24. while [ 1 ]
  25. do
  26. if [ -f ${depend_name} ]; then
  27. #每天跑一次 日报和周报
  28. ###################################################
  29. #说明:
  30. #第三个变量的作用,当.q文件不存在依赖关系的时候,逻辑相同只是时间区间不同,用来区分表名的例如周\日、月报表表名,1表示日报,7表示周报,在.q文件中可以写成insert overwrite table tmp_tablename_${day_type}day_tmp1就不用拆成三个.q文件,可以写成一个.q文件
  31. ###################################################
  32. 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 &
  33. sh ${currPath}/${scr_name}_model.sh ${inc_y_m_14d} ${inc_y_m_d} 7 ${scr_name}_7day ${last_7day} &
  34. sh ${currPath}/${scr_name}_model.sh ${inc_y_m_60d} ${inc_y_m_d} 30 ${scr_name}_30day ${last_30day} &
  35. #每周一执行
  36. if [ ${day_week} -eq 1 ]; then
  37. sh ${currPath}/${scr_name}_model.sh ${before_after_week1} ${after_week7} 14 ${scr_name}_14day ${last_week_num} &
  38. fi
  39. #每月1号执行
  40. if [ ${day_of_the_month} -eq 01 ]; then
  41. 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}&
  42. fi
  43. break
  44. else
  45. echo 'no depend'
  46. sleep 60
  47. continue
  48. fi
  49. done

 rpt.sh文件

  • 用于调度hql.q文件
  • 如果需要将hive执行后的结果导出到mysql、orcal、es也写在这个文件里(另一个sh导出文件)
  • .q文件之间的依赖关系
  • .q文件执行成功后生成执行成功log文件
  1. #! /bin/bash
  2. source /etc/profile
  3. log=/LOG/SHELL/CODE
  4. currPath=/OPT/SHELL/CODE/cc
  5. #起始时间变量
  6. log_day=`date +%Y-%m-%d`
  7. data_date=`date -d "1 day ago ${log_day}" +%Y-%m-%d` #1天前
  8. qdep_table=rpt_q_day
  9. zdep_table=rpt_z_day
  10. q_depend1=${log}/${qdep_table}_${log_day}.txt
  11. z_depend1=${log}/${zdep_table}_${log_day}.txt
  12. scr_name=rpt_qz
  13. ################################################
  14. #scr_name.q文件要在q和z文件执行成功后执行
  15. ################################################
  16. if [ -f ${q_depend1} -a -f ${z_depend1} ]; then
  17. hive -hivevar data_date=${data_date} -f ${currPath}/&{scr_name}_day.q --verbose >>${log}/${scr_name}_${log_day}.log 2>&1
  18. if [ $? -eq 0 ];then
  19. echo ''>>${log}/${scr_name}_day_${log_day}.txt
  20. fi
  21. fi
  22. ################################################
  23. #scr_name.q文件执行成功后将数据导出到mysql数据库
  24. #调用导出sh文件
  25. ################################################
  26. scr_name1=rpt_2mysql_${scr_name}_day.sh
  27. if [ $? -eq 0 ]
  28. then
  29. sh ${currPath}/${scr_name1}

导出.sh文件

  • 源表、目标表、导出列
  • 用于将hive处理后的数据导出
  1. #!/bin/bash
  2. source /etc/profile
  3. source /OPT/SHELL/CODE/public_to_new_mysql.cfg #导出文件包 包含用户名库名等
  4. run_data_date=$1
  5. log_day=`date +%Y-%m-%d`
  6. inc_day=`date -d "1 day ago ${log_day}" +%Y-%m-%d` #1天前
  7. log=/LOG/SHELL/CODE
  8. target_dir=/RESULT/CODE
  9. src_tab=RPT_TABLE_DAY
  10. log_tab=rpt_2mysql_rpt_table_day
  11. desc_tab=RPT_TABLE_DAY
  12. columns=DATA_DATE,COMPANY_CODE,WAREHOUSE_CODE,WAREHOUSE_NAME,INDUSTRY_TYPE,Q_SKU_NUM,Q_RATE
  13. 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
  14. 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
  15. if [ $? -eq 0 ]
  16. then
  17. echo '数据导出完毕' > ${log}/${log_tab}${log_day}.txt
  18. fi

---------------------本文来自 lili_wuwu 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/lili_wuwu/article/details/82968341?utm_source=copy 

推荐 0
本文由 liliwu 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册