发布时间: 2018-12-29 22:44:42
最后更新: 2019-01-19 20:25:09
Azkaban 自动打包项目并上传
摘要
Azkaban 自动打包上传,job 脚本开发完成后,调用 Azkaban 接口上传。简化了手动打包,手动上传的操作。也可集成到 git 的 web hook 提交代码后或指定操作即执行打包上传操作。
前言
Azkaban 提供了一套 api 能直接对其操作 API 文档
根据这套 api 可以实现创建、删除、上传项目,获取流程、获取 job,获取流程执行结果,执行流程,设置定时执行等功能。基本上 UI 的功能,都可以通过 api 的方式来执行。
我对于 Azkaban 的了解并不多,仅仅刚写了一个 shell 脚本 Azkaban Flow Parameters 参数设置与接收,实现按时间区间执行脚本,给大数据同学提供一个简单的补数脚本。
因为看大数据的同学反复得修改、打包、上传,是时候展现自动化的魅力了。

开始
先看下整体的脚本,然后再一行行看一看,方便大家修改:
##!/bin/sh
host=http://my-test-azkaban.site:8081
project="test"
username="azkaban"
password="azkaban"
if [[ $# -ge 1 ]]; then
project=$1
fi
if [[ ! -d ods || ! -d agr || ! -d rpt || ! -f system.properties ]]; then
echo "缺少 ods or agr or rpt or system.properties"
exit
fi
if [[ ! -d .etl-scheduler ]]; then
mkdir -p .etl-scheduler
fi
## 已经存在则先删除
if [[ -f .etl-scheduler/etl-scheduler.zip ]]; then
rm -rf .etl-scheduler/etl-scheduler.zip
fi
## 压缩 job
zip .etl-scheduler/etl-scheduler.zip ods/* agr/* rpt/* *.job system.properties
echo '-------------zip over---------------'
## 申请 session_id
session_id=`curl -s -k -X POST --data "action=login&username=${username}&password=${password}" ${host} | \
python -c 'import json,sys; data = json.load(sys.stdin); print (data["status"]=="success" and data["session.id"] or "error");'`
## 是否获取 session_id 失败
if [[ "error" = "$session_id" ]]; then
echo "登录失败"
exit
fi
## 上传 job
curl -s -k -H "Content-Type: multipart/mixed" -X POST --form 'session.id='${session_id} --form 'ajax=upload' --form 'file=@.etl-scheduler/etl-scheduler.zip;type=application/zip' --form 'project='${project} ${host}/manager | \
python -c 'import json,sys; data = json.load(sys.stdin); print (data.get("error") and "error: " + data["error"] or data);'
配置基本的参数:
host=http://my-test-azkaban.site:8081 # Azkaban 的 host
project="test" # 项目名
username="azkaban" # Azkaban 登录账号
password="azkaban" # Azkaban 登录密码
传了一个以上参数时,将第一个参数设为项目名(其它参数暂时不用,丢弃):
if [[ $# -ge 1 ]]; then
project=$1
fi
简单的文件验证:
## 我们公司需要使用这些目录,当然你们可以写自己的验证规则,或删除这条验证
if [[ ! -d ods || ! -d agr || ! -d rpt || ! -f system.properties ]]; then
echo "缺少 ods or agr or rpt or system.properties"
exit
fi
## 文件夹不存在,需要创建
if [[ ! -d .etl-scheduler ]]; then
mkdir -p .etl-scheduler
fi
## 已经存在则先删除
if [[ -f .etl-scheduler/etl-scheduler.zip ]]; then
rm -rf .etl-scheduler/etl-scheduler.zip
fi
## 压缩 job
## 注意:我们需要打包这些文件,换上你的打包命令
zip .etl-scheduler/etl-scheduler.zip ods/* agr/* rpt/* *.job system.properties
Azkaban 需要先调用登录接口,使用返回的 session_id 为后续操作提供支持
## 申请 session_id
session_id=`curl -s -k -X POST --data "action=login&username=${username}&password=${password}" ${host} | \
python -c 'import json,sys; data = json.load(sys.stdin); print (data["status"]=="success" and data["session.id"] or "error");'`
## 是否获取 session_id 失败
if [[ "error" = "$session_id" ]]; then
echo "登录失败"
exit
fi
这里使用 python 来处理返回的结果,状态为 success 时返回 session_id 否则返回 error 并退出脚本。
上传打包好的项目:
## 上传 job
curl -s -k -H "Content-Type: multipart/mixed" -X POST --form 'session.id='${session_id} --form 'ajax=upload' --form 'file=@.etl-scheduler/etl-scheduler.zip;type=application/zip' --form 'project='${project} ${host}/manager | \
python -c 'import json,sys; data = json.load(sys.stdin); print (data.get("error") and "error: " + data["error"] or data);'
同样使用 python 来处理返回的结果,存在 error 时抛出异常。
小结
这次是真的 事了拂衣去,深藏身与名, 开心。