首页 > 技术文章 > Kettle Introduction

sxjd 2014-01-17 23:07 原文

Kettle是一款开源ETL工具,使用纯Java编写,可以运行在windows、linux、unix系统。本身是绿色软件,无需安装即可直接运行。

本文介绍Kettle工具中基础转换的过程、转换流的建立、以及数据处理方式。旨在对Kettle工具做一个基本的说明,使初次接触Kettle的使用者可以尽快上手,减少研究时间。

一.Kettle概况

官方网站:http://kettle.pentaho.com/
Kettle运行环境要求JDK1.5或以上。从官网获取Kettle的压缩包,解压缩到本地,即具备了基本的运行环境,双击Spoon.bat即可运行。
初次运行kettle会提示设置资源库。资源库是Kettle用于存储数据转换间生成信息的数据库,不是必须配置,可以略过。不配置资源库,kettle生成的转换步骤将以.ktr或.kjb后缀保存为文件。

Kettle的转换是由多个独立的步骤组成,每个步骤在kettle中相当于一个独立的处理模块。将这些模块连接到一起,按照一定的顺序处理数据,就形成了一个标准的kettle处理流程,我们暂时把这个流程叫做kettle流。

kettle流分为两类:Job和Transformation。
Transformation类的流负责数据处理和转换,Job负责调度控制transformation流。一般情况下,transformation流即可满足数据处理的需求,job类的应用对于单纯的数据处理来说比较少。

二.设计一个Kettle流

Kettle流的设计都在Spoon中进行。Spoon相当于一个设计器,以图形化的界面与用户交互。界面如下图

 

操作界面左侧是预置步骤的列表,右侧空白部分是Kettle的设计区。可以通过鼠标拖拽的方式将步骤拖到设计区中。

本小节中将以一个从excel文件导入数据至数据库的场景为例,进行说明。

整个Kettle流的步骤设计如下。在这个数据流中,可以清楚的看到从读取数据到数据输出进行的每一个步骤。

 

步骤“Excel输入”处理数据源,步骤“插入/更新”用于输出数据。中间的步骤都是数据转换,“插入/更新”步骤之后的是容错处理。

如果没有容错处理,在kettle运行出现异常时,整个流会直接停止,所以一般情况下kettle流需要加入容错处理的步骤。

 

在Excel输入步骤中,需要配置的项目包含在各个选项卡中。必须的配置项为:文件路径,字段选择,工作表指定。
在“文件”选项卡中指定文件路径,在“工作表”选项卡中指定要读取excel文件中的工作表名称,在“字段”选项卡中指定要获取的excel字段名称。
除了这些必须的配置外,对于特殊字符集的excel表格,还应在“内容”选项卡中去定义文件所使用的字符集,以免读取数据时产生乱码,影响后续步骤的处理。

设置好之后,可以点击该步骤中的“预览记录”按钮,预览kettle所获取的结果,确保没有乱码情况发生。

数据输入端的设置完成后,可以安排数据转换步骤。示例流中,第一个转换步骤是“构造IDS中的数据”,这个步骤原名是“Modified Java Script Value”,可以从左侧栏的脚本文件夹中直接获取。
为了使此步骤获取上一步的数据,还需要将步骤连接。操作上,按住shift键,再用鼠标左键从上一个步骤向当前步骤拖拽即可。
该步骤主要用于执行脚本,以使数据满足转换的需求。

 

双击步骤图标可以进入编辑状态。窗口左侧显示着当前步骤从前面步骤获取的数据输入和输出,蓝色框中是Kettle所支持的Script脚本。
每个脚本会有一个Sample,来示范如何使用。在方法名上点击右键,即可获得查看sample的菜单。
Script脚本的引擎是Mozilla Rhino,提供一种类似Java语言的语法规则。

本步骤中的脚本只是声明了一些变量,给定了一个初始化值。新声明的变量如果要传递到下一个步骤,需要点击“获取变量”按钮,将新变量增加到列表中。
脚本完成之后需要测试,点击测试脚本按钮保证步骤中无语法问题。否则在kettle流执行过程中会报错停止。

对于每个步骤,还可以在spoon的设计界面右键点击步骤图标,选择“显示输出字段”,来查看是否正确传递数据。

 

数据转换的过程往往需要属性映射,此步骤负责处理数据的类型转换、重命名。
建议将一个数据流中的映射关系在唯一的一个步骤中维护,其他步骤中尽量不要重命名或进行类型转换,会给设计和调试带来麻烦。

Kettle本身会处理一些数据类型的转换,通常读入的数据都以String类型传递。
在数据输出端,有时会对数据类型有强制性的要求,类型转换也是为了更好的适应数据输出的需求,如int转long型、处理MySQL中的bit类型等。

此步骤处理了MySQL中的bit类型。数据类型转换在“元数据”选项卡中设置。为了把数值写入MySQL中bit类型的字段,在Kettle中直接将数据类型转换为Integer。
Integer实际上是将1解析为true,将0解析为false,也正好符合MySQL中bit类型的设定。设定之后,数据才可以正常写入到MySQL数据库。

在实际的操作中,如果步骤中的类型转换不满足需求,也可以单独添加脚本转换的步骤,去转换数据格式。
经过该步骤的转换之后,从输入端读取的数据将会按照新设定的类型和名称进行传递。

 

插入/更新作为本Kettle流的输出端,执行数据库操作,将处理完的数据写入数据库表。
在Kettle中,还预置了很多其他类型的输出,可以根据使用中的实际情况进行调整。

