Press "Enter" to skip to content

windows定时任务准点运行kettle转换、作业等

一、 背景历史:

 

前两天工作中,项目经理要求使用 kettle 定时作业做转换,每小时第 30 分钟转换同步一次,那简单啊,我在第 30 分钟启动作业任务,并设置每 60 分钟跑一次,这样他就每小时的第 30 分会自动转换同步,两分钟成功满足经理需求,愉快至极

 

还没高兴两天呢,被 怼 了,经理问我:“数据怎幺没有在每小时第30分同步啊?”,我当时就想都没想说,估计机器卡了,任务没起来,然后我就去看任务,在正常运行啊,我又看日志,我懵了

 

经过几亿脑细胞消耗,kettle按分钟定时调度启动转换文件机制:一天24小时,那幺就有48个30分钟,每个30分钟是1/48,也就是个无限小数

 

 

按照四舍五入,就是0.021,数据不精准,有0.001左右误差,这点误差,在你每次定时任务启动时,定时的时间就会往后延迟几秒,每次启动都往后延迟几秒,结果几天后,就会延迟的不是每小时第30分钟执行作业了,会第31分,32分,33分随着时间一直往后延迟,最后出现严重数据同步问题,就等着被领导骂吧

 

那幺怎幺才能避免这种情况呢,怎幺才不会被领导骂,要记得,规则是人定的,人也可以改规则,计算机程序是死的,人是灵活的。没有计算机做不到了,只是操作计算机的人不行,哈哈

 

教程开始

 

版本信息

 

Kettle:version7.1

 

Java1.8

 

一、首先编写 k itchen .bat 脚本 文件 (名字随意,文件后缀.bat不能变)

 

D:

 

cd D:\kettle\pdi-ce-7.1.0.0-12\data-integration

 

pan.bat /file D:\kettle\数据抽取\数据中台\四地市通用模板1.7.4_0510.ktr  /level:Basic>D:\kettle\JOB.log

 

 

二、再创建个 JOB.log 存放日志的空文件  (脚本和log文件存储位置随便放,能记住在哪就行,后边会用到)

 

 

顺便解释一下:

 

D:   是你kettle存放的某盘

 

 

    1. 首先cd 是进入到kettle安装执行文件目录下

 

    1. pan.bat /file后边写的是你 转换 文件(.ktr)目录路径

 

    1. /level:Basic> 后边是你刚创建的job.log文件位置

 

 

注意:

 

如果你是要调度 作业 文件(.kjb),写的 k itchen .bat 脚本中 pan.bat 命令参数换成 kitchen .bat

 

在你保存 k itchen .bat 时,选择 ANSI 编码格式,其他的会有乱码情况发生

 

 

三、完成 k itchen .bat 脚本以后,双击测试一下 ( 会跳出cmd命令窗口,此时打开JOB.log日志记录,会发现已经在执行作业了,等待完成以后,cmd窗口会自动关闭。接下来就是Windows的定时任务来管理调度bat脚本了 )

 

 

四、windows下建立执行任务

 

打开控制面板–管理工具–任务计划程序

 

 

打开右侧的创建基本任务,填写作业名称,然后下一步打开触发器:

 

 

打开触发器,根据自己的需求选择执行频率,然后下一步打开具体的设置:

 

 

根据需求,每天几点开始触发任务,就是这个任务每天几点开始跑

 

(如果一天想让任务跑多次,后边有具体设置教程)

 

 

打开操作.,下一步打开具体设置(选择需要执行的bat脚本 , 就是你创建的.bat脚本文件路径 ),下一步完成

 

 

 

至此,Windows计划任务调度kettle作业完成

 

有人要急了,骂我傻,脑子null了,这不跟kettle创建定时作业一样嘛,这方法还麻烦,并且一天只能定时启动一次。

 

Windows万能的程度当然不可能一天只能启动一次啊,回到文章开头问题,我要怎幺才能每天每小时第30分启动我的转换任务呢,并且每次启动时间还不会往后推迟

 

继续往下看

 

五、补充:(每天多次定时调度启动转换任务):

 

上边的设置每天只会定时调度一次转换任务,下面内容就是怎幺设置一天多次定时调度

 

找到你刚创建的定时调度任务位置,右键打开属性

 

 

进入属性后选择触发器,再编辑任务,里边有高级设置,可以根据需求进行每天多次启动任务了

 

 

看完最后一张图,是不是就明白了

 

我把这个任务触发时间设置成每天凌晨00:30:00开启,每60分钟执行一次kettle定时转换脚本任务,这样每小时的第三十分钟给数据做转换的需求就实现了,并且时间还不会往后延迟

 

之所以Windows定时任务每次启动时间不会延迟,是因为Windows底层功能实现逻辑不一样,Windows是根据时间启动的,就是说时间只要到你指定的时间,它就在这个时间准时启动,但kettle不一样,kettle是基于java的,也就可以想象下开发人员在开发这个功能时,想的是分钟就按照一天24小时的比例来进行计算,这样的算法会有无限小数存在,那就给他四舍五入嘛,这也就造成了算法不精准,导致你每次启动的时间都会往后延迟,最终被领导怼

 

希望你们用不到这个,毕竟也不是每个领导都会要求你们的数据通过kettle进行转换,更不会要求每个小时第30分钟转换同步一次,哈哈

 

对了,我这个方法有一个小BUG,不晓得你们发现没,我已经想到解决办法了,但没必要修改,领导不怼我就行了,哈哈

 

有更好方法的大牛,十分希望您在评论区发言,最后希望你们干啥啥顺利,世间永无bug

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注