1、 Kettle开发使用手册 25 2020年4月19日 文档仅供参考
2、
3、 Kettle开发使用手册 4月
4、
5、
6、
7、 版本历史说明 版本 作者 日期 备注 1.0 彭伟峰 .04.11 1. Kettle介绍 1.1. 什么是Kettle Kettle是纯Java编写的、免费开源的ETL工具,主要用于抽取(Extract
8、ion)、转换(Transformation)、和装载(Loading)数据。Kettle中文名称叫水壶,该项目的主程序员MATT 希望把各种数据放到一个壶里,然后以一种指定的格式流出。在这种思想的设计下,Kettle广泛用于不同数据库之间的数据抽取,例如Mysql数据库的数据传到Oracle,Oracle数据库的数据传到Greenplum数据库。 1.2. Kettle的安装 Kettle工具是不需要安装的,直接网上下载解压就能够运行了。不过它依赖于Java,需要本地有JDK环境,如果是安装4.2或5.4版本,JDK需要1.5以上的版本,推荐1.6或1.7的JDK。 运行Ke
9、ttle直接双击里面的批处理文件spoon.bat就行了,如图1.1所示: 图1.1 2. Kettle脚本开发 2.1. 建立资源库(repository仓库) Repository仓库是用来存储所有kettle文件的文件系统,由于数据交换平台服务器管理kettle文件也是用Repository仓库,因此我们这边本地的kettle开发环境也是要用到该资源库。建立资源库的方式是工具 --> 资源库- -> 连接资源库,这时候弹出一个窗口,我们点击右上角的“+”号,跟着点击下面的kettle file repository选项,按确定,如图2.1所示: 图2.1
10、 跟着在右上角选择一个目录,建议在kettle路径下新建repository文件夹,再选择这个文件夹作为根目录,名称和描述能够任意写,如图2.2所示: 图2.2 建完后会kettle工具会自动连接到repository资源库,每次打开kettle也会弹出一个窗口让你先连接到资源库。在连接到资源库的情况下打开文件就是资源库所在目录了,如图2.3所示。注意你在资源库建的目录结构要跟数据交换平台的目录结构一致,这样写好kettle脚本,保存后放的路径能跟交换平台的目录结构一致了。 图2.3 2.2. 在目标数据库里新建表 在做数据迁移的时候我们需要先在目标数据库建立与源数据
11、库类似的表结构,才能在这两张表之间做数据迁移,以oracle数据库到gp数据库,T_SF_DWJFDJXX_TEST表做数据迁移为例,我们先建类似的表结构,首先先把表结构的代码拷出来: create table T_SF_DWJFDJXX_TEST ( NSRNBM NUMBER(10) not null, DWSBH VARCHAR2(18) not null, JFDWNBM NUMBER(10) not null, HYFL_DM CHAR(1) not null, JFDWLX_DM CHAR(3) not null,
12、 SBJC_DM CHAR(2) not null, SBGLJG_DM VARCHAR2(11) not null, SWGLJG_DM VARCHAR2(11) not null, SBDJ_ZT CHAR(2) not null, DJSLRY_DM VARCHAR2(11), DJSL_RQ DATE, LRRY_DM VARCHAR2(11), XGRY_DM VARCHAR2(11), DJ_RQ DATE, DJJG_DM VARCHAR2(11), LR_SJ
13、 TIMESTAMP(6), XG_SJ TIMESTAMP(6), ZDFY_BJ CHAR(1), XMMC VARCHAR2(100), KNQYBZ_DM CHAR(1), ZDYCKJN_BJ CHAR(1), SJJHPT_SJ TIMESTAMP(6), SJJHPT_DZ NUMBER(14) ); 跟着在这个表结构的基础上,在目标数据库创立新表。需要注意的是,gp数据库的数据类型有些跟oracle的一样,有些不同。相同的就不用改了,不同的就改下。以上面的数据类型为例,相同的有ch
14、ar、date、timestamp,不同的是varchar2和number,因此,varchar2(n)要改成varchar(n),number(n)要改成integer(注意不带数字长度n)。建完之后,我们就能够在这不同数据库的两张表之间进行数据迁移或数据定时传输。 2.3. 源数据库和目标数据库的jndi设置 Jndi是kettle连接数据库的配置文件,相当于oracle的tns。Jndi设置的目录是在kettle目录下的simple-jndi文件夹里,打开后编辑jdbc.properties来设置jndi,下面附上公司揭阳涉税项目oracle 到gp数据库的jndi设置,分别是源端o
15、racle数据库和目标端gp数据库。配置信息的斜杠左边是jndi名,这里jndi的命名规则是数据库名_用户名,注意本地的jndi名要跟交换平台的jndi名一致。 配置信息的斜杠右边分别是数据库类型、驱动、数据库地址、用户名和密码。注意,相同数据库配置写法相同,不同数据库的配置写法略有不同,像下面的oracle和gp数据库的driver和url地址写法就不一样。 oracle_db_mhpt/type=javax.sql.DataSource oracle_db_mhpt/driver=oracle.jdbc.driver.OracleDriver oracle_db_mhpt/ur
16、l=jdbc:oracle:thin:@172.16.11.91:1521:zrmhdb oracle_db_mhpt/user=db_mhpt oracle_db_mhpt/password=DB_MHPT gp_public/type=javax.sql.DataSource gp_public/driver=org.postgresql.Driver gp_public/url=jdbc:postgresql://172.16.11.165:5432/postgres gp_public/database=8 gp_public/user=gpadmin gp_pub
17、lic/password=gpadmin 2.4. 写kettle脚本 Kettle脚本有两种,ktr脚本跟kjb脚本,其中ktr负责执行,具体要做什么由ktr来负责;kjb负责调度,调用一个或多个ktr。Ktr和kjb的关系类似于像员工和领导之间,员工负责具体的事务操作,领导负责计划安排工作。新建ktr脚本能够点击左上角的文件 --> 新建 --> 转换,新建kjb脚本就文件 --> 新建 --> 作业。我们这里传输数据只要用到kjb脚本,一张表的数据传输要有1个脚本。 首先先新建一个ktr文件,如图2.4所示,跟着我们按照主界面的提示拖动主键来操作。拖动组件在核心对象的组件库
18、里。 图2.4 跟着我们需要4个组件,分别是获取变量、表输入、字符串操作、插入/更新,先从组件库里找到这些组件然后拖动到右边面板上,查找组件能够用组件名称来在组建的搜索框里搜索。拖动后如图2.5所示。 图2.5 然后给她们组件之间建立连接,用拉箭头来连接即可,如图2.6所示: 图2.6 组件之间连接完之后,跟着双击组件一个个编辑。第一步是获取变量,在获取变量前首先要设置入参用来获取变量,设置变量先双击主对象树的ktr名(转换1是未保存文件到本地的默认名),跟着设置命名参数。如图2.7跟2.8所示。其中start_timestamp和end_timesta
19、mp这两个是数据交换平台服务器上默认的用于增量抽取数据的两个入参,分别表示数据开始时间跟数据结束时间。这里填上了默认值方便测试。 图2.7 图2.8 设置入参后再编辑获取变量的组件,这里名称跟入参一样,kettle变量名的写法是${Variables},类型我们选择string,因为服务器上交换平台传进来的start_timestamp和end_timestamp参数也是string类型的,我们这里跟它一致。也如图2.9所示: 图2.9 第二步是表输入,首先要先连接数据库,之前我们在本地文件上配置
20、了jndi,这里jndi就用得上。新建或编辑数据库连接,选择好连接的数据库,还有jndi连接方式,再填上jndi名称和连接名称,设置完了就点击左下角的测试来测试本地能不能连上数据库。连上了我们才做其它的步骤。 图2.10 连通好后,写好sql语句。这里sql语句用到变量,kettle变量的写法是${variables},而使用变量要在左右两端再加上单引号,变成 ’${variables}’ 。注意数据库后台的日期类型是date,而变量是字符串类型,因此需要做个变量的类型转换。因为有使用变量,因此需要勾上“替换sql语句里的变量”单选框。设置好后能够预览下数据看下。 图
21、2.11 第三步是字段去除左右空格,编辑“字符串操作”,点get fields获取从上个步骤表表输入获取的字段名,然后把trim type全部选择both,意思是去除字段左右两端的空格。如果get fields得到的字段有start_timestamp和end_timestamp这两个,这两个多余的,就删去。如下图所示: 图2.12 第四步是插入数据到目标端的新表,首先是要先连通目标端的数据库。设置好后再点击“测试”连通到目标端的数据库。 图2.13 跟着是设置目标表(目标模式能够不填),点击浏览选择模式/用户下的数据库表。然后设置每插入多少条数据提交的提交记录数量
22、用来查询的关键字选择主键的字段,而更新字段是全部,点击获取字段即可。她这里操作的原理是:如果目标表有符合该查询的条件的记录时,那么更新此条数据;不符合时,那么将源表的此条数据插入到目标表。 图2.14 这四个步骤编辑完成后最后就是执行这四个步骤了,点击左上角的运行图标,设置时间参数或者时间参数按照默认值,运行后,如果全部组件都有绿色勾勾的标志的话说明全部运行成功,如下图所示。如果某一个步骤失败的话就是红色勾勾的标志,这时候就要看日志或者步骤度量来分析了。从下面的步骤度量看表输入有1条数据输入进来,插入/更新步骤有1条数据写进去了。 图2.15
23、
24、 3. 在数据交换平台设置定时任务 以公司这边的数据交换平台为例(:9001/WebContent admin/admin),如果交换平台的jndi设置没有设置的话,那么要首先设置这样跑kettle脚本的话才能连到数据库,注意本地kettle的jndi名要跟交换平台的jndi名一致,需要统一命名。 图3.1 跟着将脚本放上服务器
25、能够在页面上上传文件到服务器。 图3.2 上传好后,需要先跑一回脚本跑成功才能设置定时调度,因此我们先运行一次。注意数据的起始时间(start_timestamp)默认是1970年,首次运行能够改下。数据的结束时间(end_timestamp)是当前的时间点。 图3.3 运行成功后,跟着再设定时任务,按要求设置调度频率。 图3.4 最后再经过运行日志监控调度的情况。如果失败的话,能够点击“查看”看运行详情,里面的“再次运行”能够重跑数据。运行详情最右侧的“查看”能够看日志信息,万一数据跑失败能够经过日志来分析情况。 图3.5