在本步骤中,先要求指定一个数据库连接,再确定关联规则。关联规则是数据库操作中很重要的一点,Kettle流的执行要依靠关联规则来判断执行的操作。
把“不执行任何更新”勾选之后,该步骤会变成一个Add Only操作的步骤。同样的,对于每一个字段,可以设定是否需要进行update,以此来对操作进行细粒度的控制。

对于数据迁移的场景来说,一般情况下需要限定步骤操作为Add Only。这样操作能保证执行速度,还不会对现有数据产生影响。

实际的执行过程中,如果遇上数据库有约束,如:username字段值必须唯一,在写入重复值时,Kettle会抛出异常,自动终止流的执行。
这种情况并不是所期望的,为了使Kettle在有异常出现时继续执行,还需要设定异常处理规则。

右键单击“插入/更新”步骤,选择“定义错误处理”,在弹出的窗口中勾选“启用错误处理”。

错误处理需要指定当错误发生之后,流中的错误记录向哪个步骤输出。
同时,可以将错误列明、错误代码等参数作为流中的一个新字段进行传递。

错误描述列名比较重要。这个字段可以记录输出过程中数据库操作失败的原因,通过记录,可以很方便的找到错误位置。

 

如果需要按照某种规则分离kettle流的走向,可以使用“过滤记录”步骤。

在condition框中,可以设置条件。Kettle提供了很多函数,也支持多层嵌套。对True和False两种不同情况,可以分别指定到不同的步骤,以此完成流的分离。
在这个过滤步骤中,将数据库操作错误和其他错误分离。分离规则是:错误记录starts with "org.pentaho.di.core.exception.KettleDatabaseException"

实际使用中可以根据不同的规则去过滤数据,并且,过滤步骤可以用在流的任何一个位置。

 

Excel输出步骤用于将前面传输的数据记录成excel格式,方便查阅。
此步骤中,定义要输出的文件路径、文件名、字段、字符编码格式、工作表名称,即可输出成一个模式化的excel文件。

至此,一个完整的Kettle流设计完成,等待校验和运行。

三.校验和调试Kettle流

Kettle流在设计完成,正式执行前,需要进行校验。有错误的流是无法走通的。

 

点击图中的按钮即可进行校验。校验的结果中,若出现红色信息,则必须进行重新检查,黄色信息可以忽略,不影响流的执行。
排除掉所有错误之后,可以开始进行kettle流的调试。

Kettle中的调试支持设置条件作为断点的方式。点击Debug this transformation按钮,将弹出调试设定。
可以流中的每个步骤设置断点条件,如:该步骤获取10行数据之后,整个流暂停。
通过这样的调试方法,可以检验数据在转换过程的关键步骤是否正确,以确保整个流执行的准确性。

需要注意的一点是,如果在输出步骤中设置断点,输出步骤将进行数据库操作,会将实际数据写入数据库。
在执行下一次调试之前,建议将本次调试写入的数据清除,以免两次调试间相互影响。

在校验和调试都确认无误之后,可以运行Kettle流,执行完整的数据转换过程。

四.性能调优

1.运行环境优化

kettle启动时默认的内存分配不多,如果进行大数据量的运算,后期处理速度会越来越慢。此时需要更改kettle启动时的配置项,设置执行Kettle使用JVM的最大堆。

编辑Spoon.bat文件,查找set OPT=%PENTAHO_DI_JAVA_OPTIONS%,在这之后,添加-Xmx1300m,保存,退出,即可。此处1300m是参考值,可根据实际情况更改。
该设置曾用于一个16G内存的服务器上,执行效率是采用默认设置执行的3倍。

2.输入端优化

在Kettle流的输入端,一般可以由kettle自动生成数据获取的语句。生成的语句一般都是取数据的全集,很多时候我们往往只需要数据的子集。处理全集数据必然要比处理子集数据花去更多时间。
为了提高效率,最好在数据输入端,就制定筛选条件,如:数据库输入,可以使用条件限定;excel输入,指定工作表。

对大数据量的处理,在转换开始前进行条件筛选尤为重要。

3.转换步骤选取

如果要处理的数据量很大,应尽量避免在转换过程中出现排序、查重、复杂关联、复杂比较等对系统资源开销较大的操作。复杂JavaScript脚本也应该尽可能的减少。
大数据量处理,建议在正式数据处理前对原始数据先进行一些必要的梳理。将原始数据的内容进行归类,整理,再去规划数据处理方法。

五.使用中的Tip(随时补充)

1.数据库cache

kettle会将第一次读取的数据库结构生成缓存,当数据库结构变化时,kettle仍然会按照缓存中的结构去预判数据库内容。此时需要清理数据库cache。
方法:菜单->Tools>Database->Clear Cache

2.数据库字段多值处理的bug

需要多值处理的场景:

userid

username

1

trs

2

trs

3

trs

以关联规则username=trs查找目标数据库,数据库中不同uid对应着多个同样的username=trs记录。
按照Kettle的执行流程,只会获取最后一个匹配的userid,即流中的userid=3。

这是一个已知bug,在kettle使用过程中需要注意。

六.资源

Kettle官网:http://kettle.pentaho.com/
FAQ:http://wiki.pentaho.org/display/EAI/Frequently+Asked+Questions
Online Documentation:http://wiki.pentaho.com/display/EAI/Latest+Pentaho+Data+Integration+%28aka+Kettle%29+Documentation

推荐阅读