kettle spoon创建带参数定时任务并关闭它

ETL是什么

ETL,是英文Extract-Transform-Load的缩写,用来描述将数据从来源端经过抽取(extract)、转换(transform)、加载(load)至目的端的过程。ETL一词较常用在数据仓库,但其对象并不限于数据仓库;

通俗讲:将数据从一种存储介质或者格式转换为另一种存储介质或者格式的过程;

下载安装kettle和mysql8

两种下载方式

  • 官网下载kettle,需要在官网填写注册信息,下载的会是最新版本的kettle,2021.3.19日官网最新9.1版本。官网地址
  • 百度搜索下载kettle的地址,可能版本不是最新。下载kettle地址。最新版本8.2。

安装步骤

Kettle是纯Java编写的ETL开源工具,目前Kettle7和Kettle8都需要Java8或者以上才能正常运行。所以开运行Kettle前先检查Java环境是否正确配置,Java版本是否是8或者以上。

  • Kettle可在linux、windows上安装,本文基于windows安装
  • 直接解压缩到指定目录下,双击Spoon.bat运行
  • 如果需要连接数据库。下载连接指定数据库需要的jar文件。直接搜索下载即可。比如连接oracle数据库,搜索下载 java连接oracle的jar包,数据库官网一般都有的下载。

资源下载

kettle的安装与连接mysql(包含mysql8)简单使用,
kettle安装下载地址:
官网地址:
https://community.hitachivantara.com/s/article/data-integration-kettle

下载地址:
https://sourceforge.net/projects/pentaho/files/

  • 下载mysql8.0的jar驱动
    https://mvnrepository.com/artifact/mysql/mysql-connector-java/8.0.19

  • 将下载好的mysql的驱动放到kettle安装文件中的lib下面,然后重启Spoon

使用kettle之前要确保jdk安装配置环境变量完成。

新版本的可以支持mysql8了,但是我这里是服务器上已经有7.0的版本了默认只支持mysql8以下的版本驱动,主要是驱动名称无法手动修改,因此需要mysql8只能通过其他方式;
这里主要使用通用数据库方式和JNDI方式;个人推荐第一种

数据库连接方式

除了系统已经提供的数据库类型选择进行数据库连接外,通常有些数据库没有已有定义,但是系统提供了通用连接可以创建未曾加入的数据库类型。

已定义的数据库类型进行连接

已经定义的数据库类型是已经默认设置了驱动名称的,只需要手动输入数据库地址和账号密码即可。但是如果是低版本的,mysql数据库只支持mysql7以下的(包括mysql7),不支持mysql8。这里就不适用已定义的数据库类型了,需要选择其他方式创建连接。
在这里插入图片描述

Generic Database方式连接

  • 创建kettle数据库连接
    数据库类型选择Generic Database

注意:
驱动这里填写mysql6之后的版本是:com.mysql.cj.jdbc.Driver
mysql6之前的驱动是:com.mysql.jdbc.Driver
在这里插入图片描述

JNDI方式

这钟方式我没有连接成功,配置还是明文方式不太建议
参考原文
https://www.cnblogs.com/sakura–/p/11443491.html

运行方式

名称功能
Spoon.bat / spoon.sh(重点)通过图形接口,允许你通过图形界面来设计 ETL 转换过程(Transformation)
Pan.bat / pan.sh运行转换的命令行工具-命令行模式运行
Kitchen.bat / kitchen.sh运行作业的命令行工具-命令行模式运行
Carte.bat / Carte.shCarte是一个轻量级别的 Web 容器,用于建立专用、远程的 ETL Server

大多数我们都是使用GUI界面图标先执行一遍,没问题之后会使用命令行模式做定时任务执行

‘kitchen’是启动‘.kjb’文件;而 ‘pan’是启动‘.ktr’文件;

启动脚本实例:

:: 启动job脚本
d:
cd D:\devtools\kettle\pdi-ce-8.2.0.0-342\data-integration
kitchen.bat /file=E:/测试数据抽取/test.kjb /level=Basic /logfile=D:/日志文件/logfile/测试任务.log

启动转换任务:

 d:
cd D:\devtools\kettle\pdi-ce-8.2.0.0-342\data-integration
pand.bat /file=E:/测试数据抽取/test.ktr /level=Basic /logfile=D:/日志文件/logfile/测试任务.log

使用案例教程

已经有其他博主写了详细的使用案例教程
https://www.jianshu.com/nb/19605161

插入
插入更新:https://www.jianshu.com/p/720529e627c0

执行成功发送邮件:https://blog.csdn.net/qq_42025798/article/details/127263507

高级-自定义插件
https://blog.csdn.net/u013468915/category_8043286.html

定时job执行增量插入转换

这里以mysql为例,创建一个表log,复制该表为log_1
给log插入N条数据;
目的是从log表中获取增量数据插入到log_1表中

  • 先创建转换任务
  • 再创建定时任务job
新建转换
  1. 新建-转换:输入选择-表输入
    数据库连接选择前面创建的数据库连接;
    在这里插入图片描述
    SELECT * FROM log limit 5//这里模拟5条每次

  2. 新建输出:目标表直接填写log_1的表名
    在这里插入图片描述

  3. shift+连接,ctrl+s保存文件
    在这里插入图片描述

4.测试点击下面的在这里插入图片描述箭头运行:运行完成没有报红色异常,则可以看到log_1表中有五条数据了
在这里插入图片描述

