JAVA环境下使用DATAX(不使用python调用)

DATAX是啥我就不说了 看官方文档

其实下载过datax源码就能从测试用例里找到java调用的方式

例如下面这段

@Test
public void case01() throws Throwable {
    // given
    prepareTable();
    // when
    String[] params = {"-mode", "standalone", "-jobid", "-1", "-job", "src/test/resources/csv2t.json"};
    System.setProperty("datax.home", "../target/datax/datax");
    Engine.entry(params);
}

重点就在于Engine.entry(params);

第一步:

我由于项目原因呢是直接下载了源码 直接复制datax中的common core transformer模块然后pom中依赖他们,其他的部分可以不用拷进来。

第二步:
使用下载源码的方式 虽然是不使用python 但是也需要打包datax;具体方式可以看userGuid.md

第三步:

这里就是直接调用Engine.entry(params);

params是一些必要参数

-mode:standalone 就是单进程方式运行了

-jobid:每次执行都需要一个任务id

-job:就是那个json配置文件了

还需要设置下系统环境变量 设置datax目录 就是datax打包后生成的那个目录

System.setProperty("datax.home", dataXHome);

有时候我们肯定是需要设置动态参数 如何你只是每次简单开个任务导一下数据也可以使用System.setProperty();进行设置。例如你的json配置文件中有个动态参数${ID}

那么你可以直接使用System.setProperty("ID","10")设置。datax后续会进行解析(具体代码再com.alibaba.datax.common.util.StrUtil中)

但是如何像我项目中 可以同时启动多个任务 用system设置不靠谱。

我的解决办法暂时就是依葫芦画瓢 也把参数放在那个param参数数据中 ,修改Engine源码 增加options参数。

解析动态参数实在Engine中的

ConfigParser.parse(jobPath,incParam);这行代码  后续修改源码也很简单我就不贴了 复制粘贴改改就行了

第四步

如果你需要收集datax日志中打印的那些信息 可以看看Communication类

具体使用方法可以使用

Communication jobCommunication = LocalTGCommunicationManager.getJobCommunication();

你也可以轮训调用这个查看其中的信息

和日志中打印的是一样的。

VM信息 可以调用VMInfo.getVmInfo();返回的是单例对象。

第五步

根据自己业务需要增加插件 这个有空再说~

最后贴个测试用例吧(只是测试用例 学习使用的 有些乱我可能不知道改了啥 我也是凑合记录下巴)

 @Test
    void contextLoads() throws Throwable {
       SimpleDateFormat dateFormat = new SimpleDateFormat(
                "yyyy-MM-dd HH:mm:ss");
        long startTimeStamp = System.currentTimeMillis();
//- 在有总bps限速条件下,单个channel的bps值不能为空,也不能为非正数   datax报此错误 修改datax下的conf/core.json
//        core -> transport -> channel -> speed -> "byte": 2000000,将单个channel的大小改为2MB即可。
        //如果需要传递一些其他参数 比如sql中 where id = ${id} 这样 再加一个System.setProperty(“id”,1)这样就可以 但是这个系统变量  做个任务呢???
        VMInfo vmInfo = VMInfo.getVmInfo();

        String s = vmInfo.toString();
        System.out.println("初始打印VMINFO-------------------"+s);
        Thread thread = new Thread(() -> {
            test111();
        });
        thread.start();

        while (true){
            Thread.sleep(10000);
            System.out.println("十秒打印一次--------------------------");
            vmInfo.getDelta(false);
            String deltaString = vmInfo.getDeltaString();
            System.out.println("VMINFO------------"+deltaString);
            Communication jobCommunication = LocalTGCommunicationManager.getJobCommunication();
            String snapshot = CommunicationTool.Stringify.getSnapshot(jobCommunication);
            System.out.println("executor-INFO----------"+snapshot);
            if(jobCommunication.getState().name().equals(State.SUCCEEDED.name())){

                    long endTimeStamp = System.currentTimeMillis();
                if (vmInfo != null) {
                    vmInfo.getDelta(false);
                    String s1 = vmInfo.totalString();
                    System.out.println("执行结束打印vmInfo--------------:"+s1);
                    String s2 = PerfTrace.getInstance().summarizeNoException();
                    System.out.println("结束打印summarizeNoException-------------------------------------:"+s2);

                    long totalCosts = (endTimeStamp - startTimeStamp) / 1000;
                    long transferCosts = (endTimeStamp - startTimeStamp) / 1000;
                    if (0L == transferCosts) {
                        transferCosts = 1L;
                    }
                    // 字节速率
                    long byteSpeedPerSecond = jobCommunication.getLongCounter(CommunicationTool.READ_SUCCEED_BYTES)
                            / transferCosts;

                    long recordSpeedPerSecond = jobCommunication.getLongCounter(CommunicationTool.READ_SUCCEED_RECORDS)
                            / transferCosts;
                    String format = String.format(
                            "\n" + "%-26s: %-18s\n" + "%-26s: %-18s\n" + "%-26s: %19s\n"
                                    + "%-26s: %19s\n" + "%-26s: %19s\n" + "%-26s: %19s\n"
                                    + "%-26s: %19s\n",
                            "任务启动时刻",
                            dateFormat.format(startTimeStamp),

                            "任务结束时刻",
                            dateFormat.format(endTimeStamp),

                            "任务总计耗时",
                            String.valueOf(totalCosts) + "s",
                            "任务平均流量",
                            StrUtil.stringify(byteSpeedPerSecond)
                                    + "/s",
                            "记录写入速度",
                            String.valueOf(recordSpeedPerSecond)
                                    + "rec/s", "读出记录总数",
                            String.valueOf(CommunicationTool.getTotalReadRecords(jobCommunication)),
                            "读写失败总数",
                            String.valueOf(CommunicationTool.getTotalErrorRecords(jobCommunication))
                    );
                    System.out.println("结束打印format---------------:"+format);

                    if (jobCommunication.getLongCounter(CommunicationTool.TRANSFORMER_SUCCEED_RECORDS) > 0
                            || jobCommunication.getLongCounter(CommunicationTool.TRANSFORMER_FAILED_RECORDS) > 0
                            || jobCommunication.getLongCounter(CommunicationTool.TRANSFORMER_FILTER_RECORDS) > 0) {
                        String format1 = String.format(
                                "\n" + "%-26s: %19s\n" + "%-26s: %19s\n" + "%-26s: %19s\n",
                                "Transformer成功记录总数",
                                jobCommunication.getLongCounter(CommunicationTool.TRANSFORMER_SUCCEED_RECORDS),

                                "Transformer失败记录总数",
                                jobCommunication.getLongCounter(CommunicationTool.TRANSFORMER_FAILED_RECORDS),

                                "Transformer过滤记录总数",
                                jobCommunication.getLongCounter(CommunicationTool.TRANSFORMER_FILTER_RECORDS)
                        );
                        System.out.println("结束打印format1---------------:"+format1);
                    }

                }
                thread.join();
                break;
            }
        }

    }

private static void test111(){
    String[] params = {"-mode", "standalone", "-jobid", "-1", "-job", "D:\\DevelopSoftware\\datax\\datax20210506\\datax\\job\\job.json"};
    System.setProperty("datax.home", "D:\\DevelopSoftware\\datax\\datax20210506\\datax");
    try {
        Engine.entry(params);
    } catch (Throwable e) {
        e.printStackTrace();
    }
}
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值