什么是Kettle

Kettle是一款国外开源的ETL工具,纯java编写,可以在Window、Linux、Unix上运行,绿色无需安装,数据抽取高效稳定。

Kettle 中文名称叫水壶,该项目的主程序员MATT 希望把各种数据放到一个壶里,然后以一种指定的格式流出。

Kettle这个ETL工具集,它允许你管理来自不同数据库的数据,通过提供一个图形化的用户环境来描述你想做什么,而不是你想怎么做。

Kettle中有两种脚本文件,transformation和job,transformation完成针对数据的基础转换,job则完成整个工作流的控制。

作为Pentaho的一个重要组成部分,现在在国内项目应用上逐渐增多。

Kettle :Kettle is an acronym for “Kettle E.T.T.L. Environment”. This means it has been designed to help you with your ETTL needs: the Extraction, Transformation, Transportation and Loading of data

Kettle 是”Kettle E.T.T.L. Envirnonment”只取首字母的缩写,这意味着它被设计用来帮助你实现你的ETTL 需要:抽取、转换、装入和加载数据;翻译成中文名称应该叫水壶,名字的起源正如该项目的主程序员MATT 在一个论坛里说的哪样:希望把各种数据放到一个壶里然后以一种指定的格式流出。


kettle的相关知识

Kettle工程存储方式有两种:一种是以XML形式存储,一种是以资源库方式存储。

Kettle中有两类设计分别是:Transformation(转换)与Job(作业),Transformation完成针对数据的基础转换,Job则完成整个工作流的控制。

Kettle常用三大家族:Spoon、Pan、Kitchen。
Spoon:通过图形界面方式设计、运行、调试Job与Transformation。
Pan: 通过脚本命令方式来运行Transformation。
Kitchen: 通过脚本命令方式来运行Job,一般就是通过调用Kitchen脚本来完成定时任务。

目前Kettle有两种版本:一种是社区版(免费),一种是企业版(收费)。


相关网站

kettle官网

https://community.hds.com/docs/DOC-1009855

开源中文社区

http://www.ukettle.org/

Kettle的一些组件的使用方法
http://wiki.pentaho.com/display/EAI/Pentaho+Data+Integration+Steps

Spoon User Guide文档
http://wiki.pentaho.com/display/EAI/Spoon+User+Guide

JAVASCRIPT组件的使用
https://developer.mozilla.org/en/JavaScript

Kettle社区版下载
http://community.pentaho.com/

Kettle企业版下载
http://www.pentaho.com/

Kettle调度使用方法
http://wiki.pentaho.com/display/EAI/Kitchen+User+Documentation


Kettle的安装与配置


下载安装

可以从http://kettle.pentaho.org下载最新版的 Kettle软件 ,同时,Kettle 是绿色软件,下载后,解压到任意目录即可。

目前Kettle的最新版本是7.1。

[QQ截图20171115145036.png]

由于Kettle 是采用java 编写,因此需要在本地有JVM 的运行环境。

安装完成之后,点击目录下面的kettle.exe 或者spoon.bat 即可启动kettle 。在启动kettle 的时候,会弹出对话框,让用户选择建立一个资源库。

资源库:是用来保存转换任务的, 它用以记录我们的操作步骤和相关的日志,转换,JOB 等信息。用户通过图形界面创建的的转换任务可以保存在资源库中。资源库可以是各种常见的数据库,用户通过用户名/ 密码来访问资源库中的资源,默认的用户名/ 密码是admin/admin. 资源库并不是必须的,如果没有资源库,用户还可以把转换任务保存在 xml 文件中。


配置环境变量

前提是配置好Java的环境变量,因为他是java编写,需要本地的JVM的运行环境

配置Java环境变量可参考:

java实战(一)———–jdk环境配置

http://blog.csdn.net/zzq900503/article/details/9770237

在系统的环境变量中添加KETTLE_HOME变量,目录指向kettle的安装目录:D:kettledata-integration(具体以安装路径为准)

新建系统变量:KETTLE_HOME

变量值: D:kettledata-integration(具体以安装路径为准,Kettle的解压路径,直到Kettle.exe所在目录)

选择PATH添加环境变量:
变量名:PATH
变量值:% KETTLE_HOME%;


Kettle的基本概念


作业(job)

负责将[转换]组织在一起进而完成某一块工作,通常我们需要把一个大的任务分解成几个逻辑上隔离的作业,当这几个作业都完成了,也就说明这项任务完成了。
1.Job Entry:一个Job Entry 是一个任务的一部分,它执行某些内容。
2.Hop:一个Hop 代表两个步骤之间的一个或者多个数据流。一个Hop 总是代表着两个Job Entry 之间的连接,并且能够被原始的Job Entry 设置,无条件的执行下一个Job Entry,
直到执行成功或者失败。
3.Note:一个Note 是一个任务附加的文本注释信息。

