kettle使用总结
Posted tianhaichao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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配置遇到的问题就解决完了,还有就是,使用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
6、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/ 其他资料:
https://www.cnblogs.com/jifeng/p/4741498.html
以上是关于kettle使用总结的主要内容,如果未能解决你的问题,请参考以下文章