zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    HTML5开发 桌面提醒功能
    自然框架总体设计
    Inversion of Logging
    Wind.js在移动跨平台框架PhoneGap中的异步体验
    MSBuild基本概念
    PortalBasic Web 应用开发框架:应用篇
    检测常见ASP.NET配置安全漏洞
    线程与进程的比较
    多层架构下的一个进销存项目
    Model Driven Architecture
  • 原文地址:https://www.cnblogs.com/tianhaichao/p/12912264.html
Copyright © 2011-2022 走看看