文章目录
- ETL是什么
- 下载安装kettle和mysql8
- 资源下载
- 数据库连接方式
- 已定义的数据库类型进行连接
- Generic Database方式连接
- JNDI方式
- 运行方式
- 使用案例教程
- 定时job执行增量插入转换
- 新建转换
- 新建定时任务job
- 关闭定时任务job
- 命令行运行定时任务job
- 命令行执行任务
- 后台运行脚本文件
- 设置系统变量和获取系统变量
- 获取系统变量
- 设置带参数的转换任务
- 参考文章
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
注意:
驱动这里填写mysql8的版本是: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.sh | Carte是一个轻量级别的 Web 容器,用于建立专用、远程的 ETL Server |
大多数我们都是使用GUI界面图标先执行一遍,没问题之后会使用命令行模式做定时任务执行
使用案例教程
已经有其他博主写了详细的使用案例教程
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
新建转换
-
新建-转换:输入选择-表输入
数据库连接选择前面创建的数据库连接;
SELECT * FROM log limit 5//这里模拟5条每次 -
新建输出:目标表直接填写log_1的表名
-
shift+连接,ctrl+s保存文件
4.测试点击下面的箭头运行:运行完成没有报红色异常,则可以看到log_1表中有五条数据了
新建定时任务job
-
新建-作业(J): 添加通用-START组件,配置调度为重复时间间隔为5分钟一次=每5分钟执行一次
还可以下拉选择按天重复执行;按天则天数可以编辑,否则就是按可编辑的时间重复 -
添加通用-转换:选择上一步创建的增量任务文件
-
shift+连线:保存job到本地
-
点击箭头执行,它会不停的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进程在运行
设置系统变量和获取系统变量
如果我们要查询的是前一天的数据,比如 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