kettle学习入门例子大全~.doc

上传人:小** 文档编号:630075 上传时间:2019-04-22 格式:DOC 页数:57 大小:1.79MB
返回 下载 相关 举报
kettle学习入门例子大全~.doc_第1页
第1页 / 共57页
kettle学习入门例子大全~.doc_第2页
第2页 / 共57页
点击查看更多>>
资源描述

《kettle学习入门例子大全~.doc》由会员分享,可在线阅读,更多相关《kettle学习入门例子大全~.doc(57页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、#*Kettle 培训技术文档 0507Etl 介绍介绍ETL(Extract-Transform-Load的缩写,即数据抽取、转换、装载的过程),对于 金融IT 来说,经常会遇到大数据量的处理,转换,迁移,所以了解并掌握一种 etl工具的使用,必不可少。Kettle是一款国外开源的etl工具,纯java编写,绿色无需安装,数据抽取高 效稳定。Kettle中有两种脚本文件,transformation和job,transformation完成针 对数据的基础转换,job则完成整个工作流的控制。kettle 部署运行部署运行将kettle2.5.1文件夹拷贝到本地路径,例如D 盘根目录。 双击运

2、行kettle文件夹下的spoon.bat文件,出现kettle欢迎界面:#*稍等几秒选择没有资源库,打开kettle主界面#*创建transformation,job 点击页面左上角的创建一个新的transformation,点击保存到本地路 径,例如保存到D:/etltest下,保存文件名为EtltestTrans,kettle默认transformation 文件保存后后缀名为ktr 点击页面左上角的创建一个新的job,点击保存到本地路径,例如保 存到D:/etltest下,保存文件名为EtltestJob,kettle默认job文件保存后后缀名为kjb 创建数据库连接 在transfo

3、rmation页面下,点击左边的【Main Tree】,双击【DB连接】,进行 数据库连接配置。#*connection name自命名连接名称 Connection type选择需要连接的数据库 Method of access选择连接类型 Server host name写入数据库服务器的ip地址 Database name写入数据库名 Port number写入端口号 Username写入用户名 Password写入密码 例如如下配置:#*点击【test】,如果出现如下提示则说明配置成功#*点击关闭,再点击确定保存数据库连接。一个简单的一个简单的ktr 例子例子 目的:目的: 将一个数据

4、库导入到另一个数据库中。 操作步骤:操作步骤: 创建一个transformation,命名为etlTestTrans.ktr,创建数据库连接 ods,点击【Input】,选中【表输入】,拖到主窗口,释放鼠标,双击打 开 如下图#*点击【Transform】,选中【字段选择】,拖到主窗口,释放鼠标 点击【Output】,选中【表输出】,拖到主窗口,释放鼠标 建立【文本文件输入】和【字段选择】与【字段选择】和【表输出】的连接双击【表输出】,目标表中写入ZT_TEST_KETTLE,确定保存#*双击【字段选择】,点击 获取选择的字段,再点击Edlt Mapping,点击OK 确定,编辑所有字段对应关

5、系,点确定。#*点击运行这个转换。,则将上一个ktr中生成的文本,导入到数据库当中。一个简单的一个简单的 kjb 例子例子目的:目的: 将上一个transformation在一个job里面调用执行。 操作步骤:操作步骤: 在etlTestJob页面,点击【Core Objects】,点击【Job entries】,选中【START】 拖动到主窗口释放鼠标,再选中【Transformation】,拖动到主窗口释放鼠标, 建立【START】和【Transformation】之间的连接。 双击【Transformation 】, 在Transformation filename 中写入 E:kett

6、leWorkspaceetlTestTrans.ktr,确定保存。#*点击保存创建好的job。点击运行这个转换。 待所有任务都显示成功,则为job调用transformation运行成功。#*一个增量的例子一个增量的例子增量更新增量更新按照数据种类的不同大概可以分成: 1. 只增加,不更新, 2. 只更新,不增加 3. 即增加也更新 4. 有删除,有增加,有更新 下面针对前三种做一个增量的 ETL 抽取。过程如下: 根据前面讲解的例子一样,首先建立源表(fina_test1)和目标表(fina_test2) ,整 个设计流程如下:其中第一个步骤(输入-目标表)的 sql 大概如下模式:#*se

7、lect ifnull(max(date_seal),1900-01-01 00:00:00) from fina_test2 你会注意到第二个步骤和第一个步骤的连接是黄色的线,这是因为第二个table input(输入-源表)步骤把前面一个步骤的输出当作一个参数来用,所有Kettle用黄 色的线来表示,第二个table input(输入-源表) 的sql 模式大概如下: SELECT * FROM fina_test1 where date_seal? 后面的一个问号就是表示它需要接受一个参数,你在这个table input(输入-源表) 下面需要指定replace variable in

8、script 选项和 执行每一行 为选中状态,这样, Kettle就会循环执行这个sql , 执行的次数为前面参数步骤传入的数据集的大小。关于第三个步骤执行插入/更新步骤需要特别解释一下,Kettle 执行这个步骤是需要两个数据流对比,其中一个是目标数据库,你在目标表 里面指定的,它放在用来查询的关键字左边的表字段里面的,另外一个数据流就是 你在前一个步骤传进来的,它放在用来查询的关键字 的右边,Kettle 首先用你传 进来的 key 在数据库中查询这些记录,如果没有找到,它就插入一条记录,所有#*的值都跟你原来的值相同,如果根据这个 key 找到了这条记录,kettle 会比较这两 条记录

9、,根据你指定 update field 来比较,如果数据完全一样,kettle 就什么都不做, 如果记录不完全一样,kettle 就执行一个 update 步骤。 备注:主键被修改得数据认为是新记录删除的数据由在仓库中需要保留无需考虑然后点击新建-job,然后 job 的核心对象job entries 拉出 组建,进行执行抽取。创建创建 kettle 资料库资料库资源库是用来保存转换任务的,用户通过图形界面创建的的转换任务可以保存在资源库中。资源库可以是各种常见的数据库,用户通过用户名/密码来访问资源库中的资源,默认的用户名/密码是 admin/admin资源库并不是必须的,如果没有资源库,用

10、户还可以把转换任务保存在 xml 文件中。#*如果用户需要创建一个资源库,在资源库的登录窗口(PDI 启动时的第一个窗口)中有 【新建】 按钮,点击该按钮弹出新建资源库窗口,在该窗口中选择一个数据库连接,如果没有事先定义的数据库连接,则还要点击【新建】按钮,来创建一个数据库连接。选择数据库连接后,要为该资源库命名,作为这个资源库的唯一标志,最后选择【创建或更新】按钮来创建这个资源库。#*资源库可以使多用户共享转换任务,转换任务在资源库中是以文件夹形式分组管理的,用户可以自定义文件夹名称。如何使用 kettle 读取包含多行表的 Excel 文件如果 Excel 工作表的表头只有一行,使用 Ke

11、ttle 读取这样的文件是很容易的.如果 Excel 工作表的表头是多行的, 或者是分级的就需要在内容标签下正确设置列名所占行数才可以读取.考虑这样的一个工作表如果想把里面的 12 列数据都读出来, 就要考虑如何处理多级表头.步骤设置的详细描述:#*步骤一 选择文件名,现在文件或目录里到所要添加的 excel 文档,然后点击,确定后,点击,步骤二 选择要读取的工作表名称和要读取的内容在工作表里的起始位置, 也就是表头开始的行号和列号 (这里行号和列号是以 0 开始的)步骤三 设置要读取的内容的一些属性, 这里要设置表头的所占行数是 4 行.#*步骤四 错误处理, 选择如果有错误终止还是继续,

12、错误信息保存的文件等.(图略)步骤五 选择字段, 如果前面的三个步骤(不包括错误处理步骤)都设置正确, 在这个页面选择 “获取字段“ 字段按钮, 就会获得所有的列名称和数据类型.这里我们可以看到: 多级表头中各级表头的名称被叠加起来, 形成了唯一的列名.点击 预览 按钮可以预览到数据#*对于表头跨连续的多行, 但不分级的情况也可以使用上述方式处理.kettle 注释:1、kettle 的控制流可以设置一些简单的时间,并且可以实现隔断天、周、月(三个只能选一个,不能选那个月的那周那日),但是 kettle 工具不能关,如果关了,必须重新启动。2、kettle 里面缺少一个编辑的字段的插件,导致字

13、段编辑很麻烦,这只能先 sql 中进行手写,这个对写 sql 的要求很高。一个一个 kettle 字段转换(截取)的例子字段转换(截取)的例子大致的流程是:#*表输入还是正常的 sql 查询,没有添加参数。字段转换(截取)是在进行修改。具体样式如下:具体的用法:#*transform Functions 里面包括了字符、数字的一些函数方法,这些函数方法可以解决一些字段需要转化的问题。Input fields 和 Output fields 里面包括了从表输入进来的字段(数据)。字段主要转化的操作界面:#*注意下:substr(xxx,1,2) 中的 1 代表是第一位开始,2 代表是取 2 位,

14、在这里面还可以添加 if 等语句,进行编写。在字段选择那里面要配置从 js 过来的字段,点击列映射(前提是已经和表输出连接上),这个字段对应要根据你实际从 js 倒过来的字段和目标表相对应的字段一一对应。#*开源开源 ETL 工具工具 kettle 系列之常见问题系列之常见问题 摘要:本文主要介绍使用 kettle 设计一些 ETL 任务时一些常见问题,这些问 题大部分都不在官方 FAQ 上,你可以在 kettle 的论坛上找到一些问题的答案1. Join 我得到 A 数据流(不管是基于文件或数据库),A 包含 field1 , field2 , field 3 字段,然后我还有一个 B 数据

15、流,B 包含 field4 , field5 , field6 , 我现在 想把它们 加 起来, 应该怎么样做. 这是新手最容易犯错的一个地方,A 数据流跟 B 数据流能够 Join,肯定是它们包含 join key ,join key 可以是一个字段也可以是多个字段。如果两个数据流没有 jo in key ,那么它们就是在做笛卡尔积,一般很少会这样。比如你现在需要列出一个 员工的姓名和他所在部门的姓名,如果这是在同一个数据库,大家都知道会在一个 sql 里面加上 where 限定条件,但是如果员工表和部门表在两个不同的数据流里 面,尤其是数据源的来源是多个数据库的情况,我们一般是要使用 Da

16、tabase Join 操作,然后用两个 database table input 来表示输入流,一个输入是部门表的姓 名,另一个是员工表的姓名,然后我们认为这两个表就可以 ”Join” 了,我们需 要的输出的确是这两个字段,但是这两个字段的输出并不代表只需要这两个字段的#*输入,它们之间肯定是需要一个约束关系存在的。另外,无论是在做 Join , Merg e , Update , Delete 这些常规操作的时候,都是先需要做一个 compare 操作的 ,这个 compare 操作都是针对 compare key 的,无论两个表结构是不是一样的, 比如 employee 表和 depar

17、tment 表,它们比较的依据就是 employee 的外键 depar tment_id , 没有这个 compare key 这两个表是不可能连接的起来的. 对于两个 表可能还有人知道是直接 sql 来做连接,如果是多个输入数据源,然后是三个表 ,有人就开始迷茫了,A 表一个字段,B 表一个字段,C 表一个字段,然后就连 Joi n 操作都没有,直接 database table output , 然后开始报错,报完错就到处找 高手问,他们的数据库原理老师已经在吐血了。如果是三个表连接,一个 sql 不 能搞定,就需要先两个表两个表的连接,通过两次 compare key 连接之后得到你

18、的输出,记住,你的输出并不能代表你的输入. 下面总结一下: 1. 单数据源输入,直接用 sql 做连接 2. 多数据源输入,(可能是文本或是两个以上源数据库),用 database join 操 作. 3. 三个表以上的多字段输出. 2. Kettle 的数据库连接模式 Kettle 的数据库连接是一个步骤里面控制一个单数据库连接,所以 kettle 的连接 有数据库连接池,你可以在指定的数据库连接里面指定一开始连接池里面放多少个 数据库连接,在创建数据库连接的时候就有 Pooling 选项卡,里面可以指定最大 连接数和初始连接数,这可以一定程度上提高速度.3. transaction 我想在

19、步骤 A 执行一个操作(更新或者插入),然后在经过若干个步骤之后,如果 我发现某一个条件成立,我就提交所有的操作,如果失败,我就回滚,kettle 提 供这种事务性的操作吗? Kettle 里面是没有所谓事务的概念的,每个步骤都是自己管理自己的连接的,在 这个步骤开始的时候打开数据库连接,在结束的时候关闭数据库连接,一个步骤是 肯定不会跨 session 的(数据库里面的 session), 另外,由于 kettle 是并行执 行的,所以不可能把一个数据库连接打开很长时间不放,这样可能会造成锁出现, 虽然不一定是死锁,但是对性能还是影响太大了。ETL 中的事务对性能影响也很大 ,所以不应该设计

20、一种依赖与事务方式的 ETL 执行顺序,毕竟这不是 OLTP,因为 你可能一次需要提交的数据量是几百 GB 都有可能,任何一种数据库维持一个几百 GB 的回滚段性能都是会不大幅下降的. 4. 我真的需要 transaction 但又不想要一个很复杂的设计,能不能提供一个 简单一点的方式 Kettle 在 3.0.2GA 版中将推出一种新功能,在一个 table output 步骤中有一个 M iscellaneous 选项卡,其中有一个 Use unique connections 的选项,如果你选 中的话就可以得到一个 transaction 的简单版, 由于是使用的单数据库连接,所以可以有

21、错误的时候回滚事务,不过要提醒一点是#*这种方式是以牺牲非常大的性能为前提条件的,对于太大的数据量是不适合的(个 人仍然不建议使用这种方式) 5. temporary 表如何使用 我要在 ETL 过程中创建一个中间表,当某个条件成立的时候,我要把中间表的数据 进行转换,当另一条件成立的时候我要对中间表进行另一个操作,我想使用数据库 的临时表来操作,应该用什么步骤。 首先从 temp 表的生命周期来分,temp 分为事务临时表和会话临时表,前面已经解 释过了,kettle 是没有所谓事务的概念的,所以自然也没有所谓的事务临时表。K ettle 的每个步骤管理自己的数据库连接,连接一结束,kett

22、le 也就自然丢掉了这 个连接的 session 的 handler , 没有办法可以在其他步骤拿回这个 session 的 ha ndler , 所以也就不能使用所谓的会话临时表,当你尝试再开一个连接的时候,你 可以连上这个临时表,但是你想要的临时表里面的数据都已经是空的(数据不一定 被清除了,但是你连不上了),所以不要设计一个需要使用临时表的转换 之所以会使用临时表,其实跟需要 ”事务” 特性有一点类似,都是希望在 ETL 过 程中提供一种缓冲。临时表很多时候都不是某一个源表的全部数据的镜像,很多时 候临时表都是很小一部分结果集,可能经过了某种计算过程,你需要临时表无非是 基于下面三个特性

23、: 1. 表结构固定,用一个固定的表来接受一部分数据。 2. 每次连接的时候里面没有数据。你希望它接受数据,但是不保存,每次都好像 执行了 truncate table 操作一样 3. 不同的时候连接临时表用同一个名字,你不想使用多个连接的时候用类似与 te mp1 , temp2 , temp3 , temp4 这种名字,应为它们表结构一样。 既然临时表不能用,应该如何设计 ETL 过程呢?(可以用某种诡异的操作搞出临时 表,不过不建议这样做罢了) 如果你的 ETL 过程比较的单线程性,也就是你清楚的知道同一时间只有一个这样的 表需要,你可以创建一个普通的表,每次连接的时候都执行 trunc

24、ate 操作,不论 是通过 table output 的 truncate table 选项,还是通过手工执行 truncate tab le sql 语句(在 execute sql script 步骤)都可以达到目的(基于上面的 1,2 特性) 如果你的 ETL 操作比较的多线程性,同一时间可能需要多个表结构一样并且里面都 是为空的表(基于上面 1,2,3 特性),你可以创建一个 “字符串+序列” 的模 式,每次需要的时候,就创建这样的表,用完之后就删除,因为你自己不一定知道 你需要多少个这种类型的表,所以删除会比 truncate 好一些。 下面举个例子怎么创建这种表: 你可以使用某种约

25、定的表名比如 department_temp 作为 department 的临时表。或 者 把 argument 传到表名,使用 department_$argument 的语法, 如果你需要多个这种表,使用一个 sequence 操作+execute sql script 操作,ex ecute sql script 就下面这种模式#*Create table_? (.) 在表的名字上加参数,前面接受一个 sequence 或类似的输入操作. 需要注意的是这种参数表名包括 database table input 或者 execute sql script ,只要是参数作为表名的情况前面的输

26、入不能是从数据库来的,应为没有办法执行 这种 preparedStatement 语句,从数据库来的值后面的操作是 “值操作” ,而 不是字符串替换,只有 argument 或者 sequence 操作当作参数才是字符串替换. ( 这一点官方 FAQ 也有提到) 6. update table 和 execute sql script 里面执行 update 的区别 执行 update table 操作是比较慢的,它会一条一条基于 compare key 对比数据, 然后决定是不是要执行 update sql , 如果你知道你要怎么更新数据尽可能的使用 execute sql script 操

27、作,在里面手写 update sql (注意源数据库和目标数据 库在哪),这种多行执行方式(update sql)肯定比单行执行方式(update table 操作)快的多。 另一个区别是 execute sql script 操作是可以接受参数的输入的。它前面可以是 一个跟它完全不关的表一个 sql :select field1, field2 field3 from tableA 后面执行另一个表的更新操作:update tableB set field4 = ? where field5=? And field6=?然后选中 execute sql script 的 execute fo

28、r each row .注意参数是一 一对应的.(field4 对应 field1 的值, field5 对应 field2 的值, field6 对应 field3 的值) 7. kettle 的性能 kettle 本身的性能绝对是能够应对大型应用的,一般的基于平均行长 150 的一条 记录,假设源数据库,目标数据库以及 kettle 都分别在几台机器上(最常见的桌 面工作模式,双核,1G 内存),速度大概都可以到 5000 行每秒左右,如果把硬件 提高一些,性能还可以提升 , 但是 ETL 过程中难免遇到性能问题,下面一些通用 的步骤也许能给你一些帮助. 尽量使用数据库连接池 尽量提高批处

29、理的 commit size 尽量使用缓存,缓存尽量大一些(主要是文本文件和数据流) Kettle 是 Java 做的,尽量用大一点的内存参数启动 Kettle. 可以使用 sql 来做的一些操作尽量用 sql Group , merge , stream lookup ,split field 这些操作都是比较慢的,想办法 避免他们.,能用 sql 就用 sql 插入大量数据的时候尽量把索引删掉 尽量避免使用 update , delete 操作,尤其是 update , 如果可以把 update 变成 先 delete , 后 insert . 能使用 truncate table 的时候

30、,就不要使用 delete all row 这种类似 sql 合理的分区#*如果删除操作是基于某一个分区的,就不要使用 delete row 这种方式(不管是 de lete sql 还是 delete 步骤),直接把分区 drop 掉,再重新创建 尽量缩小输入的数据集的大小(增量更新也是为了这个目的) 尽量使用数据库原生的方式装载文本文件(Oracle 的 sqlloader , mysql 的 bulk loader 步骤) 尽量不要用 kettle 的 calculate 计算步骤,能用数据库本身的 sql 就用 sql ,不 能用 sql 就尽量想办法用 procedure , 实在不

31、行才是 calculate 步骤. 要知道你的性能瓶颈在哪,可能有时候你使用了不恰当的方式,导致整个操作都变 慢,观察 kettle log 生成的方式来了解你的 ETL 操作最慢的地方。 远程数据库用文件+FTP 的方式来传数据 ,文件要压缩。(只要不是局域网都可以 认为是远程连接) 8. 描述物理环境 源数据库的操作系统,硬件环境,是单数据源还是多数据源,数据库怎么分布的, 做 ETL 的那台机器放在哪,操作系统和硬件环境是什么,目标数据仓库的数据库是 什么,操作系统,硬件环境,数据库的字符集怎么选,数据传输方式是什么,开发 环境,测试环境和实际的生产环境有什么区别,是不是需要一个中间数据

32、库(stagi ng 数据库) ,源数据库的数据库版本号是多少,测试数据库的版本号是多少,真 正的目标数据库的版本号是多少. 这些信息也许很零散,但是都需要一份专门 的文档来描述这些信息,无论是你遇到问题需要别人帮助的时候描述问题本身,还 是发现测试环境跟目标数据库的版本号不一致,这份专门的文档都能提供一些基本 的信息9. procedure 为什么我不能触发 procedure? 这个问题在官方 FAQ 里面也有提到,触发 procedure 和 http client 都需要一个 类似与触发器的条件,你可以使用 generate row 步骤产生一个空的 row ,然后把 这条记录连上 p

33、rocedure 步骤,这样就会使这条没有记录的空行触发这个 procedu re (如果你打算使用无条件的单次触发) ,当然 procedure 也可以象 table input 里面的步骤那样传参数并且多次执行. 另外一个建议是不要使用复杂的 procedure 来完成本该 ETL 任务完成的任务,比 如创建表,填充数据,创建物化视图等等. 10. 字符集 Kettle 使用 Java 通常使用的 UTF8 来传输字符集,所以无论你使用何种数据库, 任何数据库种类的字符集,kettle 都是支持的,如果你遇到了字符集问题,也许 下面这些提示可以帮助你: 1. 单数据库到单数据库是绝对不会出

34、现乱码问题的,不管原数据库和目标数据库 是何种种类,何种字符集 2. 多种不同字符集的原数据库到一个目标数据库,你首先需要确定多种源数据库 的字符集的最大兼容字符集是什么,如果你不清楚,最好的办法就是使用 UTF8 来 创建数据库.#*3. 不要以你工作的环境来判断字符集:现在某一个测试人员手上有一个 oracle 的基于 xxx 字符集的已经存在的数据库,并且非常不幸的是 xxx 字符集不是 utf8 类型的,于是他把另一个基于 yyy 字符集的 oracle 数据库要经过某一个 ETL 过程 转换到 oracle , 后来他发现无论怎么样设置都会出现乱码,这是因为你的数据库 本身的字符集不

35、支持,无论你怎么设置都是没用的. 测试的数据库不代表最后产品 运行的数据库,尤其是有时候为了省事把多个不同的项目的不相关的数据库装在同 一台机器上,测试的时候又没有分析清楚这种环境,所以也再次强调描述物理环境 的重要性. 4. 你所看到的不一定代表实际储存的:mysql 处理字符集的时候是要在 jdbc 连 接的参数里面加上字符集参数的,而 oracle 则是需要服务器端和客户端使用同一 种字符集才能正确显示,所以你要明确你所看到的字符集乱码不一定代表真的就是 字符集乱码,这需要你检查在转换之前的字符集是否会出现乱码和转换之后是否出 现乱码,你的桌面环境可能需要变动一些参数来适应这种变动 5.

36、 不要在一个转换中使用多个字符集做为数据源. 11. 预定义时间维 Kettle 提供了一个小工具帮助我们预填充时间维,这个工具在 kettle_home / sam ples / transformations / General populate date dimension. 这个示例产 生的数据不一定能满足各种需要,不过你可以通过修改这个示例来满足自己的需求. 12. SQL tab 和 Options tab 在你创建一个数据库连接的时候除了可以指定你一次需要初始化的连接池参数之外 (在 Pooling 选项卡下面),还包括一个 Options 选项卡和一个 SQL 选项卡, O p

37、tions 选项卡里面主要设置一些连接时的参数,比如 autocommit 是 on 还是 off , defaultFetchSize , useCursorFetch (mysql 默认支持的),oracle 还支持比如defaultExecuteBatch , oracle.jdbc.StreamBufferSize, oracle.jdbc.FreeMemo ryOnEnterImplicitCache ,你可以查阅对应数据库所支持的连接参数,另外一个小 提示:在创建数据库连接的时候,选择你的数据库类型,然后选到 Options 选项 卡,下面有一个 Show help text on

38、 options usage , 点击这个按钮会把你带到 对应各个数据库的连接参数的官方的一个参数列表页面,通过查询这个列表页面你 就可以知道那种数据库可以使用何种参数了. 对于 SQL 选项卡就是在你一连接这个 Connection 之后,Kettle 会立刻执行的 sq l 语句,个人比较推荐的一个 sql 是执行把所有日期格式统一成同一格式的 sql ,比如在 oracle 里面就是:alter session set nls_date_format = xxxxxxxxxxxxxalter session set nls_xxxxxxxxx = xxxxxxxxxxxx 这样可以避免你

39、在转换的时候大量使用 to_date() , to_char 函数而仅仅只是为 了统一日期格式,对于增量更新的时候尤其适用. 13. 数据复制 有的时候可能我们需要的是类似数据复制或者一个备份数据库,这个时候你需要的 是一种数据库私有的解决方案,Kettle 也许并不是你的第一选择,比如对于 Orac#*le 来说,可能 rman , oracle stream , oracle replication 等等, mysql 也 有 mysql rmaster / slave 模式的 replication 等私有的解决方法,如果你确定 你的需求不是数据集成这方面的,那么也许 kettle 并不

40、是一个很好的首选方案, 你应该咨询一下专业的 DBA 人士也会会更好. 14. 如何控制版本变更 Kettle 的每一个 transformation 和 job 都有一个 version 字段(在你保存的时 候), 不过这个功能还不实用,如果你需要版本控制的话,还是建议你将 transfo rmation 和 job 转换成文本文件保存,然后用 svn 或 cvs 或任意你熟悉的版本控 制系统将其保存,kettle 将在下一个版本加入版本控制的功能(做的更易用). 15. 支持的数据源 Kettle 支持相当广的数据源,比如在数据库里面的一些不太常见的 Access , MaxDB (SAP

41、 DB) , Hypersonic , SAP R/3 system , Borland Interbase , Oracle R DB , Teradata 和 3.0 新加入的 Sybase IQ . 另外还包括 Excel , CSV , LDAP ,以及 OLAP Server Mondrian , 目前支持 Web S ervice 不过暂时还不支持 SOAP. 16. 调试和测试 当 ETL 转换出现不可预知的问题时,或是你不清楚某个步骤的功能是什么的情况下 ,你可能需要创建一个模拟环境来调适程序,下面一些建议可能会有所帮助: 尽量使用 generate row 步骤或者固定的一个

42、文本文件来创建一个模拟的数据源 模拟的数据源一定要有代表性,数据集一定尽量小(为了性能考虑)但是数据本身 要足够分散. 创建了模拟的数据集后你应该清楚的知道你所要转换之后的数据时什么样的. 17. 错误处理 在 ETL 任务中由于数据问题出现转换错误是一件非常正常的事情,你不应该设计一 个依赖于临时表或者拥有事务特点的 ETL 过程,面对数据源质量问题的巨大挑战, 错误处理是并不可少的,kettle 同样提供非常方便的错误处理方式,在你可能会 出错的步骤点击右键选择 Define Error handing , 它会要求你指定一个处理 erro r 的步骤,你可以使用文本文件或者数据库的表来储

43、存这些错误信息,这些错误信 息会包含一个 id 和一个出错的字段,当你得到这些错误信息之后就需要你自己分 析出错的原因了,比如违反主键约束可能是你生成主键的方式有错误或者本身的数 据有重复,而违反外键约束则可能是你依赖的一些表里面的数据还没有转换或者外 键表本身过滤掉了这些数据. 当你调整了这些错误之后,确定所有依赖的数据都被 正确的处理了.kettle user guide 里面有更详细的解释,里面还附带了一个使用 javascript 来处理错误的示例,这种方式可以作为处理简单数据质量的方式. 18. 文档,文档,文档 Kettle 提供了丰富的文档和使用手册,小到一个数据库连接怎么连,大

44、到一个功 能怎么实现,所有的参数列表,对话框的每一个输入输出代表什么意思都有解释, 所以当你遇到问题你应该第一时间翻阅这些文档,也许上面已经告诉你怎么做了. 另外 kettle 还有一个非常活跃的社区,你可以到上面提问,但是记住在你提问之#*前先搜索一下论坛看有没有类似的问题已经问过了,如果没有记得描述清楚你的问 题 总结 本系列文章主要讨论了如何使用 kettle 来处理数据仓库中的缓慢增长维,动态 ET L 如何设计,增量更新的一些设计技巧,在应用程序中如何集成 kettle 以及在使 用 kettle 时的一些常见问题. 如果你正在寻找一个工具来帮助你解决数据库的集 成问题或是你打算建立

45、一个商业智能项目的数据仓库,那么 kettle 是一个不错的 选择,你不用支付任何费用就可以得到很多很多数据集成的特性,大量文档和社区 支持. 难道这些不就是你希望从一个商业工具上的到的吗?还在等什么 ,开始你 的数据集成之旅吧 开源开源 ETLETL 工具工具 kettlekettle 系列之在应用程序中集成系列之在应用程序中集成 摘要:本文主要讨论如何在你自己的 Java 应用程序中集成 Kettle 如果你需要在自己的 Java 应用程序中集成 Kettle , 一般来说有两种应用需 求,一种是通过纯设计器来设计 ETL 转换任务,然后保存成某种格式,比如 xml 或 者在数据库中都可以

46、,然后自己调用程序解析这个格式,执行这种转换,是比较抽 象的一种执行方式,ETL 里面转换了什么东西我们并不关心,只关心它有没有正常 执行。另一种是通过完全编程的方式来实现,详细的控制每一个步骤,需要知道转 换执行的成功与否,这种方式可能需要更多的理解 kettle 的 API 以便更好的跟你 的应用程序紧密结合,不过难度也比较大,可以很好的定制你的应用程序,代价自 然是入门门槛比较高。本文主要向你解释第一种 Kettle 的集成方式,文中所列出 的代码节选自 pentaho ,不过应用程序本身跟 pentaho 没有什么关系。Pentaho 集成 kettle 的代码主要是两个类,Kettl

47、eSystemListener 和 Kettl eComponent,看名字就猜出 KettleSystemListener 主要是起监听器的作用,它主 要负责初始化 kettle 的一些环境变量,这个类主要包含四个方法: startup() , r eadProperties(),environmentInit(),shutdown(),程序入口自然是 startup()方 法,然后它会调用 environmentInit() 方法,这个方法就调用 readProperties() 方法读一个配置文件 kettle.properties,这个文件主要记录者 kettle 运行时可以 调用的一

48、些环境变量,关于 kettle.properties 文件怎么用,第二篇文章“使用 K ettle 设计动态转换”有提到,readProperties()方法读完这个文件之后就把里 面的键值对转换成变量传给 kettle 运行环境.当 kettle 运行完了之后就调用 shut down()方法结束转换. KettleSystemListener 相对逻辑比较简单,就不多介绍, 下面主要介绍重点类:KettleComponent KettleComponent 的方法主要有三种类型,一类是用来初始化工作,做一些验证工 作,第二类是执行转换的方法,也是主要需要讨论的方法,第三类是取得数据结果 的

49、,有时候你需要得到转换的结果交给下一个步骤处理.下面分别讨论这三类方法 。 初始化KettleComponent 的初始化工作主要是验证这个转换,包括有 validateSystem#*Settings(),init(),validateAction(),全部都是 public 方法,valida teSystemSettings()会检查 kettle 使用何种方式来连接资源库。 kettle 有两种方式连接资源库,一种是纯数据库式,也就是你所有的转换全部都 保存在一个数据库中,一般你在开始使用 kettle 的时候,它都会要求你建立一个 资源仓库,这个资源仓库的连接方式就是你的数据库连接,你需要能够有相应的数 据库驱动和对应的连接用户名和密码。另外一种连接方式是使用文本文件,也就是 xml 文件,在做完任何转换之后,我们都可以把转换或者 Job 变成 xml 文件输出, 这个输出文件包含你所有转换的全部信息。 在示例应用中使用的是文件的连接方式,下面看一下初始化的一段代码:Boolean useRepository = PentahoSystem.getSystemSetting(“kettle/settings. xml“,“repository.type“,“files“).equal

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com