DataX+Crontab实现多任务顺序定时同步

DataX+Crontab实现多任务顺序定时同步

前言

DataX 是一款支持在异构数据源之间离线同步数据的工具, DataX 通过输入一些命令执行 json 配置文件,这样使用起来并不是很方便, DataX 也不支持定时任务调度,它仅支持一次性同步任务。所以 DataX 的这些特点造成了它无法完成一些复杂的任务编排工作,如多个任务之间的依赖调用。

市面上对 DataX 扩展的开源项目很好的解决了这些问题:

  • DataX Web :是一个基于 DataX 构建的图形化数据同步平台。 DataX 本身是一个高效的数据同步工具,而 DataX Web 则提供了一个用户友好的界面,使得数据同步任务的配置、管理和监控变得更加直观和便捷。
  • Apache airflow :是一个开源平台,用于准备、监控和调度工作流。它允许你定义复杂的数据管道,并且可以轻松地管理这些管道的依赖关系。 Airflow 采用 Python 编写,使用 DAG(有向无环图)来表示工作流,这使得它非常适合用于构建和管理数据工程中的各种任务。

本文介绍的一种 DataX 顺序编排任务调度的方式是采用是 Shell 脚本实现的,这种方式相对于以上两种开源项目来说更加轻量,虽然功能没有它们强大,但是在一些简单的业务场景中使用更具性价比。

DataX顺序调用

以下是一个顺序调用的 Shell 脚本,它的作用是调用此脚本的时候传入多个 DataXjson 配置文件路径,此脚本会调用 datax.py 的代码,并顺序执行 json 配置,如果中途有某个 json 配置执行失败,则返回失败提示。

Shell 脚本代码

bash 复制代码
#!/bin/bash

source /etc/profile

# 定义一个函数来执行同步操作
execute_sync() {
    local json_file="$1"
    local task_name="${json_file##*/}"  # 提取文件名作为任务名
    task_name="${task_name%.*}"         # 去掉文件扩展名

    python /path/to/datax/bin/datax.py "$json_file"
    local EXIT_CODE=$?

    if [ $EXIT_CODE -ne 0 ]; then
        echo "----------------------- $task_name 同步任务执行失败,退出码为 $EXIT_CODE -----------------------"
        exit $EXIT_CODE
    else
        echo "----------------------- $task_name 同步任务执行成功 -----------------------"
    fi
}

# 检查是否有足够的参数
if [ "$#" -eq 0 ]; then
    echo "请提供要同步的 JSON 文件名作为参数。"
    exit 1
fi

# 迭代所有传入的参数
for json_file in "$@"; do
    execute_sync "$json_file"
done

解释代码:

  • source /etc/profile:这行命令会加载系统的环境变量配置文件,通常用于更新环境变量,使得脚本能够访问或使用这些环境变量。加上这行代码是为了防止执行 Crontab 时脚本找不到 Java 环境变量,提示找不到 Java 命令。
  • 参数检查:如果没有参数传入脚本,则打印错误消息并退出脚本
  • execute_sync 函数:
    • 接受一个参数 $1,即传递给该函数的第一个参数,这里是指定的 JSON 文件路径
    • 提取文件名作为任务名
    • 去除文件扩展名
    • 执行 datax.py 脚本并传入 json_file 作为参数
    • 获取脚本执行后的退出状态码$?并存储在EXIT_CODE变量中
    • 根据退出状态码判断 datax.py 是否成功执行,并相应地打印信息或退出脚本
  • 循环处理所有传入的参数:对于每个传入的 JSON 文件名,调用 execute_sync 函数

执行脚本

赋予脚本权限:

bash 复制代码
chmod +x /path/to/datax.sh

先执行命令测试一下接口是否能成功执行。

bash 复制代码
/path/to/datax.sh /path/to/xxx.json

当看到同步成功的返回信息时说明执行 DataX 成功了。

多任务

传入多个 json 配置文件,顺序执行多个同步任务,命令如下:

bash 复制代码
/path/to/datax.sh /path/to/1.json /path/to/2.json

Crontab

