Oozie与DataX集成数据同步(Flask框架版)

1.简介

基于DataX执行的ETL调度任务我们常常通过Crontab来进行批量调度。这种方法不方便进行集中化管理,且对于从数据仓库同步到外部数据库的任务无法做到上下游依赖,集成到Oozie中即可解决这样的问题。

2.方案架构

主要集成方法:使用Oozie自带的shell脚本功能,通过调用接口的方式来执行对应的ETL任务。

  1. 部署ETL抽取代码到Datax主机
  2. 在Datax主机调起一个接口
  3. Oozie执行shell脚本,通过脚本调起DataX主机的抽取代码

3.实施过程

3.1 首先将测试代码部署到DataX主机

这里不细说,通过rz或者git pull 等方法都可以实现 。
在这里插入图片描述

3.2 在DataX主机调起一个http接口

这里我们主要使用python来写一下接口,此处我们采用Flask框架。
(1)安装

pip install flask

(2)编写接口python代码

# coding:utf-8

# 导入Flask类
from flask import Flask, request
# 导入os用来执行shell语句
import os

# Flask函数接收一个参数__name__,它会指向程序所在的包
app = Flask(__name__)
BASE_URL = '/'

# 装饰器的作用是将路由映射到视图函数
@app.route(BASE_URL + 'execute', methods=['POST'])
def execute_task():
    try:
        script_name = request.form['scriptName']             # 待执行的脚本名参数
        ymd = request.form['YMD']                            # 待执行的日期参数

        # 根据参数,执行脚本
        script = ('python /这里写你的路径/{}'.format(script_name))
        p = os.system(script)                               # 执行脚本
        return str(p)
    except Exception as ex:
        print(ex)
        return str(1)


if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=8008)
    

(3)上传至服务器
这里没什么说的,干就完了!
在这里插入图片描述
(4)通过nohup实现后台运行程序

nohup python datax_database_flak.py &

3.3 编写一个shell脚本来调用DataX主机的接口

shell中我们需要传入2个参数

  • ScriptName:待执行的任务名称
  • YMD:待执行的日期参数
#!/usr/bin/env bash
if [ ! -n "$1" ]
then
  YMD=`date -d last-day +%Y%m%d`
  echo "today is $YMD"
else
  YMD=`date -d "$1" +%Y%m%d`
  echo "today is $YMD"
fi

if [ ! -n "$2" ]
then
  echo "缺少脚本名"
  exit 1
else
  scriptName=$2
  echo "脚本名为:${ScriptName}.py"
  curl -X POST -d "ScriptName=${ScriptName}.py&YMD=$YMD" "http://这里是你的主机地址:8008/execute"
fi

3.4 Oozie调起任务

(1)将shell脚本上传至Oozie文件目录
这里也不细说,干就完了!
(2)配置workflows
在这里插入图片描述
(3) 执行脚本
直接点击worklflows上方的开始按钮就行了。在这里插入图片描述
脚本执行后,收到了测试邮件,任务完成!

猜你喜欢

转载自blog.csdn.net/Lyx_____h/article/details/107364190
今日推荐