简介
Kettle是一款国外开源的ETL工具,纯java编写,可以在Window、Linux、Unix上运行,绿色无需安装,数据抽取高效稳定。支持图形化的GUI设计界面,然后可以以工作流的形式流转
环境
运行kettle 需要安装java jdk,1.5版本及以上。
解压到英文路径的文件夹中就可以了,不需要安装。
进入到Kettle目录,如果Kettle部署在windows环境下,双击运行*\kettle\spoon.bat
。
Kettle中有两类设计分别是:Transformation(转换)与Job(作业),Transformation完成针对数据的基础转换,Job则完成整个工作流的控制。
Transformation转换(*.kjb)
简单地说,一个转换就是一个ETL的过程
首先在左侧:主对象树--DB连接,新建数据库连接(以oracle为例)。
连接方式为Native(JDBC)时,右侧填写数据库连接信息,测试成功后,确认保存。
连接方式为JNDI时,在右侧JNDI名称处填写对应数据库名称即可。用的是配置文件中的连接信息。Windows下配置文件路径\kettle\simple-jndi\jdbc.properties
数据输入
然后点击“核心对象”下方则显示可以在转换中能使用的所有组件。点击“输入”--单击“表输入”把“表输入”组件往空白处拖入即可。
双击“表输入”组件弹出
步骤名称:默认为“表输入”,如果想规范化建议填写源表名称信息,以便清楚查询是某张表结构信息
数据库连接:选择数据来源数据源名称
SQL:编写查询源数据SQL脚本,可以通过“获取SQL查询语句…”获取。
允许简易转换:强烈建议默认
替换SQL语句里的变量:如果SQL语句中有使用到变量则需要勾选
从步骤插入数据:默认
执行每一行:默认
记录数量限制:0表示默认,如果有特殊需求可以自定义只查询出多少条记录数
注:在表输入的SQL语句中一定不能加入分号;
如果无法确定SQL语句是否正常时可以通过“预览”来查看SQL语句是否正确。
数据输出
拖入“表输出”后,我们通过按住“Shift”键单击源划向目标“表输出”,则会出现源指向目标的箭头线。双击“表输出”
步骤名称:默认为“表输入”,如果想规范化建议填写目标表名称信息,以便清楚查询是某张表结构信息
数据库连接:选择数据来目标数据源名称
目标模式:schema,Oracle数据库则是用户名。
目标表:从源数据输出到目标表名
提交记录数:设置数据库提交大小
裁剪表:清空目标表数据,相当于Oracle数据库Truncate语法
忽略插入错误:当插入数据库出错时则可以忽略
指定数据库字段:手动指定源与目标字段映射关系(表结构一致可不选)
数据库字段->获取字段:获取流里的字段
->输入字段映射:手动指定映射关系
按F9运行转换
Job作业(*.kjb)
Job名称:必须填写,并且唯一
转换文件名:必须填写,填写路径可以是绝对路径或者相对路径,最好是相对路径${Internal.Job.Filename.Directory}。
注:
1、在一个JOB中可以同时调用多个作业与转换,但切勿设计成死循环。
2、在一个JOB中必须只能有一个“START”组件。
3、在一个JOB中可以有N个“Success”组件。
转换以及作业的组件介绍
作业的样例
部分问题及解决:
- gbase数据下发到oracle,某些超长字段出现乱码
解决方法:数据库连接方式添加配置 gbaseserver;CLIENT_LOCALE=zh_CN.57372;DB_LOCALE=zh_CN.57372
如图:
- 组件更新删除较慢,解决办法使用sql脚本
- 部分oracle连接报错:Error connecting to database: (using class oracle.jdbc.driver.OracleDriver)Listener refused the connection with the following error:ORA-12505, TNS:listener does not currently know of SID given in connect descriptor
看这个报错可以猜测jdbc的连接串是使用sid去连的,让开发尝试使用sid去连,确实能连上。但由于pdb使用的是service_name,还需要找到使用service_name连接oracle数据库方法。
查询文档发现方法如下:
- 不需要填主机名
- 数据库名写如下连接字符串:(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = IP地址)(PORT = 1521))(CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = 服务名)))
- 端口号填:-1
-
在默认情况下,空字符串“”被认为与null相等。表输入“”,表输出报非空异常。
解决办法:配置文件kettle.properties 中新增KETTLE_EMPTY_STRING_DIFFERS_FROM_NULL = Y,
不加‘#’前缀 -
配置文件Jdbc.properties中,密码不能包含#,kettle版本问题,密码有#不能用这种方式
-
数据共享平台版本较老,循环不能超三百,否则容易内存溢出