• 作者:老汪软件技巧
  • 发表时间:2024-10-07 07:01
  • 浏览量:

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

前言

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

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

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

DataX顺序调用

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

Shell 脚本代码

#!/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

解释代码:

循环处理所有传入的参数:对于每个传入的 JSON 文件名,调用 execute_sync 函数执行脚本

赋予脚本权限:

chmod +x /path/to/datax.sh

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

/path/to/datax.sh /path/to/xxx.json

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

多任务

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

/path/to/datax.sh /path/to/1.json /path/to/2.json

Crontab

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

_定时任务cron表达式_定时任务并发执行怎么解决

* * * * * command_to_execute

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

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

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

DataX 定时任务

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

# 查询调度
crontab -l
# 编辑调度
crontab -e
# 删除所有调度
crontab -r

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

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

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

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

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

# 查询运行状态
systemctl status crond
# 查看cron日志
tail -200f /var/log/messages
tail -200f /var/log/cron

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

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

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 一次性任务,同时利用 Crontab 对 Shell 脚本定时调用。这种方案的优势在于部署的组件更少,通过调用 Shell 脚本传参的灵活方式达到多任务的效果。


上一条查看详情 +每周AI论文速递(240930-241004)
下一条 查看详情 +没有了