描述

客户项目需求场景需要使用定时任务去方便自己,方便他人,方便大家~不扯了,项目经理说,小王,把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)

在这里插入图片描述
粗心大意导致的 就是下图红色框框中的参数信息

  1. 主机名称:自己本机无线局域网适配器的 IPv4 地址
  2. 数据库名称 (这里是account)
  3. 端口号(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. 黑屏命令详细信息
  1. 切换到E盘
  2. cd 到success.bat的当前目录
  3. 使用kitchen命令执行转换文件
  4. 单独解释(下图)
    在这里插入图片描述

© 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. 查看信息是否成功
  1. 在文件中出现file.log.txt的日志文件
    在这里插入图片描述
  2. 黑屏命令是否显示成功界面
    结果为true、true、true
    在这里插入图片描述
  3. 刷新数据库验证
    这个时间验证其实不一定要和我的完全一样,因为前后时间相距太大,具体应用中可能等不了,因为我们的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路径也要更改
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
测试成功
在这里插入图片描述
呼,过程可能有点长,复杂,记录的算是比较详细了,因为这也是我第一次,噗哈哈哈,是不是很坑,边试验边写博客
在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