大部分 Linux 系统都自带 CrontabCrontab 的名字来源于 cron table,即 cron 表 的意思。Crontab 使用起来也很简单,它允许用户编辑一个文本文件用来描述调度任务的 cron 表达式及任务的执行命令。格式如下:

bash 复制代码
* * * * * command_to_execute

这里5个星号从左到右分别代表:

  • 分钟 (0-59)
  • 小时 (0-23)
  • 月份中的日期 (1-31)
  • 月份 (1-12)
  • 一周中的哪一天 (0-6),其中 0 和 7 代表周日

请看一组 cron 表达式的示例:

  • 0 2 * * *: 每天凌晨两点整点执行
  • 30 4 * * 1:每周一的早上四点半执行
  • 0 1 * * 1,5 :每周一和周五的凌晨一点执行。
  • 0 0 1 * *:每个月的第一天午夜零点执行。
  • */5 * * * * :每隔五分钟执行一次。

如果自己写出了一个 cron 表达式,但是不知道写的是否正确,可以去这个网址 Crontab.guru - The cron schedule expression generator 检验一下。

DataX 定时任务

先来学习一下 Crontab 最常用到的几个命令:

bash 复制代码
# 查询调度
crontab -l

# 编辑调度
crontab -e

# 删除所有调度
crontab -r

执行 crontab -l 命令,可以看到目前还一个定时任务都没有。

执行 crontab -e 命令,出现一个类似于 vivim 的编辑界面。按键盘 i 键进入编辑模式,将任务表达式复制到第一行。

按键盘 ESC 键退出编辑模式,按 SHIFT + : 键,最下面一行出现命令行输入的位置,输入 wq 表示退出并保存,结束本次 Crontab 的编辑。如果想退出不保存可以在下方命令行输入 q! 退出。

再次敲下命令 crontab -l 查看定时任务,刚才创建的定时任务已经存在了。

我创建的是一个每小时一次整点触发的定时任务,想要看它是否执行以及执行的情况可以执行以下命令:

bash 复制代码
# 查询运行状态
systemctl status crond

# 查看cron日志
tail -200f /var/log/messages
tail -200f /var/log/cron

查看运行状态显示 running 表示正在运行中

/var/log/cron 日志只能看到一条日志记录,这条记录表示你创建的任务执行了,但不知道有没有报错,执行成功没有。想要看到更详细的日志,我们可以在编辑 crontab 的时候,在命令后面追加日志的保存文件路径。

bash 复制代码
0 * * * * /path/to/datax.sh /path/to/1.json /path/to/2.json >> /path/to/datax/job/log/dm_swlztb_qjzl.log 2>&1

>> 符号后面的 log 文件就是要保存的日志文件, 2>&1 是固定写法,不必深究其含义。

总结

本文介绍了一种 DataX 多个任务顺序调用的轻量解决方案,采用的是 DataX + Shell + Crontab 的方式,利用 Shell 脚本循环调用 DataX 一次性任务,同时利用 CrontabShell 脚本定时调用。这种方案的优势在于部署的组件更少,通过调用 Shell 脚本传参的灵活方式达到多任务的效果。

相关推荐
摇滚侠3 小时前
Spring Boot 3零基础教程,IOC容器中组件的注册,笔记08
spring boot·笔记·后端
程序员小凯5 小时前
Spring Boot测试框架详解
java·spring boot·后端
你的人类朋友6 小时前
什么是断言?
前端·后端·安全
程序员小凯7 小时前
Spring Boot缓存机制详解
spring boot·后端·缓存
i学长的猫7 小时前
Ruby on Rails 从0 开始入门到进阶到高级 - 10分钟速通版
后端·ruby on rails·ruby
用户21411832636028 小时前
别再为 Claude 付费!Codex + 免费模型 + cc-switch,多场景 AI 编程全搞定
后端
茯苓gao8 小时前
Django网站开发记录(一)配置Mniconda,Python虚拟环境,配置Django
后端·python·django
Cherry Zack8 小时前
Django视图进阶:快捷函数、装饰器与请求响应
后端·python·django
爱读源码的大都督9 小时前
为什么有了HTTP,还需要gPRC?
java·后端·架构
码事漫谈9 小时前
致软件新手的第一个项目指南:阶段、文档与破局之道
后端