[20150731100322126.png]


转换(Transformation)

定义对数据操作的容器,数据操作就是数据从输入到输出的一个过程,可以理解为比作业粒度更小一级的容器,我们将任务分解成作业,然后需要将作业分解成一个或多个转换,每个转换只完成一部分工作。

1.Value:Value 是行的一部分,并且是包含以下类型的的数据:Strings、floating point Numbers、unlimited precision BigNumbers、Integers、Dates、或者Boolean。
2.Row:一行包含0 个或者多个Values。
3.Output Stream:一个Output Stream 是离开一个步骤时的行的堆栈。
4.Input Stream:一个Input Stream 是进入一个步骤时的行的堆栈。
5.Step:转换的一个步骤,可以是一个Stream或是其他元素。
6.Hop:一个Hop 代表两个步骤之间的一个或者多个数据流。一个Hop 总是代表着一个步骤的输出流和一个步骤的输入流。
7.Note:一个Note 是一个转换附加的文本注释信息。

[20150731100444900.png]


kettle界面和组件


组件树

[16111335-426e4574119247e5b8f26c292c4aecc8.png]

Main Tree菜单列出的是一个transformation中基本的属性,可以通过各个节点来查看。

DB连接:显示当前transformation中的数据库连接,每一个transformation的数据库连接都需要单独配置。

Steps:一个transformation中应用到的环节列表

Hops:一个transformation中应用到的节点连接列表 

[16110248-122384aad21546e4b714d608351a8487.png]

Core Objects菜单列出的是transformation中可以调用的环节列表,可以通过鼠标拖动的方式对环节进行添加。

Input:输入环节

Output:输出环节

Lookup:查询环节

Transform:转化环节

Joins:连接环节

Scripting:脚本环节


Transformation转换介绍

ž每一个环节可以通过鼠标拖动来将环节添加到主窗口中。
ž并可通过shift+鼠标拖动,实现环节之间的连接。
[16110508-70ea8eff6c78442689e74d1d9f10de7f.png]


转换常用环节介绍

类别

环节名称

功能说明

Input

文本文件输入

从本地文本文件输入数据

表输入

数据库表中输入数据

获取系统信息

读取系统信息输入数据

Output

文本文件输出

将处理结果输出到文本文件

表输出

将处理结果输出到数据库

插入/更新

根据处理结果对数据库表机型插入更新,如果数据库中不存在相关记录则插入,否则为更新。会根据查询条件中字段进行判断

更新

根据处理结果对数据库进行更新,若需要更新的数据在数据库表中无记录,则会报错停止

删除

根据处理结果对数据库记录进行删除,若需要删除的数据在数据库表中无记录,则会报错停止

Lookup

数据库查询

根据设定的查询条件,对目标表进行查询,返回需要的结果字段

流查询

将目标表读取到内存,通过查询条件对内存中数据集进行查询

调用DB存储过程

调用数据库存储过程

Transform

字段选择

选择需要的字段,过滤掉不要的字段,也可做数据库字段对应

过滤记录

根据条件对记录进行分类

排序记录

将数据根据某以条件,进行排序

空操作

无操作

增加常量

增加需要的常量字段

Scripting

Modified Java Script Value

扩展功能,编写JavaScript脚本,对数据进行相应处理

Mapping

映射(子转换)

数据映射

Job

Sat Variables

设置环境变量

Get Variables

获取环境变量


Job任务介绍

[16110840-efb01c2350aa4c088134be8ec95a97b8.png]

Main Tree菜单列出的是一个Job中基本的属性,可以通过各个节点来查看。

DB连接:显示当前Job中的数据库连接,每一个Job的数据库连接都需要单独配置。

Job entries:一个Job中引用的环节列表

[16110937-714fc7583da747d98c538edc86c465c1.png]

Job entries菜单列出的是Job中可以调用的环节列表,可以通过鼠标拖动的方式对环节进行添加。

每一个环节可以通过鼠标拖动来将环节添加到主窗口中。

并可通过shift+鼠标拖动,实现环节之间的连接。


常用环节介绍

类别

环节名称

功能说明

Job entries

START

开始

DUMMY

结束

Transformation

引用Transformation流程

Job

引用Job流程

Shell

调用Shell脚本

SQL

执行sql语句

FTP

通过FTP下载

Table exists

检查目标表是否存在,返回布尔值

File exists

检查文件是否存在,返回布尔值

Javascript

执行JavaScript脚本

Create file

创建文件

Delete file

删除文件

Wait for file

等待文件,文件出现后继续下一个环节

File Compare

文件比较,返回布尔值

Wait for

