#java #azkaban #shell #schedule #调度 #自动化

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 时抛出异常。

小结

这次是真的 事了拂衣去,深藏身与名, 开心。

Author Mo 最后更新: 2019-01-19 20:25:09