Kettle定时任务调度
文章目录一、打开软件1.1 打开kettle1.2 打开SQL Server1.3 打开navicat1.3.1 navicat连接sqlserver准备sql server数据表(dept)准备sql server数据表(emp)1.3.2 navicat连接mysql1.4 可能出现的bug问题Error connecting to database: (using class org.gjt
描述
客户项目需求场景需要使用定时任务去方便自己,方便他人,方便大家~不扯了,项目经理说,小王,把kettle定时任务做一下!收到,old!继续看下文 ↓ 2022年6月28日17:10:20 维护翻新一下 本篇文章 从0-1的环境搭建kettle定时任务调度 需要有kettle环境、SQL Servler环境 都准备好的 可直接进入第四步骤 定时脚本的设置即可
😍一、软件、环境准备
下面需要做的事情就是模仿项目环境这里采用 SQL Server2012 建立连接数据到 navicat
打开kettle
作为程序员 合不合格先不说 那逼格的环境变量快捷键必须安排上!
打开SQL Server
打开navicat
navicat连接sqlserver
之所以使用navicat连接sqlserver 是因为方便查询数据的观看习惯,也可以不用连接直接kettle连接数据源即可
主机名称
主机地址
用户名、密码
测试连接
准备sql server数据表(dept)
新建account数据库
sql准备文件如下
/*
Navicat Premium Data Transfer
Source Server : 本机 SQL Server
Source Server Type : SQL Server
Source Server Version : 11003128
Source Host : 192.***.*.**:1433
Source Catalog : account
Source Schema : dbo
Target Server Type : SQL Server
Target Server Version : 11003128
File Encoding : 65001
Date: 20/12/2021 18:05:16
*/
-- ----------------------------
-- Table structure for dept
-- ----------------------------
IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[dept]') AND type IN ('U'))
DROP TABLE [dbo].[dept]
GO
CREATE TABLE [dbo].[dept] (
[id] nvarchar(255) COLLATE Chinese_PRC_CI_AS NULL,
[name] nvarchar(255) COLLATE Chinese_PRC_CI_AS NULL
)
GO
ALTER TABLE [dbo].[dept] SET (LOCK_ESCALATION = TABLE)
GO
-- ----------------------------
-- Records of dept
-- ----------------------------
INSERT INTO [dbo].[dept] ([id], [name]) VALUES (N'1', N'开发部')
GO
INSERT INTO [dbo].[dept] ([id], [name]) VALUES (N'2', N'市场部')
GO
INSERT INTO [dbo].[dept] ([id], [name]) VALUES (N'3', N'财务部')
GO
准备sql server数据表(emp)
/*
Navicat Premium Data Transfer
Source Server : 本机 SQL Server
Source Server Type : SQL Server
Source Server Version : 11003128
Source Host : 192.168.0.70:1433
Source Catalog : account
Source Schema : dbo
Target Server Type : SQL Server
Target Server Version : 11003128
File Encoding : 65001
Date: 20/12/2021 18:05:21
*/
-- ----------------------------
-- Table structure for emp
-- ----------------------------
IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[emp]') AND type IN ('U'))
DROP TABLE [dbo].[emp]
GO
CREATE TABLE [dbo].[emp] (
[id] nvarchar(255) COLLATE Chinese_PRC_CI_AS NULL,
[name] nvarchar(255) COLLATE Chinese_PRC_CI_AS NULL,
[gender] nvarchar(255) COLLATE Chinese_PRC_CI_AS NULL,
[salary] nvarchar(255) COLLATE Chinese_PRC_CI_AS NULL,
[join_date] nvarchar(255) COLLATE Chinese_PRC_CI_AS NULL,
[dept_id] nvarchar(255) COLLATE Chinese_PRC_CI_AS NULL
)
GO
ALTER TABLE [dbo].[emp] SET (LOCK_ESCALATION = TABLE)
GO
-- ----------------------------
-- Records of emp
-- ----------------------------
INSERT INTO [dbo].[emp] ([id], [name], [gender], [salary], [join_date], [dept_id]) VALUES (N'1', N'孙悟空', N'男', N'7200', N'2013/2/24', N'1')
GO
INSERT INTO [dbo].[emp] ([id], [name], [gender], [salary], [join_date], [dept_id]) VALUES (N'2', N'猪八戒', N'男', N'3600', N'2010/12/2', N'2')
GO
INSERT INTO [dbo].[emp] ([id], [name], [gender], [salary], [join_date], [dept_id]) VALUES (N'3', N'唐僧', N'男', N'9000', N'2008/8/8', N'2')
GO
INSERT INTO [dbo].[emp] ([id], [name], [gender], [salary], [join_date], [dept_id]) VALUES (N'4', N'白骨精', N'女', N'5000', N'2015/10/7', N'3')
GO
INSERT INTO [dbo].[emp] ([id], [name], [gender], [salary], [join_date], [dept_id]) VALUES (N'5', N'蜘蛛精', N'女', N'4500', N'2011/3/14', N'1')
GO
INSERT INTO [dbo].[emp] ([id], [name], [gender], [salary], [join_date], [dept_id]) VALUES (N'6', N'小白龙', N'男', N'3000', NULL, NULL)
GO
新建查询运行,显示结果如下
navicat连接mysql
创建数据库名称为kettle
字符集
排序规则
ok,tab + alt 快速切换到ketle中,新建转换,在右键分别建立SQL Server 和 navicat的DB连接
可能出现的bug问题
(1)connection is being used
初次连接设置好参数不会发生这个问题,但是如果是二次连接可能会出现的问题就是 点击测试连接 显示连接成功,点击确定的时候 却弹框显示错误信息如 connection is being used
解决办法:就是删除连接 再次重新连接一下 (未解问题,有一次没有删除连接,更改了下参数ip就好了)
(2) Error connecting to database: (using class org.gjt.mm.mysql.Driver)
出现这个错误是说我的kettle中没有连接mysql 的数据源(一个.jar文件包)
找到kettle的安装路径下的lib文件夹下 搜索mysql 是有的
但是我是通过navicat连接sql server 那么就是没有sql server的连接数据源才导致的这个错误
打个广告 → [kettle数据源汇总]
拿到这个.jar文件
放入到lib文件夹下,重启kettle的spoon.bat
新建转换——主对象数——新建DB
(3) Error connecting to database: (using class com.microsoft.sqlserver.jdbc.SQLServerDriver)
粗心大意导致的 就是下图红色框框中的参数信息
- 主机名称:自己本机无线局域网适配器的 IPv4 地址
- 数据库名称 (这里是account)
- 端口号(mysql 3306 sqlserver 1433 oracle 1521)
然后点击连接好的数据源 共享 加粗变黑即可
好,现在假设sql server是客户服务器的数据库
navicat是我们自己开发使用的数据库
现在需要做的就是在客户那边将定时任务设置好 所以才用我们的navicat本机连接客户服务器进行设置 只是模拟场景 当然kettle还是使用自己的本机kettle正常情况下是需要在客户服务器的kettle进行设置,windows就用可视化 linux就用黑屏命令这样,今天只是回顾一下流程 如果本篇博客没能让屏幕前的你足够明白,或者起到提示的作用的话,不是我的本意,说声抱歉
二、新建转换(.ktr)、作业(.kjb)
2.1 First转换(.ktr)
核心对象
中找到表输入
系统信息
2.1.1 表输入_配置详细配置
2.1.2 获取系统信息_详细配置
输出
中找到表输出
2.1.3 表输出_详细配置
这些信息填写、勾选好之后
单击右下角的SQL(因为在我的mysql数据库中并没有创建emp_mysql这张表)
(点击右下角的SQL)
执行——确定——关闭——确定
保存转化命名为first
执行一下 确认是否出错,没有问题继续
2.2 Seconed转换(.ktr)
新建转换
直接复制first中的三个控件
2.2.1 表输入_配置信息
2.2.2 获取系统信息_配置信息
同first转换 是一样的 为了记录执行的时间字段,无序更改
2.2.3 表输出_配置信息
(点击右下角的SQL)
执行——确定——关闭——确定
保存转换——运行试错
2.3 检查mysql中数据
数据库中查看抽取的数据、表、增加的nowdate字段是否有问题
三、 新建作业(.kjb)
新建一个作业 将两个转换合并为一个作业 即更新数据的时候 不需要执行两次转换只需要执行一次作业即可 保存为all 文件夹中显示扩展名为all.kjb
3.1 详细配置信息
没有很多 只是一个浏览将我们的的转换文件路径放进来就OK了
3.2 运行作业_试错
好,没有问题
四、定时任务调度
1.Windows用“任务计划程序”分别实现对“作业”、“转换”的定时调度。
2.Linux上用“crontab”分别实现对“作业”、“转换”的定时调度。
4.1 错误演示
其实第一次我想到很简单,就是在start那里直接设置重复,定时任务。但是,不行,是很不行。耍小聪明的后果就是,出bug,就,这里贴出来,希望大家不要跟我一样设置
错误示例图
解决
如果你跟我一样这样设置了
并不怎么行 这个地方设置之后 执行任务的时候 会一直卡在spoon-spoon那里
解决 重复取消勾选 类型选择不定时 然后重启spoon.bat手动运行即可
4.2 正确操作
注意:使用bat文件执行速度比执行在spoon.bat中执行慢很多
4.2.1 新建.bat文件
创建一个可运行的BAT文件,运行我们的kjb
我是在.ktr代码的上级目录新建一个.txt文件,然后将.txt重命名为success.bat
然后将我们的all.kjb文件剪切到和success.bat同级目录下
4.2.2 cmd中测试.kjb文件
之后
打开黑屏命令
A. 黑屏命令详细信息
- 切换到E盘
- cd 到success.bat的当前目录
- 使用kitchen命令执行转换文件
- 单独解释(下图)
© Microsoft Corporation。保留所有权利。
C:\Users\dell>e:
E:>cd E:\xun-lei-zhuomian\Kettle\workspace\5.数据
E:\xun-lei-zhuomian\Kettle\workspace\5.数据>kitchen /file E:\xun-lei-zhuomian\Kettle\workspace\5.数据\all.kjb /level Basic /logfile E:/xun-lei-zhuomian/Kettle/workspace/5.数据/file.log
…省略
…中间执行过程
开始执行命令
B. 查看信息是否成功
- 在文件中出现file.log.txt的日志文件
- 黑屏命令是否显示成功界面
结果为true、true、true
- 刷新数据库验证
这个时间验证其实不一定要和我的完全一样,因为前后时间相距太大,具体应用中可能等不了,因为我们的nowdate字段是datetime的时间类型,可以看分、秒进行测试验证,之后如果有需要在把时分秒去掉即可,(将datetime类型改为date即可)
C. 可能出现问题
报错了,是因为昨天那个ip今天不一样了 改了navicat忘记更改kettle中的DB连接了
编辑一下就好了
4.2.3 任务计划程序
(任务计划程序这个是适用于windows的服务器中的可视化界面操作,linux没有实际操作过,具体可自行百度,或者后面有用到再来添加,建议点赞+收藏)
打开
搜索
常规_创建基本任务任务
选择下一步
暂时先设置一次自动执行,如果成功,直接设置1天1次的自动执行任务调度,(后面过程熟悉,可直接跳过此测试步骤)
下一步
将我们新建的success.bat文件路径浏览到这里
点击完成
success.bat配置命令
噢噢噢 想起来,犯了一个很严重的问题就是,我把我的success.bat文件是放入到这个定时调度中,但是我的success.bat文件里面什么都没有啊,
我应该把我手动黑屏命令的启动命令放入到success.bat文件中让windows定时调度这个.bat文件执行里面的命令,这样就说的通了(命令就是前面引用的cmd命令但是不能有中文或者空格)
再次测试一下 定好时间11:17:00 将任务启动,出现问题了 执行.bat任务闪退,提示信息说系统找不到指定的路径,看到信息,应该是路径中有中文导致出错,把文件夹名字更改一下,还有success.bat中的中文名字空格也不能要
更改之后kettle里面的.kjb文件中的转换.ktr路径也要更改
测试成功
呼,过程可能有点长,复杂,记录的算是比较详细了,因为这也是我第一次,噗哈哈哈,是不是很坑,边试验边写博客
更多推荐
所有评论(0)