Java如何批量执行datax脚本

 更新时间:2024年02月28日 17:01:30   作者:可乐还是甜的好  
这篇文章主要介绍了Java如何批量执行datax脚本问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

一、前言

最近在使用datax同步数据表,由于好多个表,一开始每次都需要等一个执行完再执行下一个,这样明显效率很低,于是写了个Java方法来批量操作;

环境: linux服务器

二、Java代码

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @Author: Huang JX
 * @Date: 2021/11/11
 * @Description: datax 批量执行脚本,日志存放在当前目录的 DataxSyncLogs 中;
 * 注意:需要输入 datax 脚本的文件夹路径作为 main 函数的参数,如 home/xxx/datax/job/
 * <p>
 * 使用说明:
 * 1、去掉文件的包名package;
 * 2、将此Java文件放到 /datax/bin/目录下;
 * 3、javac DataxSyncUtil.java 
 * 4、java DataxSyncUtil [参数]datax脚本文件夹路径
 */
public class DataxSyncUtil {
    public static void main(String[] args) throws Exception {
        FileOutputStream out = null;
        StringBuffer sb = new StringBuffer();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        try {
            String jobPath = args[0];
            if (jobPath == null && "".equals(jobPath.trim())) {
                throw new Exception("请输入datax脚本文件夹路径");
            }
            String logDir = jobPath + "DataxSyncLogs";
            File logDirFile = new File(logDir);
            if (!logDirFile.exists()) {
                logDirFile.mkdir(); // 创建日志文件夹
            }
            String logFileName = logDir + "/datax_sync_" + sdf.format(new Date()) + ".log";
            File file = new File(logFileName);
            if (!file.exists())
                file.createNewFile();
            out = new FileOutputStream(file, true);
            sb.append("==========================================\n");
            sb.append("==========Datax Sync Job Start!==========\n");
            sb.append("==========================================\n");
            File f = new File(jobPath);
            if (!f.exists()) {
                sb.append(jobPath + " not exists\n");
                return;
            }
            System.out.print(sb.toString());
            out.write(sb.toString().getBytes("utf-8"));
            String cmdStr;
            File fa[] = f.listFiles();
            for (int i = 0; i < fa.length; i++) {
                sb = new StringBuffer();
                File fs = fa[i];
                if (!fs.isDirectory()) {
                    Process pr = null;
                    cmdStr = "python3 datax.py " + jobPath + fs.getName();
                    sb.append("start cmd: " + cmdStr + "\n");
                    System.out.print("start cmd: " + cmdStr + "\n");
                    pr = Runtime.getRuntime().exec(cmdStr);
                    BufferedReader in = new BufferedReader(new InputStreamReader(pr.getInputStream()));
                    String line;
                    while (true) {
                        if (!((line = in.readLine()) != null)) break;
                        sb.append(line + "\n");
                        System.out.print(line + "\n");
                    }
                    in.close();
                    pr.waitFor();
                    out.write(sb.toString().getBytes("utf-8"));
                }
            }
            sb.append("==========================================\n");
            sb.append("===========Datax Sync Job End!===========\n");
            sb.append("==========================================\n");
            System.out.print(sb.toString());
            out.write(sb.toString().getBytes("utf-8"));
        } finally {
            out.flush();
            out.close();
        }
    }
}

注意:

看一下注释的说明,将job的文件路径做为main函数的参数;

【更新记录】

1、2021-12-06 更新写日志方式,每跑完一个任务就写日志到文件中;

三、使用说明

1.把DataxSyncUtil拷到服务器中datax的bin目录下,如/home/xxx/datax/bin/,注意去除Java类的包名;

2.编译Java程序,javac DataxSyncUtil.java

3.执行Java程序,传入参数为放置datax脚本的文件夹,如java DataxSyncUtil /home/xxx/datax/job/

4.如果想在后台运行,则为nohup java DataxSyncUtil /home/xxx/datax/job/ &

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java使用DateTimeFormatter格式化输入的日期时间

    Java使用DateTimeFormatter格式化输入的日期时间

    这篇文章主要介绍了Java使用DateTimeFormatter格式化输入的日期时间,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • springboot引入druid解析sql的过程

    springboot引入druid解析sql的过程

    在开发中,有时我们可能会需要获取SQL中的表名,那么因为不同的数据源类型SQL会存在部分差异,那么我们就可以使用alibaba 的druid包实现不同的数据源类型的sql解析,需要的朋友可以参考下
    2023-08-08
  • Java下SpringBoot创建定时任务详解

    Java下SpringBoot创建定时任务详解

    这篇文章主要介绍了Java下SpringBoot创建定时任务详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • 优雅地在Java应用中实现全局枚举处理的方法

    优雅地在Java应用中实现全局枚举处理的方法

    这篇文章主要给大家介绍了关于如何优雅地在Java应用中实现全局枚举处理的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-02-02
  • IDEA实现远程调试步骤详解

    IDEA实现远程调试步骤详解

    这篇文章主要介绍了IDEA实现远程调试步骤详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Java数据开发辅助工具Docker与普通程序使用方法

    Java数据开发辅助工具Docker与普通程序使用方法

    这是为数据开发人员使用的辅助工具,用于数据库之间的表同步,说同步并不严谨,因为不是实时更新的,更确切的说法是复制,可以方便的从一个数据库复制表到另一个数据库,以下遇到同步的词请理解为复制
    2021-09-09
  • 解决使用@Value(${×××))从properties文件取值的坑

    解决使用@Value(${×××))从properties文件取值的坑

    这篇文章主要介绍了解决使用@Value(${×××))从properties文件取值的坑,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • 详解Spring中@Valid和@Validated注解用法

    详解Spring中@Valid和@Validated注解用法

    本文将以新增一个员工为功能切入点,以常规写法为背景,慢慢烘托出 @Valid 和 @Validated 注解用法详解,文中的示例代码讲解详细,感兴趣的可以了解一下
    2022-07-07
  • Java数据结构之单链表详解

    Java数据结构之单链表详解

    在之前的学习中,我们主要了解了很多 Java 的 基本语法,但是在之后的 Java学习中,了解基础数据结构的知识非常重要,数据结构的思想可以帮助我们更加清晰明白的了解 Java 的解题思路等等.今天我们就来开始学习实现一个Java基础的单链表,需要的朋友可以参考下
    2021-05-05
  • java多线程之停止线程的方法实例代码详解

    java多线程之停止线程的方法实例代码详解

    这篇文章主要介绍了java多线程之停止线程的方法实例代码详解,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-05-05

最新评论