Kettle源码分析

时间:2024-03-29 08:59:57

最近做一个大型项目需要做数据的抽取和标准化处理,我们利用一款国外的开源工具Kettle,对Kettle的核心包进行二次开发,应用到我们的Java项目中。

Kettle工具:https://sourceforge.net/projects/pentaho/files/latest/download
Kettle源码:https://github.com/pentaho/pentaho-kettle

以下是我学习参考的资料《Kettle体系结构和源码分析》做的笔记,新版本的Kettle源码和资料描述有所出入,但也可以参考学习。
后续等我学到一定程度再分享自己的实战经验给大家。
资料地址:链接:https://pan.baidu.com/s/1nBE7x2Ll-iFNOhiMtxML1A
提取码:6gip


1.简介

Kettle它是一款国外开源的ETL工具,有两种脚本文件transformation和job,transformation完成对数据的基础转换,job则是完成整个工作流的控制。

(ETL就是数据抽取(Extract)、转换(Transform)、装载(Load)的过程。)


2.相关概念

Job:称为作业,它有不同逻辑概念的entry组件组成,数据从一个entry组件传递到另一个entry组件,并在entry组件进行相应的处理。
Transformation:称为转换,主要完成对数据的基础转换。
Entry:称为实体,它是job的组成单位、执行单元。
Step:称为步骤,它是Transformation的功能单元,是转换过程中的一个特定步骤。
Hop:称为工作流,它是转换过程的流向指示,从一个组件指向另一个组件,有无条件流向,判断为真时流向、判断为假时流向三种Hop。


3.体系结构

Kettle源码分析
Kettle平台是整个系统的基础,包括元数据管理引擎、数据集成引擎、UI和插件管理模块。

(1)元数据管理引擎

元数据管理引擎管理ktr、kjb或者元数据库,插件通过该引擎获取基本信息,主要包括TransMeta、JobMeta和StepMeta三个类。
(一个完整的数据处理流程里面包含着两种脚本文件transformation和job,对应的就是一系列的以.ktr和.kjb为扩展名的文件)
TransMeta类:定义了一个转换(对应一个.ktr文件),提供了保存和加载该文件的方法
JobMeta类:对应一个工作(对应一个.kjb文件),提供保存和加载该文件的方法
StepMeta类:保存的是Step的一些公共信息的类,每个类的具体元数据将保存在显示了StepMetaInterface的类里面。

(2)数据集成引擎

数据集成引擎包括Step引擎、Job引擎和数据库访问引擎三大部分,主要负责调用插件,并返回相应信息。

(3)UI

UI显示Spoon这个核心组件的界面,通过xul实现菜单栏、工具栏的定制化,显示插件界面接口元素,其中的TransGraph类和JobGraph类是用于显示转换和Job的类。
(graph [ɡræf] n.图表,曲线图 vt.用曲线图表示,把…绘入图表;用胶版印刷)

Kettle源码分析
TransGraph类:选中转换1后,红框内的编辑去对象对应org.pentaho.di.ui.spoon.trans包中的TransGraph类。

Kettle源码分析
JobGraph类:选中作业1后,红框内的编辑区对象对应org.pentaho.di.ui.spoon.job包中的JobGraph类

(4)插件管理模块

Kettle是众多“扩展点”和“扩展”共同组成的集合,在生活中,电源接线板就是一种“扩展点”,很多“扩展”(也就是电线的插头)可以插在它上面。插件管理引擎主要负责插件的注册。
Kettle的扩展点包括step插件、job entry插件、Database插件、Partioner插件、debugging插件。

4.功能模块

Kettle主要包括四大功能模块:
Chef--------工作(job)设计工具(GUI方式)
Kitchen--------工作(job)执行器(命令行方式)
Spoon--------转换(transform)设计工具(GUI方式)
Span--------转换(transform)执行器(命令行方式)
(GUI:图形用户界面)

(1)Chef--------工作(job)设计工具

何谓工作?多个作业项按特定的工作流串联起来,形成一项工作。
正如我的工作是:软件开发 我的作业项是:设计、编码、测试!
先设计,如果成功,则编码,否则继续设计,编码完成则开始测试,周而复始、作业完成。
Kettle源码分析

1)Chef中的作业项

Kettle源码分析
列出几个简单的作业项,不做功能介绍了。

2)工作流

Kettle源码分析

3)存储方式

支持XML存储,或存储到指定数据库中。
用户目录下.kettle文件一般存储用户的默认配置。

4)LogView

可查看执行日志