等待时间,设定一段时间,kettle流程处于等待状态

Zip file

压缩文件为ZIP包


Kettle 基本使用


Kettle 的几个子程序的功能和启动方式

Spoon.bat: 图形界面方式启动作业和转换设计器。
Pan.bat: 命令行方式执行转换。
Kitchen.bat: 命令行方式执行作业。


转换和作业

Kettle 的 Spoon 设计器用来设计转换(Transformation)和 作业(Job)。
•转换主要是针对数据的各种处理,一个转换里可以包含多个步骤(Step)。
•作业是比转换更高一级的处理流程,一个作业里包括多个作业项(Job Entry),一个作业项代表了一项工作,转换也是一个作业项。


输入步骤简介

输入类步骤用来从外部获取数据,可以获取数据的数据源包括,文本文件(txt,csv,xml,json)数据库、 Excel 文件等桌面文件,自定义的数据等。对特殊数据源和应用需求可以自定义输入插件。 例子:生成随机数步骤


转换步骤简介

转换类步骤是对数据进行各种形式转换所用到的步骤。例如:字段选择、计算器、增加常量


流程步骤简介

流程步骤是用来控制数据流的步骤。一般不对数据进行操作,只是控制数据流。 例如:过滤步骤


连接步骤简介

连接步骤用来将不同数据集连接到一起。 例如:笛卡尔乘积


输出步骤简介

输出步骤是输出数据的步骤,常见的输出包括文本文件输出、表输出等,可以根据应用的需求开发插件以其他形式输出。例如:表输出


在Kettle里元数据的存储方式

•资源库 资源库包括文件资源库、数据库资源库 Kettle 4.0 以后资源库类型可以插件扩展
•XML 文件 .ktr 转换文件的XML的根节点必须是 transformation .kjb 作业XML的根节点是job

数据库资源库:
•把 Kettle 的元数据串行化到数据库中,如 R_TRANSFORMATION 表保存了Kettle 转换的名称、描述等属性。
•在Spoon 里创建和升级数据库资源库

文件资源库:
在文件的基础上的封装,实现了 org.pentaho.di.repository.Repository 接口。是Kettle 4.0 以后版本里增加的资源库类型
不使用资源库: 直接保存为ktr 或 kjb 文件。


Kettle 资源库-如何选择资源库

数据库资源库的缺点:
•不能存储转换或作业的多个版本。
•严重依赖于数据库的锁机制来防止工作丢失。
•没有考虑到团队开发,开发人员不能锁住某个作业自己开发。

文件资源库的缺点:
•对象(如转换、作业、数据库连接等对象)之间的关联关系难以处理,所以删除、重命名等操作会比较麻烦。
•没有版本历史。
•难以进行团队开发。
不使用资源库:使用 svn 进行文件版本控制。


命令行执行Kettle文件

参数格式说明 有两种参数格式 1. /参数名:值 或 -参数名=值 建议使用第一种参数格式.
1.执行test.ktr 文件 日志保存在D:log.txt 中, 默认日志级别是Basic
Pan /file:D:AppProjects
xkh est.ktr /logfile:D:log.txt
2.执行test.ktr 文件 日志保存在D:log.txt 中, 日志级别是Rowlevel
Pan /file:D:AppProjects
xkh est.ktr /logfile:D:log.txt /level: Rowlevel
3.导出一个 job 文件,以及该 job 文件依赖的转换及其他资源
kitchen /file:c:/job1.kjb /export:c:/a.zip
4.直接执行一个导出的 zip 文件
Kitchen.bat /file:”zip:file:///c:/a.zip!job1.kjb”


常见错误及其排除


数据库的连接失败

[20150731100620856.png]

解决办法,是链接相应的数据库的jar包没有加到Kettel中去。在百度或者以前的web项目中找个数据库的jar包。将MySQL-connector-java-5.1.18.jar复制到D:kettle5.1data-integrationlib下面,重新启动一次,这下就好了。再次测试,测试通过链接成功。

[20150731100830606 (2).png]


传递的数据时出现中文乱码的处理

数据库连接选项卡中,在选项中增加命名参数setCharacterEncoding = utf8
另外确保在创建数据库时,Character Set同时也设为utf8.

[20150731100912242.png]


Kettle的变量


变量的类型

Kettle 的早期版本中的变量只有系统环境变量

新版本变量一般包括系统环境变量, “Kettle变量” 和内部变量三种系统环境变量的影响范围很广,凡是在一个 JVM下运行的线程都受其影响.

Kettle变量限制了变量的作用范围, 变量范围包括三种分别是 grand-parent job, parent job, root job
内部变量是 kettle 内置的一些变量, 主要是kettle 运行时依赖的环境, 如转换文件名称, 转换路径,ip地址, kettle 版本号等等.


