摘要 使用 Azkaban 调试任务时,虽说可以在 UI 界面里可以添加参数,在 job 中如何接收这些参数,如何能让 job

可以跑一个时间段而不是一个时间?本文主要说说这两个问题以及我的解决方式。对于大数据朋友使用此功能补数很有帮助。

背景

最近公司在建设自己的数据仓库,需要使用 Azkaban 来作任务的调度。期间数据组的同事拿了两个桔子对我说:“帮我写个 shell 脚本吧”,故事由此开始。

他的需求是: - 接收最多三个参数,第一个必传,为 sql 名,第二个参数不传表示跑前一天,传则跑指定的,有第三个参数则跑 第二个字段到第三个参数之间的所有时间 - 在 Azkaban 管理界面可配置添加这两个参数,第一个参数写 job 时已经确认。

开始

接到这需求,我想这简单的 shell 应该没有问题,做到最后我后悔了。 shell 简单没有问题,可是 Azkaban Flow Parameters 的配置真是太难用了。

先介绍下我们调度的主要流程: - 有一些 job 可能他们之间有依赖关系,这些 job 是 type=command 的,会调用 run_hive.sh 并传几个参数。 - run_hive.sh 会接收这些参数,并执行 hive -hivevar ... - 调试完成,等待执行完成

基础调试脚本

于是简单写了如下脚本 run_hive.sh :

##!/bin/sh ## 脚本参数注释: ## $1 sql 脚本名 ## $2 开始时间 ## $3 结束时间 if [ ! -n "$1" ];then echo "Must be passed in the first parameter. The first parameter in the name of the SQL is to be performed." exit fi begin_dt=`date -d yesterday +%Y-%m-%d` if [[ $# -ge 2 ]]; then echo $2 | grep -Eq "[0-9]{4}-[0-9]{2}-[0-9]{2}" && date -d $2 +%Y-%m-%d > /dev/null if [[ $? -ne 0 ]]; then echo "第二个参数不是时间格式 $2" exit fi begin_dt=$2 fi if [[ $# = 3 ]]; then echo $3 | grep -Eq "[0-9]{4}-[0-9]{2}-[0-9]{2}" && date -d $3 +%Y-%m-%d > /dev/null if [[ $? -ne 0 ]]; then echo "第三个参数不是时间格式 $3" exit fi end_dt=$3 fi echo "------输入参数------" echo "sql:$1" echo "begin_dt:$begin_dt" echo "end_dt:$end_dt" echo "-------------------" if [[ $# = 3 ]]; then beg_s=`date -d "$begin_dt" +%s` end_s=`date -d "$end_dt" +%s` echo "处理时间范围:$begin_dt 至 $end_dt" while [[ "$beg_s" -le "$end_s" ]]; do day=`date -d @$beg_s +%Y-%m-%d` echo "当前日期:$day" hive -hivevar dt=${begin_dt} -f /path/to/$1.sql beg_s=$((beg_s+86400)); done else hive -hivevar dt=${begin_dt} -f /path/to/$1.sql fi

本地测试了一下,完美!可以只存一个参数,执行默认前一天;传两个,则跑指定时间的;传三个则跑指定时间段的。

修改 job 配置

我们的 job 修改后大致是这样的:

type=command dependencies=dependencies_goods p1=${begin_dt} p2=${end_dt} command=sh /path/to/run_hive.sh goods_pay_day ${p1} ${p2} retries=3 retry.backoff=5000 配置 Flow Parameters

写好脚本,交给了大数据的同事,想让他测试一下。

他改好 job 后,打包了当前项目,之后下载到了本地,使用 Azkaban 的 UI 界面上传了这次打包的压缩包。

看着看着我想,要么再送个 《 Azkaban 自动打包项目并上传》

之后让他尝试配置了一下:
Azkaban Flow Parameters 参数设置与接收,实现按时间区间执行脚本

执行,等待,成功!

正当我准备 事了拂衣去,深藏身与名 。 大数据朋友对我说,不传参数或只传一个,好像不生效。

寻找解决方案

这问题到最后都没有解决,只能通过 curl 来使用我之前的脚本。在 curl 脚本中加入了参数的判断。

我看 job 中的 command 命令是直接执行 shell 命令,我想可以在这里做文章。给 begin_dt , end_dt , p1 , p2 设置默认值都不能接收(注:可以使用 ${begin_dt=+2018-12-28} 来设置默认值)。而 Azkaban 不识别这种格式,直接当作字符串处理。

还尝试了其它很多方式,最后像我一点不懂 Azkaban 的,去看了官方这块的文档,依然没有解决。

官方中有一条 issues 中提及在 4.x 版本中会引入 backfill 兴许可以解决传递时间的问题,我只好放弃。

小结

写脚本还是可以解决一些问题的,虽然并没有彻底解决大数组同学的问题,不过倒是提供了一个思路。可以在写一个本地的命令行脚本,不使用 UI 界面的调度,直接转到命令行的操作。

可这样对他们来说更加不友好,没有进行下去。

本文系统(linux)相关术语:linux系统 鸟哥的linux私房菜 linux命令大全 linux操作系统

代码区博客精选文章
分页:12
转载请注明
本文标题:Azkaban Flow Parameters 参数设置与接收,实现按时间区间执行脚本
本站链接:https://www.codesec.net/view/628149.html


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 系统(linux) | 评论(0) | 阅读(95)