Kettle做定时任务有两种方式。
第一种是kettle自带的Start控件,缺点是kettle程序必须始终运行,浪费内存。
第二种是使用系统的定时功能。使用Kitchen、Pan命令编写bat、sh脚本,然后使用windows任务计划或者linux的crotab实现定时执行执行脚本。
(一)Start控件执行定时任务
我们需要建立一个job,来让转换定时执行。
操作步骤
1、运行软件,进入主界面。点击左上角的
文件 → 新建 → 作业(J)
新建一个作业(job),并保存,作业的后缀名为kjb。
2、点击面板左侧的
核心对象
,选择
通用
文件夹下的
START
和
转换
并把它拖到右侧的编辑区中,按住
shift
画线连接“START” 和“转换”。
3、双击编辑区的“START”图标,设置定时任务。记住勾选重复选项,不勾选,任务只会执行一次。
4、双击编辑区的“转换”图标,设置要定时执行的转换。
5、点击“Run”,选择“本地执行”,点击“执行”来执行这个转换。
6、等待设置的间隔时间后,正确执行效果如图
(二)系统定时执行脚本
前面我们介绍了 Kettle的Spoon的转换和作业定时任务GUI设计方式以及运行,但是在实际应用中,我们需要计划任务是在服务器后台运行。
首先我们需要了解Kettle的Kitchen和Pan
- Kitchen——作业(job)执行器 (命令行方式)
- Pan——转换(trasform)执行器 (命令行方式)
下面我们将重点讲解经常会用到的 ***作业执行器 Kitchen.bat *** 。参数项使用
/rep:参数值
或者
-rep=参数值
这两种方式都可以。
Kitchen 参数说明:
-rep:Repository name 任务包所在存储名
-user:Repository username 执行人
-pass:Repository password 执行人密码
-job:The name of the job to launch 任务包名称
-dir:The directory (don”t forget the leading / or )
-file:The filename (Job XML) to launch
-level:The logging level (Basic, Detailed, Debug, Rowlevel, Error, Nothing) 指定日志级别
-log:The logging file to write to 指定日志文件
-listdir:List the directories in the repository 列出指定存储中的目录结构。
-listjobs:List the jobs in the specified directory 列出指定目录下的所有任务
-listrep:List the defined repositories 列出所有的存储
-norep:Don”t log into the repository 不写日志
Windows编写Bat脚本文件
1、新建一个bat文件,命名job.bat,然后编辑,输入内容如下:
:: Kitchen.bat所在路径盘符
d:
:: Kitchen.bat所在目录? ? ?
cd D:\kettle\kettle-9.1\data-integration:: 作业(job)文件路径和日志文件路径
:: 执行kitchen执行job,并写入日志
kitchen /file:D:\kettle\kettle-workspace\03.kjb /level:Base>>D:\kettle\test.log
注意:确保路径的正确性。
windows bat文件中注释符为:: 使用notebook编辑时,记得编码改为ANSI编码,否则会乱码。
2、双击job.bat,即可运行。
3、后台运行脚本文件
我们已经建立了命令行运行的bat文件,并且已经可以正确执行我们的ETL任务了,但是现在我们在运行bat后,桌面上面会一直存在一个控制台的黑窗口,我们可以使用bat命令中的隐藏窗口的命令。
修改我们的job.bat文件
@echo off
if “%1” == “h” goto begin
mshta vbscript:createobject(“wscript.shell”).run(“%~nx0 h”,0)(window.close)&&exit
:begin
:: Kitchen.bat所在路径盘符
d:
:: Kitchen.bat所在目录? ? ?
cd D:\kettle\kettle-9.1\data-integration:: 作业(job)文件路径和日志文件路径
:: 执行kitchen执行job,并写入日志
kitchen /file:D:\kettle\kettle-workspace\03.kjb /level:Base>>D:\kettle\test.log
在此双击job.bat运行,我们将不会再看到控制台黑窗口继续保留在桌面上,并且等待设置的间隔时间后,我们可以看到日志文件记录。
···
2017/12/07 16:51:26 – Kitchen – Logging is at level : 基本日志
2017/12/07 16:51:26 – Kitchen – Start of run.
2017/12/07 16:51:31 – job2 – 开始执行任务
2017/12/07 16:51:31 – job2 – job2
2017/12/07 16:53:31 – job2 – 开始项[简单表同步]
2017/12/07 16:53:31 – 简单表同步 – Loading transformation from XML file [file:///D:/KettleProject/TEST2.ktr]
2017/12/07 16:53:31 – 简单表同步 – Using run configuration [Pentaho local]
2017/12/07 16:53:31 – 简单表同步 – Using legacy execution engine
2017/12/07 16:53:31 – TEST2 – 为了转换解除补丁开始 [TEST2]
2017/12/07 16:53:32 – 表输入.0 – Finished reading query, closing connection.
2017/12/07 16:53:32 – 表输入.0 – 完成处理 (I=3, O=0, R=0, W=3, U=0, E=0)
2017/12/07 16:53:32 – 插入 / 更新.0 – 完成处理 (I=3, O=0, R=3, W=3, U=1, E=0)
Windows定时执行Bat脚本
(1)写好bat批处理文件后,加到计划任务中。在windows的搜索栏中,搜索“计划任务”(不同版本不太一样),如图
(2)点击程序菜单项的操作,选择创建任务
(3)输入任务的名字,其他的用默认就好,然后点击操作选项卡
(4)点击新建,然后选择你创建的bat文件;最后点击确定,然后点 触发器选项卡;所谓的触发器就是你的定时器
(5)上面的开始任务下拉框可以进行选择,一般我们选择按预定计划;接下来选择频率,如每天,每月,每周;这个和用kettle自带功能一样,不再叙述;
Linux执行定时任务
linux脚本文件调用kitchen 和 pan去执行job和transformation文件,然后使用crontab定时执行sh脚本。
如果遇到无法链接存储库:解决方法将repository.xml放到与pan.sh等sh的同目录下。
1.创建目录
- 在opt下创建存放sh文件的目录kettleShs
- 在opt下创建存放log文件的目录kettleLogs
2.创建定时执行sh文件
直接上例子,以执行转换为例
#!/bin/bash
export JAVA_HOME=/opt/jdk1.8.0_191
export JRE_HOME=/opt/jdk1.8.0_191/bin
export PATH=$PATH:$JAVA_HOME/bincurrTime=$(date “+%Y-%m-%d-%H-%M-%S”)
jobName=”o2dh-”
logName=$jobName${currTime}.log
/opt/pdi-ce-7.1.0.0-12/data-integration/pan.sh -rep=localOrg -user=wst -pass=wst -dir=/99RS/O2DH -trans=3 -level=Detailed -logfile=/opt/kettleLogs/$logName
上面的环境变量必须要加,不然不能调起转换和作业。
- currTime是秒单位的系统时间和一个字符串拼接成的日志名称
- 最后一行是调用转换的命令行,具体参数通过帮助就可以了解到。
3.编辑定时计划
如果是用户级别的定时计划就编辑vim /etc/crontab,记得在时间参数和命令行中间加上用户
系统级别的定时计划命令是 crontab -e,添加定时任务
05 22 * * * /opt/kettleShs/o2dh.sh>/opt/kettleLogs/o2dh.log
我这里的意思是每天22点03分执行o2dh.sh,并写一个日志。
crontab知识补充:
crontab的命令构成为 时间+动作,其时间有
分、时、日、月、周
五种,操作符有
*
取值范围内的所有数字
/
每过多少个数字
–
从X到Z
,
散列数字例如:
每小时的第3和第15分钟执行 3,15 * * * * myCommand
4. 重启crontab服务
#centos
service crond restart#ubuntu
service cron restart
OK ,等待计划执行。
参看文章
程序员应该借助互联网实现知识的开放、分享。让编码没有困难,形成一个开放的知识圈。为此,谢谢大家的共享。