新建定时任务job
  1. 新建-作业(J): 添加通用-START组件,配置调度为重复时间间隔为5分钟一次=每5分钟执行一次
    在这里插入图片描述
    还可以下拉选择按天重复执行;按天则天数可以编辑,否则就是按可编辑的时间重复

  2. 添加通用-转换:选择上一步创建的增量任务文件
    在这里插入图片描述

  3. shift+连线:保存job到本地
    在这里插入图片描述

  4. 点击箭头执行,它会不停的5分钟一次执行,查看执行结果,绿色START开始-黑色START结束
    在这里插入图片描述

关闭定时任务job

一旦启动它会一直再进程中运行,如果要关闭只能在进程中选择右键-结束进程来关闭它
这里带来一个问题就是,我无法从进程中判断它是哪个java项目的进程(因为开的java服务比较多),因此还是推荐有窗体的更直观,除非服务很稳定之后不需要再关闭了

在这里插入图片描述

命令行运行定时任务job

前面我们介绍了 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所在目录
set ROOT_DIR=D:\workspace\IDE\kettle
cd %ROOT_DIR%

:: 作业(job)文件路径和日志文件路径
:: 执行kitchen执行job,并写入日志
kitchen /file:%ROOT_DIR%\spd-job.kjb /level:Base>>%ROOT_DIR%\logs\test.log

双击运行,可以看到我们之前被清空的log_1中有数据进来了

注意:确保路径的正确性。windows bat文件中注释符为:: 使用notebook编辑时,记得编码改为ANSI编码,否则会乱码。

后台运行脚本文件

我们已经建立了命令行运行的bat文件,并且已经可以正确执行我们的ETL任务了,但是现在我们在运行bat后,桌面上面会一直存在一个控制台的黑窗口,我们可以使用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所在目录
set ROOT_DIR=D:\workspace\IDE\kettle
cd %ROOT_DIR%

:: 作业(job)文件路径和日志文件路径
:: 执行kitchen执行job,并写入日志
kitchen /file:%ROOT_DIR%\spd-job.kjb /level:Base>>%ROOT_DIR%\logs\test.log
    

启动后可以看到是没有黑色的命令行窗体的,但是任务管理器中的进程有个Java进程在运行
在这里插入图片描述
提一嘴:如果有多个java项目运行这里是很难区分谁是谁的,那么就要点开详细配合命令查看进程ID了
根据启动项我们就可以很容易区分具体是哪个项目,然后在任务管理器的详细中根据PID杀进程关闭服务

# 会列出所有jvm进程和对于的PID  启动项运行的jar
jcmd -l 

设置系统变量和获取系统变量

如果我们要查询的是前一天的数据,比如 jf_dattime = ‘2024-01-02’,这个日期每次运行的时候都是变化的,怎么设置变参;
获取参数方式

  • 或许系统参数,可选项比较少基本都是日期类型而且不一定符合比如yyyy-mm-dd就没有这种格式,而且不支持格式转换
  • 使用脚本设置变量获取,支持java,javaScript脚本
获取系统变量

在作业中创建-输入-获取系统信息,设置为获取昨天
在这里插入图片描述

同时加入如下组件,这里设置变量是从javascript中获取的day值给系统变量day;

在这里插入图片描述

脚本:

Date.prototype.Format = function (fmt) { //author: meizz 
    var o = {
        "M+": this.getMonth() + 1, //月份 
        "d+": this.getDate(), //日 
        "h+": this.getHours(), //小时 
        "m+": this.getMinutes(), //分 
        "s+": this.getSeconds(), //秒 
        "q+": Math.floor((this.getMonth() + 3) / 3), //季度 
        "S": this.getMilliseconds() //毫秒 
    };
    if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
    for (var k in o)
    if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
    return fmt;
}
//前一天的时间
var dtNew=new Date(new Date().getTime()-1*24*60*60*1000).Format("yyyy-MM-dd");

从js中获取的dtNew值重命名为本地变量day,为的是下一步赋值给系统变量day;为了少走弯路我这里没注意有没有什么要重命名;先这样
在这里插入图片描述

最后添加获取变量主要是为了展示当前的系统变量值是多少
在这里插入图片描述

运行看结果:可以看到这里的值既不是系统变量中获取的0000结尾的格式也不是默认值111,说明获取正确
在这里插入图片描述

设置带参数的转换任务

修改转换任务输入的sql脚本如下,可以看到day是参数模式,需要勾选下面的替换sql变量选项;

SELECT * FROM his_qnz_jf_log WHERE  DATE_FORMAT(Jfsj,'%Y-%m-%d') ='${day}'

在这里插入图片描述

接着把上面一步中设置环境变量和或许环境变量的图直接拷贝过来如下图;
在这里插入图片描述

运行结果可以看到把昨天日期的数量导入到log_1表中了,如果中间day的结果不是yyyy-mm-dd格式,这个个sql都查不到数据,log_1也会没有数据;

而job中不需要设置参数,保存仍然可以自己跑就行了;当然还有一些情况是job中需要携带 配置信息的,这种;目前没用到资料我就不找了。

参考文章

命令行运行kettle任务:https://blog.csdn.net/qq_22310551/article/details/115163517
获取系统变量和js设置系统变量脚本: https://blog.csdn.net/m0_69235938/article/details/127528576

  • 23
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值