一、背景历史:
前两天工作中,项目经理要求使用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
一、首先编写kitchen.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存放的某盘
- 首先cd 是进入到kettle安装执行文件目录下
- pan.bat /file后边写的是你转换文件(.ktr)目录路径
- /level:Basic> 后边是你刚创建的job.log文件位置
注意:
如果你是要调度作业文件(.kjb),写的kitchen.bat脚本中pan.bat命令参数换成kitchen.bat
在你保存kitchen.bat时,选择ANSI编码格式,其他的会有乱码情况发生
三、完成kitchen.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