一、Kettle概念
Kettle是一款国外开源的ETL工具,纯java编写,可以在Window、Linux、Unix上运行,绿色无需安装,数据抽取高效稳定。
Kettle 中文名称叫水壶,该项目的主程序员MATT 希望把各种数据放到一个壶里,然后以一种指定的格式流出。
Kettle这个ETL工具集,它允许你管理来自不同数据库的数据,通过提供一个图形化的用户环境来描述你想做什么,而不是你想怎么做。
Kettle中有两种脚本文件,transformation和job,transformation完成针对数据的基础转换,job则完成整个工作流的控制。
二、下载和部署
下载kettle压缩包,因kettle为绿色软件,解压缩到任意本地路径即可.
下载kettle包,并解压http://community.pentaho.com/projects/data-integration/
压缩包:(这里使用的是Kettle6.1版本)
解压:
三、Kettle环境配置
1、安装JDK(略)
2、测试JDK安装成功(略)
JDK安装步骤见《kettle安装部署及远程执行.docx》
强调:kettle6.1版本,必须配套使用JDK1.7及以上版本。
3、运行Kettle
Windows下找到$KETTLE_HOME/spoon.bat,双击运行.
欢迎界面如下图所示:
四、Kettle组件介绍与使用
1 、Kettle使用
Kettle提供了资源库的方式来整合所有的工作,;
1)创建一个新的transformation,点击保存到本地路径,例如保存到D:/etltest下,保存文件名为Trans,kettle默认transformation文件保存后后缀名为ktr;
2)创建一个新的job,点击保存到本地路径,例如保存到D:/etltest下,保存文件名为Job,kettle默认job文件保存后后缀名为kjb;
2 、组件树介绍
2.1 、Transformation的主对象树和核心对象分别如下图:
ransformation中的节点介绍如下:
Main Tree:菜单列出的是一个transformation中基本的属性,可以通过各个节点来查看。
DB连接:显示当前transformation中的数据库连接,每一个transformation的数据库连接都需要单独配置。
Steps:一个transformation中应用到的环节列表
Hops:一个transformation中应用到的节点连接列表
核心对象菜单列出的是transformation中可以调用的环节列表,可以通过鼠标拖动的方式对环节进行添加:
Input:输入环节
Output:输出环节
Lookup:查询环节
Transform:转化环节
Joins:连接环节
Scripting:脚本环节
2.2 、Job的主对象树和核心对象分别如下图:
Main Tree菜单列出的是一个Job中基本的属性,可以通过各个节点来查看。
DB连接:显示当前Job中的数据库连接,每一个Job的数据库连接都需要单独配置。
Job entries/作业项目:一个Job中引用的环节列表
核心对象菜单列出的是Job中可以调用的环节列表,可以通过鼠标拖动的方式对环节进行添加。
每一个环节可以通过鼠标拖动来将环节添加到主窗口中。
并可通过shift+鼠标拖动,实现环节之间的连接。
2.3 、kettle的简单使用
DB连接
我们可以看到转换的主对象树和核心对象区域,然后我们添加一个DB连接。
选择“主对象树”,双击“转换”标签下的“DB连接”会弹出一个配置窗口。填入连接名称,选择连接类型,配置数据库设置,然后测试下配置是否正确。
由于kettle没有将所有数据库的Driver文件集成,所以如果想连接指定的数据库,需要自己下载JDBC驱动,放入指定的lib目录下。添加完JDBC驱动后,必须重启kettle才能正确加载驱动(添加oracle数据库的jdbc驱动,参见6、常见问题 6.1【Kettle】JDBC连接oracle报找不到驱动)。
注:在转换之前需要创建转换所需的表,原始表和转换的目标表。
点击“核心对象”标签页中的“输入”,选择“表输入”拖到“转换”区域。
双击“表输入”图标弹出表输入对话框,填入步骤名称,选择数据库连接,点击“获取SQL查询语句”,或者直接写入SQL语句,填写附件信息,点击“预览”按钮查看执行结果,没有错误,点击“确认”关闭对话框。
点击“核心对象”—“输出”,选择“Excel输出”拖入到转换区,双击Excel输出图标,弹出对话框,选择文件名和其它附加参数,点击确认
点击输入表的图标,同时按下shift键,再点击输出文件,将两者连接起来。然后双击Excel输出进行配置。
最后一步就是执行kettle脚本,点击工具栏的播放箭头即可。
点击“启动”开始转换,在转换过程中会出现转换的信息,如下图所示。
完成转换后,我们可以在Excel输出目录中查看转换结果。
注:时间字段转换到Excel为空,修改SELECT语句中使用TO_CHAR转换成字符串,例如:to_char(start_time,’yyyy-mm-dd HH24:MM:SS’) as start_time.
注:Excel(2007之前版本)中的记录不能超过65535条,否则会自动关闭文件,导致转换失败。
至此,一个简单的数据迁移脚本,从oracle数据库导出数据到EXCEL文件中就大功告成了。
3、使用举例1
3.1、建立转换
选中列表中的的“表输入”、“表输出”、“插入/更新”,拖拽到右侧工作区。鼠标选中节点键盘按shift键,拖拽即可连线。下图是一个转换,有两个动作,一是直接从数据源表同步数据到目标表,一是检查源表的插入和更新,同步到目标表。
黑色线为生效,灰色线为失效,节点和连接可双击进行编辑。
可预览数据是否正确。
双击编辑表输出动作。
要获取的字段设置如下所示:
点击“Enter field mapping/输入字段映射”进行字段选择。
选择要用的字段后点确定,注意字段的约束条件。
编辑好后点击上面的执行即可。
左侧参数暂不说明,执行完成后可以观看下方的日志。
双击编辑“插入/更新”动作。
然后点击运行。
执行前,在源库里加条新纪录。确定作业执行正常后可以保存作业。
3.2、建立执行的JOB/作业
建立JOB的前提是有可以完整执行的作业,上面步骤定制的作业进行保存
从左侧列表拖拽“START”,“Success”,“转换”,“发送邮件”到工作区并连接,如下图。
然后双击“START”动作进行编辑
然后双击编辑“Transformation”活动。
转换文件名选择上一步编辑好的转换位置
编辑完成后直接点击运行即可。
运行后查看日志。
当任务执行以后可以查看相对应的日志,也可自行配置日志。
五、常见问题解决
1 、【Kettle】JDBC连接oracle报找不到驱动
初次接触kettle,环境都配置好以后,启动kettle的spoon,新建作业,配置jdbc的oracle数据源连接,报找不到驱动。
解决办法:
1)、下载OJDBC14.jar包
2)、 将该包拷贝到kettle的~\data-integration\libswt或者~ \data-integration\lib路径下都可以。3、重启kettle,重新配置数据源连接。问题解。
2、 IP地址输入错误
3、数据库实例输入错误
错误连接数据库 [GCS] : org.pentaho.di.core.exception.KettleDatabaseException:
Error occurred while trying to connect to the database
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
The Connection descriptor used by the client was:
192.168.1.46:1521:ORCL1
org.pentaho.di.core.exception.KettleDatabaseException:
Error occurred while trying to connect to the database
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
The Connection descriptor used by the client was:
192.168.1.46:1521:ORCL1
4、用户名密码错误
六、注意事项
1、表输入中书写sql若有参数,图中替换SQL语句里的变量必须勾上
2、若开发步骤中由一个步骤变俩个步骤,需要分清楚,分发与复制。分发数据轮流进入目标步骤,复制是俩个步骤同时进入。
3、俩个表输入步骤做记录集(表关联)关联,必须提前将关联字段排序,不然会漏掉数据
七、kettle组件介绍说明
1、文本文件输入(text input):读取大量不同的文本文件。大多是通过工具生成的CSV文件。
2、表输入(table Input):常用来利用连接和SQL,从数据中读取信息,自动生成基本的SQL语句。
3、获取系统信息(get system info):这个步骤从 Kettle 环境中获取信息。
4、生成行(Generate Rows ):这个步骤输出一定数量的行,缺省为空。可选包括一定数量的静态字段。
5、Cube输入(文件反序列化)(De-serialize from file):从二进制 Kettle Cube 文件中读取数据行。 备注:这个步骤仅仅用来存储短期数据。不同版本之间不保证文件的格式一样。
6、XBase输入: 使用这一步可以读取大多数被称为 XBase family派生的 DBF文件。
7、Excel输入:利用这个步骤可以从 Kettle 支持的系统的 Excel文件里面读取数据。
8、XML输入:这个步骤允许你读取存储在 XML 文件中的数据。它也提供一个接口,你可以定义你想读取的文件名、XML 文件的数据重复部分、获取的字段等。你可以指定元素或属性字段。
9、获取文件名(Get File Names):这个步骤可以获取系统的文件名信息。
10、表输出(Table output):这个步骤可以存储信息到数据库表中。
11、插入/更新(Insert/Update):这个步骤利用查询关键字在表中搜索行。如果行没有找到,就插入行。如果能被找 到,并且要被更新的字段没有任何改变,就什么也不做。如果有不同,行就会被更新。
12、更新(Update ):这个步骤类似于插入/更新步骤,除了对数据表不作插入操作之外。它仅仅执行更新操作。
13、删除(Delete):这个步骤类似于上一步,除了不更新操作。所有的行均被删除。
14、Cube output(序列化到文件)(Serialize to file):这一步骤存储数据到一个二进制文件。这个步骤有个优势就是回读的时候,文本文件的内容不需要解析。这是因为元数据也同时存储在 CUBE 文件里面。
15、XML输出:这个步骤允许你从源中写入行到一个或者多个 XML 文件。
16、EXCEL输出:利用这个步骤,在 Kettle 支持的系统中,你可以写入数据到一个或者多个Excel 文件中。
17、Access 输出(Microsoft Access Output): 允许你在转换中创建一个新的 Access 数据库文件作为输出。
18、数据库查询(Database lookup):这个步骤类型允许你在数据库表中查找值。
19、流查询(Stream lookup):这个步骤类型允许你从其它步骤中查询信息。首先,“源步骤”的数据被读到内存中,然后被用来从主要的流中查询数据。
20、调用数据库存储过程(Call DB Procedure):这个步骤允许你运行一个数据库存储过程,获取返回结果。
21、HTTP 客户端(HTTP Cient):HTTP 客户端根据一个附带条件的基准 URL,来调用一个简单的调用。
22、字段选择 (Select values) :这个步骤常常用来 选择字段 重命名字段 指定字段的长度或者精度
下面是三个不同标签的功能:
选择和修改:指定需要流到输出流中的字段的精确顺序和名称
删除:指定必须从输出流中删除的字段
元数据:修改元数据字段的名称、类型、长度和精度
23、过滤记录(Filter rows):这个步骤允许你根据条件和比较符来过滤记录。 一旦这个步骤连接到先前的步骤中,你可以简单的单击“<field>”,“=”和“<value>” 区域来构建条件。
24、排序记录(Sort rows):这个步骤利用你指定的字段排序行,无论他们是按照升序还是降序。
备注:当行数超过 5000 行的时候,Kettle 使用临时文件来排序行。
25、添加序列(Add sequence):这个步骤在流中增加一个序列。一个序列是在某个起始值和增量的基础上,经常改变的整数值。你可以使用数据库的序列,也可以使用 Kettle 决定的序列。
备注:Kettle 序列在同一个转换中是唯一使用的。每一次转换运行的时候,序列的值又会重新循环一次(从开始值开始)
26、空操作-什么都不做(Dummy-do nothing):这个操作什么都不做。它的主要作用是,在你想测试什么的时候,充当一个占位符。例如有一个转换,你至少需要两个彼此连接的步骤。如果你想测试文本文件输入步骤,你可以将它连接到一个 Dummy 步骤。
27、行转列(Row Normaliser):这个步骤转动表,标准化数据。
28、拆分字段(Split Fields):这个步骤允许你根据分隔符来拆分字段。
29、去除重复记录(Unique rows):这个步骤从输入流中称移除重复的记录。
30、分组(Group By):这个步骤允许你通过定义分组的字段来计算值。
例如:计算产品的平均销售额,获取库存的黄色衬衫的数量等等。
31、设置为空值(Null if):如果某个字符串的值等于指定的值,设置那个值为空。
32、计算器(Calculator ):这个步骤提供一个功能列表,可以在字段值上运行。
计算器的一个重要优势是,它有着几倍于常用的 JavaScript 脚本的速度。
33、增加 XML (XML Add ):这个步骤允许你将在 XML 中的行字段内容编码,XML 以字符串字段的形式添加到行中。
34、增加常量(Add constants ):这个步骤很简单,主要是添加常量到流中。它的使用也很容易:用字符串形式指定名称,类型和值。利用选择的数据类型指定转换格式。
36、行转列(Row Denormaliser ):这个步骤允许你通过查询键值对来反向规格化数据。也可以立即转换数据类型。
37、行扁平化(Flattener ):这个步骤允许你扁平化预备的数据。
38、值映射(Value Mapper ):这个步骤简单的映射字符串,从一个值映射到另一个值。通常你想解中转换表的问题,不管怎么说,这是一种可选的方案:简单的将转换表作一部分。
例如:如果你想替换 Language codes,你可以:
使用的字段名:LanuguageCode 目标字段名:LanguageDesc
源值/目标值:EN/English,FR/French,NL/Dutch,ES/Spanish,DE/German,…
39、被冻结的步骤(Blocking step ):它冻结所有的输出,直到从上一步骤来的最后一行数据到达,最后一行数据将发送到下一步。你可以使用这个步骤触发常用插件、存储过程和 Java Script等等。
记录关联(笛卡尔输出)(Join Rows-Cartesian Product ):这个步骤允许你组合输入流中的所有行(笛卡尔输出)。
40、数据库连接(Database Join ):这个步骤允许你使用先前步骤的数据,运行一个数据库查询。能够指定查询参数:在 SQL 查询中使用“?” ; 在 SQL 查询中使用数据网格中的字段
42、合并记录(Merge rows ):这个步骤允许你比较两个行流。如果你想在两个不同的时间比较比较数据,这是非常有用的。它常被用于数据仓库源系统没有包含最后更新日期的情况。
两个行流被合并,一个是引用流(旧数据),一个比较流(新数据)。每次都是行的最后版本通过进入下一步骤。行有以下标记:
“identical”:关键字在两个流中都存在,并且值相同
“changed”: 关键字在两个流中都存在,但是一个或者更多的值不同
“new”:引用流中没有找到关键字
“deleted”: 比较流中没有找到关键字
比较流中的数据进入下一步骤,除非在“删除“的情况。
43、存储合并(Stored Merge ):这个步骤合并来自多个输入步骤的数据行,并且这些行用指定的关键字排序。
44、合并连接(Merge Join) :这个步骤将来自两个不同的步骤输入的数据执行一个高效的合并。合并选项包括INNER、LEFT OUTER、RIGHT OUTER、FULL OUTER。
备注:这个步骤将输入的行按指定的字段存储
45、Java Script 值(Java Script Value ):这个步骤允许你用 JavaScript 语言做复杂的运算。使用的 JavaScript 引擎是 Rhino 1.5R5。
46、改进的 Java Script 值(Modified Java Script Value ):这个步骤是“Javascript Values”的进改版本,它可以提供更好的效率,也更容
易使用。
47、执行 SQL 语句(Execute SQL script ):在这个步骤中你可以执行 SQL 脚本,或者在转换初始化的时候执行,或者在步骤的每一个输入行执行
49、联合更新/查询(Combination lookup/update ):这个步骤允许你在一个 junk-dimesion 表里存储信息。
50、映射(Mapping ):如果你希望某个转换多次运行,你可以将重复的部分添加到一个映射中。映射是一个这样的转换:指定输入如何从映射输入中到达 ;指定输入字段如何转换:字段被添加或者删除
51、从结果获取记录(Get rows from result ):这个步骤返回在一个任务中先前步骤生成的行。你可以进入选择先前步骤生成的元数据字段。
52、复制记录到结果(Copy rows to result ):这个步骤允许你在一个任务中将行数据(内存中的)传递到下一个步骤
53、设置变量(Set Variable):这个步骤允许你在一个任务中或者虚拟机中设置变量。它仅仅可以用一行数据来设置变量值。
54、获取变量(Get Variable ):这个步骤允许你获取一个变量,它可以返回行或者附加值到输入行。
备注:你需要指定完整的变量格式${variable}或者%%variable%%。
55、从以前的结果获取文件(Get files from result ):每次在转换、任务、文件细节、任务条目、步骤等处理、使用或者创建一个文件时,文件被捕获并且附加到结果中。你可以使用这个步骤访问那些信息。
56、复制文件名到结果(Set files in result):在某种情况下,我们可以操纵输出结果中的文件列表。例如 mail 任务条目可以使用文件列表来关联邮件,可能你不需要发送所有的文件,你可以在此步骤中指定你想要发送的邮件。
57、记录注射器(Injector ):注射器主要是针对以下人使用:想利用 Kettle API 和 JAVA 来注射记录到转换中。
58、套接字读入器(Socket Reader):套接字读入器是通过 TCP/IP 协议将数据从一个服务器向另一个服务器传输。
59、套接字输写器(Socket Writer):套接字输写器是通过 TCP/IP 协议将数据从一个服务器向另一个服务器传输。
60、聚合行(Aggregate Rows ):这个步骤允许你在所有行的基础上快速的聚集行。
61、流 XML 输入(Streaming XML Input):这个步骤主要提供值的解析,它信赖于 SAX 解析器,在大文件解析上能提供更好的性能。
它与 XML 输入非常相似,仅仅在内容和字段制表符上略有不同。
62、中止(Abort ):这个步骤允许你在观察输入的时候中止步骤。它的主要用途是错误处理,在一定数量的行流过错误的连接时中止转换。
63、Oracle 批量装载(Oracle bulk loader ):这个步骤允许你大批量加载数据到 Oracle 数据库,它将用一个正确的装载格式,然后调用 Oracle 的 SQL*Loader 数据加载工具加载到指定的表中。