变量的设置

“系统环境变量” 有三种设置方式
1) 通过命令行 -D 参数
2) 属性文件 kettle.property 中设置, 该属性文件位于 ${user.home}.kettle 下
3) 通过设置环境变量步骤 (Set Variable) 设置.”Kettle 变量” 只能通过设置环境变量 (Set Variable) 步骤设置,同时设置变量的作用范围.
“内部变量” 是预置的无须设置.


变量的使用

无论哪种类型的变量在使用上都是一样的, 有两种方式
1) 通过 %%var%% 或 var,SQL,.2)(GetVariable)使:1.:(GetSystemInfo),使使, v a r 来 引 用 , 这 个 引 用 可 以 用 在 S Q L 语 句 中 , 也 可 以 用 在 允 许 变 量 输 入 的 输 入 框 里 . 2 ) 通 过 获 取 变 量 ( G e t V a r i a b l e ) 步 骤 来 使 用 命 令 行 参 数 : 1. 设 置 : 命 令 行 参 数 通 过 获 取 系 统 信 息 ( G e t S y s t e m I n f o ) 步 骤 设 置 , 在 使 用 时 可 以 像 列 名 一 样 来 使 用 , 不 必 像 变 量 一 样 要 通 过 {var} 这样的格式引用. 用户最多可以设置10个命令行参数
2.传递: 命令行下使用 pan /file:xxx.ktr arg1 arg2 来传递参数.
图形界面下,每次运行时有要求输入参数的提示窗口.


Kettle之效率提升

Kettle作为一款ETL工具,肯定无法避免遇到效率问题,当很大的数据源输入的时候,就会遇到效率的问题。对此有几个解决办法:
1)数据库端创建索引。对需要进行查询的数据库端字段,创建索引,可以在很大程度上提升查询的效率,最多的时候,我不创建索引,一秒钟平均查询4条记录,创建索引之后,一秒钟查询1300条记录。
2)数据库查询和流查询注意使用环境。因为数据库查询为数据输入端输入一条记录,就对目标表进行一次查询,而流查询则是将目标表读取到内存中,数据输入端输入数据时,对内从进行查询,所以,当输入端为大数据量,而被查询表数据量较小(几百条记录),则可以使用流查询,毕竟将目标表读到内存中,查询的速度会有非常大的提升(内存的读写速度是硬盘的几百倍,再加上数据库自身条件的制约,速度影响会更大)。同理,对于目标表是大数据量,还是建议使用数据库查询,不然的话,一下子几百M的内存被干进去了,还是很恐怖的。
3)谨慎使用JavaScript脚本,因为javascript本身效率就不高,当你使用js的时候,就要考虑你每一条记录,就要执行一次js所需要的时间了。
4)数据库commit次数,一条记录和一百条记录commit对效率的影响肯定是不一样的。
5)表输入的sql语句的写法。有些人喜欢在表输入的时候,将所有关联都写进去,要么from N多个表,要么in来in去,这样,就要面对我在2)里面说道的问题,需要注意。
6)注意日志输出,例如选择数据库更新方式,而且日志级别是debug,那么后台就会拼命的输出日志,会在很大程度上影响速度,此处一定要注意。
7)kettle本身的性能绝对是能够应对大型应用的,一般的基于平均行长150的一条记录,假设源数据库,目标数据库以及kettle都分别在几台机器上(最常见的桌面工作模式,双核,1G内存),速度大概都可以到5000 行每秒左右,如果把硬件提高一些,性能还可以提升 , 但是ETL 过程中难免遇到性能问题,下面一些通用的步骤也许能给你一些帮助.
尽量使用数据库连接池
尽量提高批处理的commit size
尽量使用缓存,缓存尽量大一些(主要是文本文件和数据流)
Kettle 是Java 做的,尽量用大一点的内存参数启动Kettle.
可以使用sql 来做的一些操作尽量用sql。Group , merge , stream lookup ,split field 这些操作都是比较慢的,想办法避免他们.,能用sql 就用sql
插入大量数据的时候尽量把索引删掉
尽量避免使用update , delete 操作,尤其是update , 如果可以把update 变成先delete ,后insert .
能使用truncate table 的时候,就不要使用delete all row 这种类似sql
尽量不要用kettle 的calculate 计算步骤,能用数据库本身的sql 就用sql ,不能用sql 就尽量想办法用procedure , 实在不行才是calculate 步骤.
要知道你的性能瓶颈在哪,可能有时候你使用了不恰当的方式,导致整个操作都变慢,观察kettle log 生成的方式来了解你的ETL操作最慢的地方。
远程数据库用文件+FTP 的方式来传数据 ,文件要压缩。(只要不是局域网都可以认为是远程连接)

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