一、概述
本案例是一个小型数据抽取分析类系统,通过抽取数据共享中心中生产管理系统、营销管理系统、计量自动化系统的配网台区(一个台区一个配变)的相关数据进行整合,完成有关台区的50多个字段按照日、月、多月等维度的集中计算展示,其中有17个指标字段需要系统进行自动计算,并于每天对不同部门关注的台区指标进行超标告警,除开这些基本要求之外,用户还要求支持历史报表的查询以及可以对部分计算参数进行配置修改,甚至可以修改计算参数后对历史报表产生影响。
经过数据量分析,配变基本数据方面,生产有300多万个功能位置,其中只有1.4万为配电变压器,营销系统有1万多个配变与其对应,计量系统有9000多个计量点与营销系统的配变对应,最终取得三个系统都能对应上的配变有8000多个。配变瞬时计量数据方面,计量系统的每个计量点会每15分钟产生一条数据,每天共计96条,而来宾台区所有的计量点所产生的数据每天有150万条(大约占500M的硬盘空间)。
基于需求与数量上的分析情况来看,为满足上述需求,我采取的方案是,每天通过ETL(kettle)工具从数据共享中心抽取台区的基本数据并保存在本系统中,而计量瞬时数据抽取出来后,直接对其中17个指标字段按照每日、每月(每月1号触发)二个层级进行预计算,计算结果以及引用参数都保存在本系统,完成后则将瞬时计量数据抛弃,多月的情况则由系统功能依据用户输入的查询条件基于每日、每月的结果动态计算后展现(可采用报表平台实现)。
二、台区基础数据的抽取(同构抽取)
基于Kettle的处理程序主要分成转换(ktr)和作业(kjb),2大类进行排序和调度,作业内部可以包含若干作业和若干转换。
台区基础数据的抽取过程比较通用,都基本是从数据共享中心全表抽取过来,并覆盖本地全表,抽取前需要检测数据共享中心是否正常抽取了足够的新数据,以保证本系统不会因为数据共享中心的抽数不正常而出现问题,每个表的抽取作业(kjb)如下图所示:
该作业负责抽取生产系统的设备功能位置表,主要分成3个转换(ktr)来保证,在出现因网络或者对方数据库问题而出现的问题时将进行有限次的重试。当转换出现报错时,程序则会进入图中左下方的红叉路径,然后设置计数器变量j,每次错误j+1,之后则会马上进入一个检测控件,当重试次数尚未超过阀值时则会进入等待控件(超过时路径未画,默认),等待数秒后则重新尝试执行转换,当执行成功后则对该计数器进行清零。
思路回到正常的抽取过程,该作业按照通用多表的参数化的标准来实现,在作业执行前首先先设置表名变量以及过滤条件变量。
接下来进入具体的转换,该转换负责从本库读取现有数据量,点开这个转换会看到这个转换关联到当前目录下的一个转换(ktr)文件,具体的处理流程在其中。
进入该转换,该转换共有2个控件来完成工作。
表输入负责从数据库读取相关的数据并将结果集发送到下一步,取数前需要先设置数据库连接,勾选’替换SQL语句的变量’后可以用${XXX}语法将之前设置好的表名变量读取到该控件中执行,count(1)-0可以给予在进行每天抽数的比较时的一个允许偏差幅度,例如今天待抽数据如果小于已在库中数据量10000条(count(1)-10000),则认为数据共享中心的数据不可信,则会取消本次数据抽取。
设置数据库连接,支持多种常用数据库
在设置变量这个控件中,我们可以以一个字段来赋值给一个变量,该变量将可以在后续的计算中引用,这里要注意的是变量活动类型,这里将决定该变量的可见范围(整个JVM、当前作业、当前作业的父作业、根作业),在这里我们选择当前作业即可。
下面我们进入第2个转换程序中,该程序负责获取数据共享中心的数据量。
进入该转换,该转换共有3个控件来完成工作。
表输入负责从数据库读取相关的数据并将结果集发送到下一步。
当我们其中一个控件的输出要同时发给2个后续控件的话请使用复制,不要分发,如果选择分发,则后续的控件将会分享同一份数据,而不是分别得到完整的一份数据。
在设置变量这个控件中,我们可以以一个字段来赋值给一个变量
然后我们把结果集复制到结果集,在后续的转换中他将可以被访问到
在该作业执行完成后,将查询到的数据集成平台数据量通过SQL脚本写入抽取日志表中,用自己想要的日志结构比kettle自带的简洁。
当本地的数据量以及数据集成平台上面的数据量都获取到之后,通过比较控件对2个变量进行比较。
当数据集成平台的数量不小于本地数据库的值时则进入下一个转换程序
该转换过程由2个控件来完成。
通过表输入将集成平台上的数据全部取出,表名以及过滤条件变量全部用上,取出数据后将结果集传递到表输出控件。
由表输出控件完成对本地表的清除和插入工作,表名使用目标表名变量,当勾选裁剪表选项,则等于truncate命令,效率已试过一样,可放心使用,至此,一个表的数据就完成了抽取。
因为采用了参数化,其他台区基础数据表也可以使用该作业程序进行抽取,只需改动表名变量以及条件变量即可,针对不同表名可以采用不同的查询条件,例如。
最后使用一个总作业将各个表的抽取作业串联起来,则成为一个完整的作业,下图中每个都是一个数据表的抽取过程。
未完待续……