kettle使用总结(一)

工作需要,临时接到需求说要做ETL,指定使用kettle。因此开启此番旅程。

需求:通过查询两个库的数据,经过关联后写入到第三个DB中,数据库都是使用的oracle。

一、简单介绍下kettle的工具使用

1、安装jdk并配置环境变量(kettle是java写的)

2、下载kettle工具包

https://community.hitachivantara.com/s/article/data-integration-kettle

(我自己没有下载,我的是我同事给我的,所以具体下载可参看别的博文)

 3下载后解压,根目录找到spoon.bat双击运行就启动了kettle的客户端

点击文件,右键->新建,可以选择创建作业还是转换,一般我的的主要任务是创建转换上

二、我的操作

1、创建一个转换:

  

(执行结果很好用,这里不做介绍,自己点点看看就能明白都是干啥的)

 1.1、首先创建连个输入

  1)在右侧导航栏选中核心对象,找到输入目录 ,下拉找到表输入

       

   选中拖拽到右侧工作面板

  右键编辑步骤/双击打开编辑

 通过点击“新建”创建数据库连接信息,这个没啥好说的,有点oracle基础都知道咋连,点点试试哈

  2)同理创建两个表输入

1.2、其次,我们要把查到的两个结果集合并起来,然后插入到第三个DB中

  1)我们选用的连接方式是"排序合并"

       

 2)这个连接方式要求在合并之前每个结果集要根据连接字段排序,所以要添加排序步骤

3)选中排序步骤,拖拽到工作区,同时选中表输入步骤和和排序步骤,右键“新建结点连接”

4) 同理处理两一个表输入的排序,这些步骤啥的没有顺序要求,你可以自己试试

5)配置合并步骤.截图很明白了,参考下

 1.3创建输出步骤

我这里选的是插入、更新组件(这里最好先建立结点连接,这样可以字段获取更新字段)

  

然后就完成了

 点击运行,成功,如果失败了可以查看“执行结果->日志”

2、如果想要放到linux上面运行,还需要创建作业,

  参看博文   https://blog.csdn.net/qq_38797366/article/details/83273862

三、我遇到的问题:

1、两库数据连接,先尝试使用了笛卡尔积连接,后来因为同事建议使用了“排序合并”,。具体原因没有深究,只是用了排序合并觉得满足需求就用了 

2、步骤隐藏,开始为了跑流程,使用输出的“表输出”步骤,后来改用更新/插入步骤,就把原来的表输出隐藏了(没有删掉是为了后续还想测试用),当时是好了,但是后面想用、想删的时候都找不到了,百度了下,具体步骤如下:

在转换工作台中找到主对象树—>步骤,所有的转换步骤都在这里了,找到被隐藏的步骤,拖拽到工作面板即可,或者直接删除

3、这里我因为好奇,在步骤右键点了share,结果执行转换的时候就报错了,这个share我也不知道是干啥的,也不知道为啥保存,解决方法百度收到了

到安装kettle的系统C盘目录下,如:C:UsersAdministrator.kettle下,找到shared.xml文件,打开删除<sharedobjects>结点间的数据,保存,重新运行即可。

参看    http://blog.sina.com.cn/s/blog_5ceb51480102yfdh.html

4、因为存入db的数据要记录create_time和modify_time字段,所以我在表输入的时候添加了create_time 字段的值

to_timestamp(to_char(sysdate,'YYYY-MM-DD HH24:MI:SS'),'YYYY-MM-DD HH24:MI:SS') as create_date

在执行完更新/插入步骤后又添加了一个sql执行的步骤,用来每次更新后为数据update modify_time

          

这里选择“执行每一行”,不然不做更新操作

结果发现执行转换的时候,不定期发生“检查到资源锁定”的问题,百度了下,因为每个步骤用一个事物,而且没有强制前面步骤执行commit后再执行后面步骤的事物,所以资源锁定了,我的解决很粗暴,就是放到同一个步骤里了,都放到表输入中了,这个是我业务需求对这个没啥要求,但是如果必须用单独的步骤,就要从新考虑下了

参看:

https://www.cnblogs.com/Bruce_H21/p/9993451.html

(其实我发现,是两个步骤同时使用了oracle的时间函数才会出现资源锁定的问题,如果只有一个步骤使用时间函数是不会出现这个问题的,具体原因未究)

5 kettle在表输入的查询脚本中,不支持“;”,分号会被识别成不支持的字符

6  在更新/插入步骤中,“用来查询的关键字” 不能存在 null 空值,不然插入更新不会报错,但是数据有问题,我的是之能一条一条的入库。

7、至此,kettle配置遇到的问题就解决完了,还有就是,使用kettle自带的定时任务据说不好用,我也只是通过命令行执行job时,发现是命令行任务,也就是如果关闭命令行,任务就停止了,其他方式我倒是没有研究,听从同事的建议,使用linux自带定时任务执行kettle执行命令。

附上执行命令,(记得要在kitchen.sh所在目录下执行哈)
./kitchen.sh -file=/app/kettle_project/test.ktr -level=Basic
./kitchen.sh -file=/app/kettle_project_update/test.kjb -level=Basic

关于linux配置定时任务,参看

https://www.cnblogs.com/intval/p/5763929.html

8、Couldn't find starting point in this job.

当执行./kitchen.sh -file=/app/kettle_project/test.ktr -level=Basic   直接执行转换的时候,发生了找不到开始点的问题,

网上有文章说是“-file必须执行job任务,将ktr任务放入kjb中,执行kjb”

参看: https://blog.csdn.net/qq_38797366/article/details/83273862

 总结下7和8的问题:

Linux的crontab,其实Job本身也支持定时,但是你必须保证图形界面一直开着,这样并不如crontab那么好。在命令行里使用kettle很简单,Job用kitchen调度,trans用pan调

9 其他资料:

http://www.kettle.net.cn/d   中文文档

https://www.cnblogs.com/jifeng/p/4741498.html 

-------------------------- 续

https://www.cnblogs.com/tianhaichao/p/13085378.html

原文地址:https://www.cnblogs.com/tianhaichao/p/12912264.html