Kettle 4.2源码分析第四讲--KettleJob机制与Database插件简介(含讲解PPT)
1. Job机制
一个job项代表ETL控制流中的一项逻辑任务。Job项将会顺序执行,每个job项会产生一个结果,能作为别的分支上job项的条件。
图 1 job项示例
1.1. Job类图简介
图 2 Job entry类图结构
1.1.1. JobEntryInteface接口
JobEntryInterface是Job Entry插件的主要实现接口。主要包含以下功能:
1 保存Job Entry设置
实现类使用私有变量保存设置的参数,通过get、set方法获取和设置。Dialog实现类会通过这些方法,保存或设置设置界面上的参数。同时,需要提供一个深度拷贝的方法,因为在一些保存参数且可能修改的地方会调用。
图 3 JobEntryTrans配置界面
2 序列化插件
插件要实现对本插件的序列化,实现两种方式xml与数据库。
图 4 转换插件xml序列化结果
3 输出信息提供
一个job entry支持三种类型的输出:true、flase和无条件。这三种情况不是所有的job entry插件都会同时支持的,例如dummy job entry仅支持true和false。所以,插件必须显现两类函数,来查看支持哪种结果。
public boolean evaluates()//是否支持true、false
public boolean isUnconditional()//是否支持无条件执行
4 执行任务
负责工作的执行。
public Result execute()//执行具体的逻辑,需要结果和开始到该项的距离
prev_result.setNrErrors()//设置执行过程中的异常数
prev_result.setResult()//设置结果,如果不知道true/false,结果不设置
最后返回prev_result。
1.1.2. JobEntryDialogInteface接口
负责构建和打开参数设置对话框。Spoon通过调用open函数打开该对话框,spoon是使用swt框架的,所以对话框也应使用swt来实现。
1.2. Job entry交互通信类
1.2.1. Result
每一个jobEntryInterface的实现类在完成相应功能时,返回结果的类型。
主要成员变量:
private boolean result;执行是否出现异常 private int exitStatus; 执行结果状态 private List<RowMetaAndData> rows;一个jobEntry完成处理后的数据(若存在) private Map<String, ResultFile> resultFiles;
1.3. Job配置及开启
图 5 Job开启时序图
Job的开启与Trans相类似,配置执行的参数,检查.kjb文件是否发生变化,实例化一个Job对象,开启该线程。
1.4. Job执行
1.4.1. 初始执行excute1()
主要工作是从JobMeta的JobHopMeta找到job入口jobentry信息,根据开始条件调用真正执行jobentry的execute方法2,代码如下所示:
代码 4 Job.excute()关键代码
startpoint=jobMeta.findJobEntry(JobMeta.STRING_SPECIAL_START, 0, false);// 找到Job开始组件
JobEntrySpecial jes = (JobEntrySpecial) startpoint.getEntry();
// JobEntrySpecial是启动job的job项目
Result res = null;
while ( (jes.isRepeat() || isFirst) && !isStopped()){
//符合开始条件时,调用execute方法2
isFirst = false;
res = execute(0, null, startpoint, null,
Messages.getString("Job.Reason.Started"));
}
1.4.2. 实际执行execute2()
execute()方法包含,的参数有执行次数(START不算,从0开始,顺序执行)、接一个Entry执行结果、当前Entry的拷贝、前一个Entry拷贝和原因。
主要功能是根据参数startpoint,提取对应的jobentry,执行对应的jobentry操作,再根据JobMeta的hop信息依次得到下一个jobentry,递归调用。具体的执行步骤如下所示:
图 6 Job执行步骤
1.5. JobEntry执行
1.5.1. JobEntry类
具体每个组件的执行体对应org.pentaho.di.job.entries包内每个entry的具体实现。
execute()方法2中调用jobEntry的execute()完成jobEntry的具体功能。
1.5.2. 不同jobEntry的实现
final Result result = cloneJei.execute(prevResult, nr, rep, this);
不同的Job项目(JobEntry)实现差别很大。
JobEntrySpecial
功能是开启一个job,只是简单地对传递来的preResult设置它的的result属性值为true,(Job项目据此判断前一结果执行完毕)。返回该对象即可。
JobEntryTableExit
功能是判断一个table是否存在数据库中。JobEntryTableExit Job项目有属性tablename和DatabaseMeta(对数据库的元数据信息描述)根据DatabaseMeta得到一个Dabase对象db,建立连接db.connect(); 调用db.checkTableExists(tablename)根据此返回值设置preResult的result属性为否为true。返回preResult对象。
JobEntryTrans
JobEntryJob和JobEntryTrans是嵌套job或trans的Job项目(JobEntry)。它们是比较复杂的job项目。
作用是执行一个trans。首先实例化一个TransMeta,之后实例化Trans。调用trans.start(),当执行完毕后调用函数trans.getResult(),并把结果加到preResult中,返回该对象即可。
补充说明
Result中也可以有处理数据,这些处理数据可以作为下一个Job项目(JobEntry)的输入。但是容量受内存容量限制。
2. 数据库插件
PDI使用数据库插件来进行数据库的正确连接、执行SQL,同时也考虑现有数据的各种特殊功能和不同限制。
在PDI里面,已经集成了非常多的数据库插件,大部分的插件都会继承自BaseDatabaseMeta。下面所示的方法通常都需要被重写,基类里面并没有相关的实现。要实现的方法主要分成3大主题:连接信息、SQL方言和功能标记。
1 连接详情
当PDI建立数据库连接时将会调用这些函数,或者数据库设置对话框里显示与方言有关的内容时也会调用。
- public String getDriverClass()
- public int getDefaultDatabasePort()
- public int[] getAccessTypeList()
- public boolean supportsOptionsInURL()
- public String getURL()
2 SQL Generation
构建有效的SQL数据库方言时会调用这些方法。
- public String getFieldDefinition()
- public String getAddColumnStatement()
- public String getSQLColumnExists()
- public String getSQLQueryFields()
3 功能标记
查询使用的数据库是否支持该功能。
- public boolean supportsTransactions()
- public boolean releaseSavepoint()
- public boolean supportsPreparedStatementMetadataRetrieval()
- public boolean supportsResultSetMetadataRetrievalOnly()
PS:Kettle源码分析算是全部讲完了,最后奉送自己做的PPT http://pan.baidu.com/share/link?shareid=3803402535&uk=3792525916。Kettle应该算是比较小众的软件,但是在业界还是非常有名气的。我看到过好几个中国的公司,包括上市公司,说自己最新的ETL工具或者数据共享交换工具都是Kettle的改版。
Kettle 4.2源码分析第四讲--KettleJob机制与Database插件简介(含讲解PPT)的更多相关文章
- 插件开发之360 DroidPlugin源码分析(四)Activity预注册占坑
请尊重分享成果,转载请注明出处: http://blog.csdn.net/hejjunlin/article/details/52258434 在了解系统的activity,service,broa ...
- dubbo源码分析5-dubbo的扩展点机制
dubbo源码分析1-reference bean创建 dubbo源码分析2-reference bean发起服务方法调用 dubbo源码分析3-service bean的创建与发布 dubbo源码分 ...
- Koa源码分析(三) -- middleware机制的实现
Abstract 本系列是关于Koa框架的文章,目前关注版本是Koa v1.主要分为以下几个方面: Koa源码分析(一) -- generator Koa源码分析(二) -- co的实现 Koa源码分 ...
- Java集合源码分析(四)HashMap
一.HashMap简介 1.1.HashMap概述 HashMap是基于哈希表的Map接口实现的,它存储的是内容是键值对<key,value>映射.此类不保证映射的顺序,假定哈希函数将元素 ...
- Docker源码分析(四):Docker Daemon之NewDaemon实现
1. 前言 Docker的生态系统日趋完善,开发者群体也在日趋庞大,这让业界对Docker持续抱有极其乐观的态度.如今,对于广大开发者而言,使用Docker这项技术已然不是门槛,享受Docker带来的 ...
- ABP源码分析十四:Entity的设计
IEntity<TPrimaryKey>: 封装了PrimaryKey:Id,这是一个泛型类型 IEntity: 封装了PrimaryKey:Id,这是一个int类型 Entity< ...
- Heritrix源码分析(十四) 如何让Heritrix不间断的抓取(转)
欢迎加入Heritrix群(QQ):109148319,10447185 , Lucene/Solr群(QQ) : 118972724 本博客已迁移到本人独立博客: http://www.yun5u ...
- 二维码zxing源码分析(四)wifi部分
前三个部分的地址是:ZXING源码分析(一)CAMERA部分 . zxing源码分析(二)decode部分.zxing源码分析(三)result.history部分 前面三篇文章基本上已经把zxin ...
- Heritrix源码分析(十四)
近段时间在搞定Lucene的一些问题,所以Heritrix源码分析暂时告一段落.今天下午在群里有同学提到了Heritrix异常终止的问题以及让Heritrix不停的抓取(就是抓完一遍后载入种子继续抓取 ...
随机推荐
- 启动vue项目,npm run dev服务起不来报错Error: listen EACCES 0.0.0.0:8080
端口被占用,所以才会报这个错误,解决方法: 方法1:释放端口8080 方法2:换一个新端口
- .Net使用DES加密,.Net和java分别解密,并正则匹配替换加密密码为明文
在VS中用WindowsApplication做一个exe程序,用来给数据库密码加密,加密代码如下 private void generateBtn_Click(object sender, Even ...
- ubuntu 上安装vnc server
Ubuntu下设置VNCServer Virtual Network Computing(VNC)是进行远程桌面控制的一个软件.客户端的键盘输入和鼠标操作通过网络传输到远程服务器,控制服务器的操作 ...
- Splash go() 方法
go()方法用来请求某个链接,而且它可以模拟 GET 和 POST 请求,同时支持传入请求头.表单等数据 function main(splash) ok, reason = splash:go(&q ...
- 关于PullToRefreshView bug 的修复
前几天网友yufengzungzhe@163.com指出PullToRefreshView的一个bug.当时麦洛还没有注意到,现在麦洛已经利用修复了.其实解这个bug也不难. 只要在下面这个方法做一点 ...
- javaweb项目中表单生成的验证码以及校验
首先先来看一下项目的结构吧,有两个servlet,一个是进行验证码的生成以及存储的,一个是进行校验的,还有一个jsp页面是用来实现form表单的书写和展示: 我们只需要看这三个就行了,其他的自动忽略: ...
- Java实现简单的正则表达式匹配
import java.util.regex.Pattern; public class Test_REG { public static void main(String[] args) { //只 ...
- Puppet部署
一.域名,IP规划 域名:beyond.com puppet master:puppet.sa.beyond.com 192.168.254.254 puppet client: *.beyond ...
- 【面试题】Java EE面试题
第一部分:Servlet/JSP快速入门 1. 请列举至少6种javaEE技术,并简述其作用. 解析: javaEE是一系列的技术,主要包扩13种.对于开发人员来说,了解几种主要的技术是非常 ...
- Windows server 创建FTP 包括ftp的账号密码设置
原始文章 : https://blog.csdn.net/missingshirely/article/details/50767043 最近要做个FTP上传资源的工具,以前都是我提供目录,由公司网管 ...