认真学习了别人的博文,学习了kettle的使用,结果发现最重要的是第三篇,要用java程序调kettle来执行。
所以,接着学习。
一:学习时不懂的知识
脚本script是使用一种特定的描述性语言,依据一定的格式编写的可执行文件,又称作宏或批处理文件。脚本通常可以由应用程序临时调用并执行。各类脚本目前被广泛地应用于网页设计中,因为脚本不仅可以减小网页的规模和提高网页浏览速度,而且可以丰富网页的表现,如动画、声音等。举个最常见的例子,当我们点击网页上的E-mail地址时能自动调用Outlook Express或Foxmail这类邮件软件,就是通过脚本功能来实现的。又如洪恩网站?http?//www.hongen.com?一些网页的英文新闻内容旁会有一个三角符号,点击它就可以听到英文诵读,这也是脚本在起作用。 也正因为脚本的这些特点,往往被一些别有用心的人所利用。例如在脚本中加入一些破坏计算机系统的命令,这样当用户浏览网页时,一旦调用这类脚本,便会使用户的系统受到攻击。所以用户应根据对所访问网页的信任程度选择安全等级,特别是对于那些本身内容就非法的网页,更不要轻易允许使用脚本。通过“安全设置”对话框,选择“脚本”选项下的各种设置就可以轻松实现对脚本的禁用和启用。
Git是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
Torvalds 开始着手开发 Git 是为了作为一种过渡方案来替代 BitKeeper,后者之前一直是 Linux 内核开发人员在全球使用的主要源代码工具。开放源码社区中的有些人觉得 BitKeeper 的许可证并不适合开放源码社区的工作,因此 Torvalds 决定着手研究许可证更为灵活的版本控制系统。尽管最初 Git 的开发是为了辅助 Linux 内核开发的过程,但是我们已经发现在很多其他自由软件项目中也使用了 Git。例如 最近就有很多 Freedesktop 的项目也迁移到了 Git 上。
分布式和集中式的最大区别在于开发者可以本地提交。每个开发者机器上都有一个服务器的数据库。
二、kettle体系
Kettle分为kettle平台、各类插件。其中kettle平台是整个系统的基础,包括UI、插件管理、元数据管理和数据集成引擎。UI显示Spoon这个核心组件的界面,通过xul实现菜单栏、工具栏的定制化,显示插件界面接口元素。元数据管理引擎管理ktr、kjb或者元数据库,插件通过该引擎获取基本信息。插件管理引擎主要负责插件的注册。数据集成引擎负责调用插件,并返回相应信息。
图 2‑1 Kettle插件架构
Kettle分为kettle平台、各类插件。其中kettle平台是整个系统的基础,包括UI、插件管理、元数据管理和数据集成引擎。UI显示Spoon这个核心组件的界面,通过xul实现菜单栏、工具栏的定制化,显示插件界面接口元素。元数据管理引擎管理ktr、kjb或者元数据库,插件通过该引擎获取基本信息。插件管理引擎主要负责插件的注册。数据集成引擎负责调用插件,并返回相应信息。
Kettle是众多“可供插入的地方”(扩展点)和“可以插入的东西”(扩展)共同组成的集合体。在我们的生活中,电源接线板就是一种“扩展点”,很多“扩展”(也就是电线插头)可以插在它上面。
在Kettle中不管是以后的扩展还是系统集成的功能,本质上来讲都是插件,管理方式和运行机制是一致的。系统集成的功能点也均实现了对应的扩展接口,只是在插接的说明上略有不同。
Kettle的扩展点包括step插件、job entry插件、Database插件、Partioner插件、debugging插件,这里我们重点介绍step、job entry、database插件。暴露的扩展点如下表所示:
表 1 Step扩展接口
Java接口 |
基类 |
主要功能 |
StepMetaInterface |
BaseStepMeta |
存储step设置信息 验证step设置信息 序列化step设置信息 提供获取step类的方法 |
StepDialogInterface |
BaseStepDialog |
step属性信息配置窗口 |
StepInterface |
BaseStep |
处理rows |
StepDataInterface |
BaseStepData |
为数据处理提高数据存储 |
表 2 job entry扩展接口
Java接口 |
基类 |
主要功能 |
JobEntryInterface |
JobEntryBase |
存储job entry设置信息 序列化job entry设置信息 提供获取job entry类的方法 执行job entry任务 |
JobEntryDialogInterface |
JobEntryDialog |
job entry属性信息配置窗口 |
表 3 Database 扩展接口
Java接口 |
基类 |
主要功能 |
DatabaseInterface |
BaseDatabaseMeta |
访问各类数据库 |
1.2.2. 插件的建立
Kettle中的插件包含两部分,一是系统本身就已经实现的功能点,在源码目录src中说明,如kettle-steps.xml;二是系统之外开发的插件,在plugins目录对应插件目录下的plugins.xml说明,plugins/steps/S3CsvInput/plugins.xml。
系统集成插件定义(step为例)
表 4 系统自带插件定义
内容 |
位置 |
插件说明信息 |
src/kettle-steps.xml,所有插件集中说明 |
插件源码 |
src与src-ui下,org.pentaho.di.steps.插件名 |
插件图片 |
插件说明xml中说明 |
插件界面文字说明 |
org.pentaho.di.steps.插件名.messages |
插件说明信息中包括描述信息、类名(包括package,反射用)、父级目录(Spoon左侧栏目录)、提示信息和图片信息。Kettle使用国家化方式编程,所以软件中的所有文字描述均由messages_**.properties提供。
图 2‑2 系统集成插件说明xml结构
扩展插件定义
所以新开发的扩展插件,均放在同一的目录下进行管理,插件管理模块会自动去该目录下进行搜索查找。插件目录结构如下所示:
图 2‑3 扩展插件目录结构
表 5 扩展插件定义
内容 |
位置 |
插件说明信息 |
plugins/插件类型/插件名称/plugin.xml |
插件源码 |
*.jar |
插件图片 |
plugins/插件类型/插件名称/ |
插件依赖包 |
plugins/插件类型/插件名称/ |
扩展插件与系统集成插件的说明内容相似,扩展插件增加ID属性和依赖属性,同时他的目录结构、描述信息和提示信息均能进行国际化配置。
图 2‑4 扩展插件说明xml结构
1.2.3. 插件的注册
Spoon在启动的时候会对所有插件进行注册,并保存在PluginRegistry类里面。平台通过查找PluginRegistry注册表获取插件信息。Kettle安装插件需要进行重启,卸载插件也只需简单的删除plugins目录结构下对应的文件即可。
图 2‑5 插件注册时序图
图 2‑6 plugin注册相关的UML类图
PluginRegistry首选注册本系统的插件类型处理类,源码中注册了7中类型,我们这里仅介绍3中,并以StepPluginType为例。注册类型处理类后,PluginRegistry按照不同的类型进行插件搜索(模板模式),基类BasePluginType提供了本地搜索、jar搜索、xml信息搜索3种钩子。根据搜索结果,按照不同的插件类型存储在PluginRegistry中。
1.2.4. 插件查找
PluginRegistry提供了插件查找功能,准确的来说是插件信息的查找功能。以steps在左侧功能栏里面的显示为例,进行插件查找的说明。提供了getPlugins获取指定插件类型列表、getPlugin获取指定成名插件、getCateories获取目录结构、getClass获取指定插件类等方法。
图 2‑7 Spoon中step列表
左侧显示由Spoon.refreshCoreObjects()函数实现,如果选择时trans相关的内容,将显示所有的step插件。流程图如下所示:
图 2‑8 spoon界面step插件显示流程
1.2.5. 插件调用
Kettle中调用插件时,平台通过元素管理引擎获取对应的插件信息,通过反射生成插件对象,调用对应的函数。Kettle以外观模式的方式调用插件,我们以双击某个插件图表,弹出对应配置界面为例进行说明,具体的转换时调用将在后面进一步说明。
Spoon界面交互相关的处理器都封装到SpoonDelegates中,根据不同的事件类型调用对应的事件处理函数。UML类图如下所示。
图 2‑9 事件代理类
SpoonStepsDelegate提供了与UI交互相关的处理事件,如复制、删除、粘贴、编辑等。双击某个step时会调用编辑功能,编辑功能是对插件StepDialogInterface的封装。时序图如下:
图 2‑10 双击编辑step时序图
双击是TransGraph对象注册的时间,双击是根据页面上的坐标信息获取双击的stepmeta对象(来自于*.ktr)。然后,将这个对象传给事件代理类处理,根据stepmeta对象,获取对应的插件类名,通过反射生成StepDialogInterface的实例并调用open()方法。
1.2.6. 插件间通信
Kettle插件之间天生就具有通信共享数据的特点,kettle中最主要通信方式是通过插件时间共同关联一个数据类对象的方式进行通信;使用单例模式实现插件间信息共享。
第一种方式还设计多线程同步的问题,在后面的章节中将会进行重点介绍。
1.2.7. 插件生命周期
Kettle并不能做到热插拔,每次添加或者删除插件的时候都需要重启。安装或删除插件,只需要在plugins文件夹下添加或删除对应的文件即可。
图 2‑1 Kettle插件架构
Kettle分为kettle平台、各类插件。其中kettle平台是整个系统的基础,包括UI、插件管理、元数据管理和数据集成引擎。UI显示Spoon这个核心组件的界面,通过xul实现菜单栏、工具栏的定制化,显示插件界面接口元素。元数据管理引擎管理ktr、kjb或者元数据库,插件通过该引擎获取基本信息。插件管理引擎主要负责插件的注册。数据集成引擎负责调用插件,并返回相应信息。
2. 平台体系结构
2.1. 元数据管理引擎
元数据主要包括转换元数据(.ktr)和Job元数据(.kjb),元数据也可以存储在数据库中,这里我们主要介绍文件存储形式的。
元数据管理类包括TransMeta,该类定义了一个转换(对应一个.ktr文件),提供了保存和加载该文件的方法;JobMeta类,同样对应于一个工作(.kjb文件),提供保存和加载方法。StepMeta类保存的是Step的一些公共信息的类,每个类的具体的元数据将保存在显示了StepMetaInterface的类里面。
两个类中主要保存的信息如下:
代码 1 TransMeta类主要属性
1 private List<StepMeta> steps; 2 3 private List<TransHopMeta> hops; 4 5 private String name; 6 7 private Result previousResult;//上一个jobentry的执行结果。 8 9 private List<RowMetaAndData> ;//resultRows;这次trans执行后的数据结果。 10 11 private List<ResultFile> resultFiles;
steps字段对应于.ktr中的<step>节点,hops字段对应于<hop>节点。resultRows、previousResult实际上是插件见的通信类。
代码 2 JobMeta类主要属性
1 protected String name; 2 3 protected String filename; 4 5 public List<JobEntryInterface> jobentries;//保存jobentry列表 6 7 public List<JobHopMeta> jobhops;//保存jobentries之间的链接关系。 8 9 public List<DatabaseMeta> databases;
2.2. UI显示
2.2.1. TransGraph类
图 3‑1 TransGraph类与显示
选中转换标签后,红框内的编辑区对象对应org.pentaho.di.ui.spoon.trans包中的TransGraph类。
2.2.2. JobGraph类
图 3‑2 JobGraph与显示
选中Job标签后,红框内的编辑区对象对应org.pentaho.di.ui.spoon.job包中的JobGraph类。
2.3. 转换执行引擎
2.3.1. Trans类
Trans类负责转换执行相关的所有任务,包括转换加载、相关插件的实例化、初始化、运行、监视转换执行,并把内容放置到TransInfo类中。
2.3.2. StepInitThread类
Step初始化线程包装类,使用多线程,调用所有StepInterface实现类的Init函数。
2.3.3. StepMetaDataCombi类
把插件的主要实现类全部存储在这个类中,方便集中调用。
1 public class StepMetaDataCombi 2 3 { 4 5 public StepMeta stepMeta; 6 7 public String stepname; 8 9 public int copy; 10 11 public StepInterface step; 12 13 public StepMetaInterface meta; 14 15 public StepDataInterface data; 16 17 }
2.3.4. RunThread类
步骤处理线程包装类,这个类能够处理异常并将其记录到日志中。同时,也能够在异常发生或者执行结束后,记录相关内容、关闭相关资源。
2.4. Job执行引擎
2.4.1. Job类
Job的执行类,本身实现了Thread是一个单独的线程。Job entry可以是单独的线程,也可以是顺序执行,大多数情况都是顺序执行下一步以上一步的执行结果为基础。Job类也包括转换加载、相关插件的实例化、初始化、运行、监视Job执行。
图 2‑1 Kettle插件架构
Kettle分为kettle平台、各类插件。其中kettle平台是整个系统的基础,包括UI、插件管理、元数据管理和数据集成引擎。UI显示Spoon这个核心组件的界面,通过xul实现菜单栏、工具栏的定制化,显示插件界面接口元素。元数据管理引擎管理ktr、kjb或者元数据库,插件通过该引擎获取基本信息。插件管理引擎主要负责插件的注册。数据集成引擎负责调用插件,并返回相应信息。