文章目录
一、简介
上篇文章已经对kettle做了简单的介绍,并对启动及介绍了一些简答 的配置,接下来会介绍一下kettle转换(transformation) 和作业(job)的可用组件,和做一些样例介绍。
二、可用组件介绍
转换(transformation):常用组件如下图左侧
常见的转换形式有表到表,表到文件,文件到表,文件到文件
作业(job):
三、常见转换形式
3.1.基础的输入输出
首先我们点击图形化界面左上角的文件->新建->转换,我们就会得到一个空白的转换页面
输入的话看我们是什么形式的转换,这里以表对表为例。展开输入组件选择表输入(选中往右拖即可)然后双击进入表输入的编辑页面
进行步骤一编辑源数据库信息,若是能直接访问的话,点击测试则会弹出连接成功。
然后步骤二,若能测试链接成功则可以通过获取SQL查询语句,直接生成查询sql,在进行条件编辑,也可以是我们实现编辑好sql无误后,放入SQL编辑框内。可以点击预览查看会取到的数据,这样一个简单的表输入就好了
接下来我们展开输出,将表输出拖过去,数据流向由表输入指向表输出,然后参照表输入编辑表输出配置目标数据库链接属性。
数据库链接配置好之后我们就可以点击目标表后的浏览选择目标表了,在之后选择获取字段,kettle就会根据字段名进行映射关系匹配,未匹配上的也可以通过输入字段映射进行手动匹配,结束之后一个简单的转换就创建完成了,
现在数据库里面是0条
点击左上角的三角选择日志格式执行,看看结果。
结束,耗时0.5秒同步数据2408条,去数据库看看数据是不是2048条
无误,是2048条
3.2其他形式的输入输出
文件形似的输入输出跟表的输入输出不同,首先是数据源获取方式不同,可以同过文件路径+文件名来固定获取数据文件,也可以通过文件路径+通配符+通配符排除来动态获取数据文件。
我这边样例是动态获取的方式,匹配数据文件,以文本文件为例
具体的文件可以通过显示文件名查看命中的文件,通过显示文件内容查看命中文件的内容
然后需要注意的地方在于内容选项,分隔符用于将行数据分割成单个字段值,之后配置字段完成之后,可以通过预览记录查看解析完之后的数据了。
文件输出跟文件输入大同小异,也是配置文件、内容跟字段,不同的时字段可以直接通过获取得到,
3.3、转换升级
先前我们了解了怎么简单的表输入输出,文件输出输出,那么接下来,我们就可以通过一些其他组件实现一些复杂的转换了
1.可能某些全量同步的场景我们需要做一些先删后插的操作,呢么我们就可以在表输入之前加一个sql脚本清除表数据的操作,在进行表输入输出
2.亦或者我们可以在输入输出之间通过条件判断,来对数据进行不同处理,加上组件字段选择+过滤记录+条件分支来实现,同时若文件中存在某些字段需要特殊处理,则可以通过脚本文件来实现,我这边是用的java脚本文件来实现的,功能就是处理文本文件数据,满足条件通过java代码统一处理过后插入数据库,不满足条件或者异常行数据,写入异常数据文件手动处理
四、常用作业介绍
因为Job (作业) 是完成整个工作流的控制。所以我这里就以一些完整业务,来进行演示
4.1 业务一每天定时从ftp拉去数据文件
ftp上每天的文件所在的文件夹名称是每天的年月日,因为每天的时间日期不一样,所以我们需要设置一下变量,来获取每天的日期路径
这边我是通过JavaScript代码来生成日期路径的,可以通过测试脚本来进行预览。
然后将我们生成的日期路径设置成变量,提供给我们后面得步骤使用,字段名称就是我们生成的字段名称,变量名就是后续步骤引用是的变量名
有了日志路径了我们就能创建作业(job),来定时拉取ftp文件了,拖取下示步骤:start+转换+FPT下载+成功
start步骤配置定时等设置,转换则是引用上面的生成日期路径变量的转换,FTP下载则是ftp服务配置
下图中①跟②就是去前面配置的日志路径,③也可以从绝对路径调整成相对路径,这样不通的系统也能通用,不用因为开发环境跟测试线上环境不一样二次调整了
转换配置中,配置等待远程转换执行结束,勾选,然后若想记录当前转换的执行日志,可以在设置日志汇总配置日志的输出级别及日志输出文件位置
注意:变量Internal.Entry.Current.Directory变量是kettle自带相对路径变量,指当前作业所在路径,引用变量的方式为${变量名},日志文件输出路径也可以通过相对路径来配置
完成之后再start中配置上定时,那么一个定时从ftp拉取,如果想更进一步,定时拉取ftp文件之后,就对拉去下来的文件进行处理入库,就可以在定义一个作业,将拉取数据跟数据处理的两个业务串联起来变成一个完整的业务
下图就是上面案例3.2.2中的转换样例,就是去的
4.2 业务场景动态的数据连接,动态的sql
有一个需求就是,需要定时批量去执行一批sql拉去数据到目标表,关键来源数据库不是固定的,拉取数据的sql也不同。这边的设计方案就是,将需要执行的sql(这里需要查询的字段进行统一别名处理,因为最后这些数据会入到同一张表中,方便统一处理映射关系),以及数据库配置信息存在固定的数据表中,执行作业时先获取这张表中的配置数据到结果集中,将结果集中的这些配置数据循环取出设置成变量,在去执行数据处理作业,数据处理作业则是取每一行的数据配置信息变量,去动态的链接数据库,执行数据查询sql,然后插入到目标表中。
首先是三个转换任务,分别是从数据库配置表中取出数据到结果集中,从结果集中取出行数据并设置成变量,最后取出设置的变量,然后访问数据源,执行数据处理逻辑
1.取出数据到结果,取出配置中的数据id,需要执行的sql语句,访问数据库的ip端口及账号密码配置,再讲这些配置信息复制记录到结果集中,组件是转换的作业组件下面的复制记录到结果,结果集中的字段名就是sql
2.循环作业中的第一步,从结果集中取出单行数据,并设置成变量,提供后续步骤使用,字段名称就是上述的sql查询的出来的字段名,,设置变量中的字段名也一样,变量名则是后续步骤引用的字段变量名。
3.然后就是第三部转换,获取变量就是获取上一个步骤中设置的变量信息,在sql脚本中就可以使用去们前面步骤拿到的变量id清掉上一次拉去到的数据,需要注意的点就是勾选变量替换
接下来就要中点说一下表输入,首先一点,在配置数据连接时的连接属性都是动态了,通过前面取到的变量进行动态赋值,这样我们才能满足不同的查询访问不同的数据库的要求,然后我这里对取到的sql语句进行了一下二次包装,除了语句本身的业务字段之外,我还加上了uuid作为数据主键id,然后将配置id跟业务数据的关联关系加上了,方便下次能后进行针对性的数据清理工作。最后就是表述出,没什么需要特别注意的了,就是将我们查询到底数据字段跟目标表字段一一对应上就行了,因为这些流程都是动态的,所以我们没办法调试或者一键拉取,配置上的麻烦程度会偏高一些。
然后就是两个作业将整个流程串联起来,首先是内部循环处理的子作业,将从结果集取数据到变量和数据处理两个转换进行串联起来这里没有什么需要特别注意的地方,就是关联的文件路径跟设置的日志路径都可以使用相对路径来实现跨服务器的调度。
最后就是最终的作业完成业务闭环,将取数据到结果集的转换跟循环处理的子作业串联起来。这里有一点需要注意的就是循环作业的配置,因为这里的逻辑需要循环执行,所以需要勾选执行每一个输入行,其他的就没什么了。定时的配置也是在当前作业的start中根据需求来配置
小结
已上内容就是我的一些不成熟的经验分享,有不清楚的地方欢迎大家留言。下一次,我会给大家分享一下,将kettle任务跟spring定时任务结合起来,由spring定时任务调度来控制kettle执行文件的定时调度工作,及执行日志监控。