Azkaban Flow Parameters 参数设置与接收,实现按时间区间执行脚本

栏目: 服务器 · 发布时间: 7年前

内容简介:可以跑一个时间段而不是一个时间?本文主要说说这两个问题以及我的解决方式。对于大数据朋友使用此功能补数很有帮助。最近公司在建设自己的数据仓库,需要使用他的需求是: - 接收最多三个参数,第一个必传,为 sql 名,第二个参数不传表示跑前一天,传则跑指定的,有第三个参数则跑 第二个字段到第三个参数之间的所有时间 - 在

摘要

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

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

背景

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

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

开始

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

先介绍下我们调度的主要流程: - 有一些 job 可能他们之间有依赖关系,这些 jobtype=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 后,打包了当前项目,之后下载到了本地,使用 AzkabanUI 界面上传了这次打包的压缩包。

看着看着我想,要么再送个 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 界面的调度,直接转到命令行的操作。

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


以上所述就是小编给大家介绍的《Azkaban Flow Parameters 参数设置与接收,实现按时间区间执行脚本》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Web Caching

Web Caching

Duane Wessels / O'Reilly Media, Inc. / 2001-6 / 39.95美元

On the World Wide Web, speed and efficiency are vital. Users have little patience for slow web pages, while network administrators want to make the most of their available bandwidth. A properly design......一起来看看 《Web Caching》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试