(2)Kitchen--------工作执行器

作业执行引擎,用来执行作业,参数如下:
Kettle源码分析

(3)Spoon--------转换设计工具

Kettle源码分析

(4)Span--------转换执行器

Kettle源码分析

5.概念模型(略)

6.Kettle数据流图(略)

这两节对我们使用和二次开发基本没影响
文档在百度云盘中,感兴趣的自己下载来看


7.插件扩展机制

Kettle每次添加或者删除插件的时候都需要重启,安装或删除插件,只需要在gins文件夹下添加或删除对应的文件即可。
这里介绍Kettle几个重要的扩展点:step、job entry、database插件。
Step扩展接口

Kettle源码分析
job entry扩展接口
Kettle源码分析

Database扩展接口
Kettle源码分析

(1)插件的建立

Kettle中的插件包含两部分,一是系统本身就已经实现的功能点,在源码目录src中说明,如kettle-steps.xml;二是系统之外开发的插件,在plugins目录对应插件目录下的pluings.xml(plugins/steps/S3CsvInput/pluings.xml)

1)系统集成插件定义

系统自带插件定义
Kettle源码分析
系统集成插件说明xml结构图如下:
Kettle源码分析
插件说明信息包括描述信息、类名(包括package,反射用)、父级目录(Spoon左侧栏目录)、提示信息、图片信息。Kettle使用的是国际化语言编程,提供了多种国家语言方式,语言软件的文字描述均由message_**.properties提供。

2)扩展插件定义

所有新开发的扩展插件,均放在统一目录下进行管理,插件管理模块会自动去该目录下进行搜索查找。插件目录结构如下所示:
扩展插件定义
Kettle源码分析
扩展插件说明xml结构图如下:
Kettle源码分析
扩展插件与系统集成插件的说明内容相似,扩展插件增加ID属性和依赖属性,同时他的目录结构、描述信息和提示信息均能进行国际化配置。

(2)插件的注册

Spoon在启动时会对所有插件进行注册,并保存在PluginRegistry类里面,Kettle平台通过查找PluginRegistry注册表获取插件信息。Kettle安装插件需要进行重启,卸载插件只需简单删除plugins目录下对应的文件即可。
插件注册时序图
Kettle源码分析

(3)插件查找

PluginRegistry提供了插件信息查找功能,getPlugins获取指定插件类型列表、getPlugin获取指定成名插件、getCateories获取目录结构、getClass获取指定插件类方法。
Kettle源码分析
红色区域由Spoon。refreshCoreObjects()函数实现,如果选中trans相关内容,将显示所有step插件:
Kettle源码分析
Spoon界面step插件显示流程图
Kettle源码分析

(4)插件调用

Kettle中调用插件时,平台通过元素管理引擎获取对应的插件信息,通过反射生成插件对象,调用对应的函数。Kettle以外观模式的方式调用插件。
Spoon界面交互相关的处理器都封装到SpoonDelegates中,根据不同的事件类型调用对应的事件函数。
事件代理类UML类图
Kettle源码分析
SpoonStepsDelegate提供了与UI交互相关的处理事件,如复制、删除、粘贴、编辑等。
双击某个step时会调用编辑功能,编辑功能是对插件StepDialogInterface的封装。双击是TransGraph对象注册的事件,双击是根据页面上的坐标信息获取双击的stepmeta对象,然后,将这个对象传给事件代理类处理,根据stepmeta对象,获取对应的插件类名,通过反射生成StepDialogInterface的实例并调用open()方法。

(5)插件间通信

Kettle插件之间天生就具有通信共享数据的特点,Kettle最主要的通信方式是通过插件之间共同关联一个数据类对象的方式进行通信,使用单例模式实现插件间信息共享。

8.核心包(模块)、类和接口

Kettle包含的核心包(模块)、类和接口,分为辅助层(底层)、逻辑层和界面层。对应的源码包结构是core,src,ui的顺序,如下列表所示:
Kettle源码分析

9.目录结构

(1)总体目录结构

Kettle源码分析

(2)core包

kettle的核心包
Kettle源码分析

(3)engine包

包含调度逻辑和具体的执行代码。当我们开发entry或step插件的时候会用到里面的类。
Job的每个执行单元称为entry。Transfromation中的每个执行步骤称为step。
Kettle源码分析

(4)ui包

Kettle源码分析

10.主要源码分析(略)

11.Kettle资源文件及配置文件(略)

Kettle源码分析
Kettle源码分析

如图为自定义插件效果。