发布时间: 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
时抛出异常。
小结
这次是真的 事了拂衣去,深藏身与名
, 开心。