知识点10:自动化调度方案--工作流调度与oozie
workflow工作流的概念
工作流(Workflow),指“业务过程的部分或整体在计算机应用环境下的自动化”。
工作流解决的主要问题是:为了实现某个业务目标,利用计算机软件在多个参与者之间按某种预定规则自动传递文档、信息或者任务。
核心概念:依赖执行 周期重复执行
DAG(有向无环图)
Apache Oozie介绍
Oozie是一个用来管理 Hadoop生态圈job的工作流调度系统。由Cloudera公司贡献给Apache。
oozie本身单独使用极其不方便,配置文件极其繁琐,不管是使用shell命令提交工作流还是使用java API提交工作流,都需要编写大量繁琐的xml配置文件;
但是oozie和hue整合之后使用还是非常不错的,在hue页面上提供了拖拽功能,直接选择想要调度的脚本或者其他任务,还可以根据自己的需求编写定时规则。
栗子 1:在Hue上使用oozie提交一个shell脚本执行
step1:打开hue页面
http://hadoop02:8889/hue 用户名、密码:hue
step2:上传一个shell脚本或者使用hue在线编写一个shell脚本
追加,覆盖,
在那台机器运行,有yarn决定,
栗子2:针对栗子1的调度任务,配置周期定时执行coordinator。
刚才配置的workflow属于一次性的工作流,执行完就结束了。
可以配置coordinator来控制workflow的执行周期和触发频率。
#获取今天的日期
date
date +%Y%m%d
#获取指定日期的年月日格式输出
date -d "2014-11-12" +%Y%m%d
#获取指定日期的星期(周几)格式输出
date --date="2014-11-23" +%w
#获取上周日期(day,month,year,hour)
date -d "-1 week" +%Y%m%d
#获取昨天日期
date -d '-1 day' "+%Y-%m-%d"
date --date="-24 hour" +%Y%m%d
变量提取、反引号的功能
name="allen"
echo ${name}
date
nowTime=date
echo ${nowTime}
date
nowTime=`date`
echo ${nowTime}
#双小括号命令是用来执行数学表达式的,可以在其中进行各种逻辑运算、数学运算,也支持更多的运算符(如++、--等)
echo $(((5 * 2)))
i=5
echo $(((i=$i*2))) #10
echo $(((i=i*2))) #20
# $((( )))的缩写。
echo $(((i*2))) #40
echo $((i*2)) #40
#shell脚本默认是按顺序串行执行的,使用&可以将一个命令放在后台运行,从而使shell脚本能够继续往后执行
sleep 5 &
echo "done"
sleep 5 #休眠5s
echo "done"
#上面的脚本执行后会立即打印出"done",sleep命令被扔给后台执行,不会阻塞脚本执行。
#如果想要在进入下个循环前,必须等待上个后台命令执行完毕,可以使用wait命令
sleep 5 &
wait
echo "done"
#这样,需要等待5s后才能在屏幕上看到"done"。
shell动态传参
$1 $2 代表的是传递的第几个参数
$0 执行脚本的名字
$# 传递参数的总个数
$* 显示所有传入参数 以列表展示
[root@hadoop02 ~]# vim 4.sh
#!/bin/bash
echo "$1"
echo "$3"
echo "$0"
echo "$#"
echo "$*"
[root@hadoop02 ~]# sh 4.sh 11 22 33 44
11
33
4.sh
4
11 22 33 44
知识点12:自动化调度方案--脚本实现、调度实现
脚本实现
脚本实现的关键是如何在shell建表中执行sqoop命令、hive sql文件、presto sql文件
并且关于时间的地方不能写死,而是使用shell date命令来动态获取
例子一:ODS数据导入
#! /bin/bash
SQOOP_HOME=/usr/bin/sqoop
if [[ $1 == "" ]];then
TD_DATE=`date -d '1 days ago' "+%Y-%m-%d"`
else
TD_DATE=$1
fi
#上述这段shell是什么意思?能否看懂?
如果用户不指定日期 默认采集当前天的前一天的数据。
用户也可以根据自己需求传入指定日期作为参数 就采集指定那一天的数据。
首次执行脚本
#仅新增
# 新增和更新同步
循环执行脚本
1、通过sqoop的query查询把增量数据查询出来。
增量的范围是TD_DATE值的 00:00:00 至 23:59:59
2、判断的字段是
如果是仅新增同步,使用create_time创建时间即可
如果是新增和更新同步,需要使用create_time 和 update_time两个时间
3、这也要求在业务系统数据库设计的时候,需要有意识的增加如下字段
create_user
create_time
update_user
update_time
例子二:DWB层sql脚本执行
在shell中执行hive sql的方式有两种
bin/hive -e ‘sql语句’
bin/hive -f xxx.sql文件
首次执行
循环执行
例子三:Presto的sql如何在shell中执行
#! /bin/bash
#昨天
if [[ $1 == "" ]];then
TD_DATE=`date -d '1 days ago' "+%Y-%m-%d"`
else
TD_DATE=$1
fi
PRESTO_HOME=/opt/cloudera/parcels/presto/bin/presto
${PRESTO_HOME} --catalog hive --server 172.17.0.202:8090 --execute "
delete from yp_rpt.rpt_sale_store_cnt_month where date_time = '${TD_DATE}';
.......
"
#改写上述的模板 练习一下如何使用shell执行presto sql
/export/server/presto/bin/presto --catalog hive --server hadoop01:8090 --execute "select * from yp_rpt.rpt_sale_store_cnt_month where date_time = '2021-03-17'"
去中心化模式
优点
不需要联网,自己的笔记本就是个本地版本库,直接利用自己的笔记本实现版本的管理
自己可以管理任意多个版本
不需要担心公共的版本库故障,每个人的本地都有版本库
Git的特点
适合于分布式开发,多人可以共同开发,强调个体
公共的版本库服务器的压力不会太大
速度快、更加灵活
任意的开发者之间如果产生冲突也容易解决
不需要联网也可以实现多版本管理
暂时看到::::::::::::::
未看,阿里数据质量规范,
数据质量教程概述 - 大数据开发治理平台 DataWorks - 阿里云https://help.aliyun.com/document_detail/124781.html