最近在工作上用到了kettle,目前这个开源的ETl工具相对来说比较火,用做数据抽取清洗工作很方便也很快捷。当然也还有不少的问题,比如使用过程中会发生闪退(测试了几个版本都存在),还有建好的Job和Transfer保存文件,然后再次打开的时候都是空白。抛开这些问题暂时不说,试用了一段时间以后,确实是解决了很多很大的问题。
在使用kettle之前,自己生产了一个任务调度系统去完成ETl工作,不过使用起来还比较麻烦,对于批量的表,批量的数据源导入扩展性不是很好。而现在kettle的功能完全能满足我们目前的任务需求,同时kettle目前这么火没有理由不去接触kettle。
我们的需求是这样,目前我们的业务系统在线上部署了1000多个独立用户节点,而这1000多个节点的数据表结构基本上都相同,因此我们想要在kettle完成的一个工作就是,编写一个流程完成1000多个用户节点,1000多张表的数据抽取。如果一个表维护一个任务,那总共要维护1000*1000个任务,如果一个用户节点维护一个任务,那总共要维护1000多个任务。而基于各个节点的业务表结构基本一样这个特点,我们想要的是只维护一个任务,完成1000多个用户节点和1000多个表的数据抽取。基于这个需求,我们分三个步骤完成了前期调研测试。在此将三个步骤测试过程和结果放在这里,期待高手能给出更好的解决思路和方法。本实验测试环境的源数据库:Postgres,目标数据库:Postgres(正式环境将采用GreenPlum)
(1)单个数据源多表批量操作:每次只连接一个数据源,把表名作为变量,维护一个任务抽取一个用户节点的所有数据
(2)多个数据源单标批量操作:动态链接多个数据源,每个数据源只对一个表做数据抽取
(3)多个数据源多表批量操作:动态链接多个数据源,每个数据源所有表做数据抽取
下面是单个数据源多表批量操作:
1.1 新建获取表名Transfer
1) 新建Transfer所需的三个步骤分别是表输入、字段选择、复制记录到结果,并保存到文件:getTables.ktr如下图所示:
2) 设置表输入的参数,添加数据库链接,和从PG抽取表名的脚本,如下图
3) 将脚本中抽取的数据选择字段作为变量保存到下一个步骤,因为这里只有一个tablename,所以只要设置tablename就可以了,并且不用改名,如下图:
4) 将选择的字段保存到结果中,此步骤不用设置
5) 将上述操作按照步骤联结起来并保存,则完成当前Transfer设置
1.2 新建获取结果Transfer
1)新建Transfer,包含如下两个步骤,并保存为getResults,如图所示:
2)设置从结果获取记录的数据,将上一个transfer设置到结果的值取出来如下图所示:
3)设置变量,将上一步取出来的结果,设置到变量中,为后续的操作从变量中读取数据,这里讲读取出来的tablename设置为TABLENAME,如图所示:
4)将两个过程联结起来,并保存,完成当前的transfer设置,如下图所示
1.3 新建抽取数据Transfer
1) 新建一个transfer,包含数据表输入和表输出两个步骤,并命名为getDatas,如下图所示:
2) 添加表输入的数据库链接,如下图所示:
3) 设置源数据库数据获取脚本,因为这个步骤需要依赖上一个步骤设置的变量,因此这里的脚本的表名用${TABLENAME},即上一步设置的表名,并将替换SQL语句里的变量打钩。
4) 设置表输入的数据库链接信息
5) 设置表输入的其他属性信息,主要是设置目标模式和目标表,目标模式为public可省略,表是从前面传入的变量名设置为${TABLENAME},并勾选批量插入,如下图:
6) 将两个步骤联结起来并保存:
1.4 创建数据抽取子Job
1) 因为数据抽取的流程是需要获取第一个Transfer的表名,而第一个数据表名是一个列表,因此需要将数据抽取流程单独建立一个job,job包含如下三个步骤:
2) 设置第一个转换属性,将其关联到getResult转换即可,为了方便区分相应的改下名字:
3) 设置第二个转换属性,将其关联到getDatas转换即可
4) 将三个步骤联结起来,完成自job设置
1.5 创建数据抽取整个流程Job
1) 创建整体数据抽取的Job,该job包含三个部分,如下如所示:
2) 设置转换步骤的属性,将其关联到getTables
3) 设置子Job属性,将其关联到jobDatas,并在高级中将一次执行一个结果勾选,如下图:
4) 将各个步骤联结起来,完成整个job创建,如下图所示:
最后点击执行,即可全流程按照获取的表名一个表的数据获取。上传的东西不知道哪儿去了