1. 数仓任务调度案例
每日凌晨,我们会将业务数据库同步到数仓中,并进行清洗和相关指标的计算,然后导出到PostgreSQL中给业务系统使用,整个过程可以通过Azkaban进行调度执行。
-
job编写
job内容是执行对应的shell脚本,执行对应的任务,比如hive的脚本等。job的执行顺序依靠dependencies来描述,A 依赖B,则B先执行。
多个依赖用逗号分隔。
import_log.job
type=command do_date=${dt} command=/root/bin/sqoop_import_mp_log.sh all ${do_date}
import_user.job
type=command do_date=${dt} command=/root/bin/sqoop_import_mp_user.sh all ${do_date}
ods.job
type=command do_date=${dt} dependencies=import_log,import_user command=/root/bin/ods_db.sh ${do_date}
dwd.job
type=command do_date=${dt} dependencies=ods command=/root/bin/dwd_db.sh ${do_date}
dws.job
type=command do_date=${dt} dependencies=dwd command=/root/bin/dws_db.sh ${do_date}
ads.job
type=command do_date=${dt} dependencies=dws command=/root/bin/ads_db_log.sh ${do_date}
export.job
type=command dependencies=ads command=/root/bin/sqoop_export.sh all
-
job上传
将上面的多个job文件压缩成一个zip包;然后创建一个Project,然后上传对应的zip包
-
执行参数传递
如果想动态传递参数,比如日期等每次都会变的参数,可以参考案例2
-
执行任务
可以手动执行(点击Execute),也可以设置定时执行(点Schedule设置定时计划)。设置好后,可以查看定时计划。例如下面的例子:每周1-5的凌晨1点会执行计划。
2.动态传参任务案例
上面例子中设置参数适合固定不变的参数,因为数仓中hive脚本中如果传入日期为空,会取前一日时间作为参数,因为我是设置了凌晨1点执行进行前一日数据的同步落盘, 所以上面我没有设置参数,但是有些情况,日期需要动态设置传递给job任务。这时,有一个取巧的做法就是增加一个写参数的任务,将参数写入文件,然后在需要的job中读取文件即可。
Azkaban运行过程中的参数环境变量介绍:
-
Parameter Passing:参数传递
azkaban以job执行过程中,传递进来的临时参数,运行时参数,项目中配置文件的参数,job定义中参数等 都保存在 ${JOB_PROP_FILE}文件中,保存格式为key=value。执行job的中shell命令时,可以作为参数传递。
JOB_PROP_FILE 是一个环境变量参数。 -
Parameter Output:参数输出
一个任务运行结束,可以将一些参数写入到${JOB_OUTPUT_PROP_FILE}文件 中,azkaban会将这些参数传递到下游依赖的的job的参数文件${JOB_PROP_FILE}文件中,供下游job引用。
写如到${JOB_OUTPUT_PROP_FILE}文件中参数需要是json格式
的,否则会报json解析错。
JOB_OUTPUT_PROP_FILE也是一个环境变量参数。
第一步: 编写job
最终结果如下: 四个job文件,一个sh脚本。最终打包为dyparm.zip
[root@nn jobTest]# ll
total 24
-rw-r--r-- 1 root root 935 May 25 15:42 dyparm.zip
-rw-r--r-- 1 root root 454 May 24 16:21 rd.sh
-rw-r--r-- 1 root root 95 May 24 16:16 step1.job
-rw-r--r-- 1 root root 73 May 24 16:19 step2.job
-rw-r--r-- 1 root root 103 May 24 16:20 step3.job
-rw-r--r-- 1 root root 107 May 25 15:36 step4.job
step1.job
:这里第一个job就是获取当前日期,写入文件中
#step_1.job
type=command
command=whoami
command.1=/bin/sh -c "date '+%Y-%m-%d' > rundate.text"
step2.job
:第二个job只是打印一句话并在job1之后执行,可以认为是正常的job
#step_2.job
type=command
dependencies=step1
command=echo 'this is step2'
step3.job
:第三个job将执行rd.sh脚本,该脚本的作用是将job1写入文件的日期注入到Azkaban环境变量中,供其他Job使用。
#step_3.job
type=command
dependencies=step2
command=whoami
command.1=/bin/bash /opt/soft/jobTest/rd.sh
rd.sh
#!/bin/sh
# this script takes the run_date value from the text file and passes it to Azkaban
# Now, the variable can be used in the next step of the job
RD=$(cat rundate.text)
echo "Now setting Job Output Property File with RD (run date) variable"
echo $RD
#This is the point where the parameter is written in JSON format
#to the JOB_OUTPUT_PROP_FILE, which allows it to be used in the next step
echo '{"RD" : "'"$RD"'"}' > "${JOB_OUTPUT_PROP_FILE}"
step4.job
:该job取出第三步注入的环境变量RD进行使用
# step_4.job
type=command
dependencies=step3
command=whoami
command.1=bash -c "echo ${RD} is the run date"
最终结果: