Pentaho中国爱好者社区   Pentaho 授权经销商

 找回密码
 申请账户

用新浪微博连接

一步搞定

搜索
热搜: 活动 交友 discuz
Pentaho中国爱好者社区 门户 Kettle 查看内容

Java 应用程序中集成kettle

2011-12-26 15:28| 发布者: admin| 查看: 6363| 评论: 0

摘要: 如果你需要在自己的 应用程序中集成 一般来说有两种应用需求: 一种是通过纯设计器来设计ETL 转换任务,然后保存成某种格式,比如xml 或者在数据库中都可以,然后自己调用程序解析这个格式,执行这种转换,是比较抽 ...
  如果你需要在自己的 应用程序中集成 一般来说有两种应用需求:
  一种是通过纯设计器来设计ETL 转换任务,然后保存成某种格式,比如xml 或者在数据库中都可以,然后自己调用程序解析这个格式,执行这种转换,是比较抽象的一种执行方式 ,ETL 里面转换了什么东西我们并不关心,只关心它有没有正常执行。
  另一种是通过完全编程的方式来实现,详细 的控制每一个步骤,需要知道转换执行的成功与否,这种方式可能需要更多的理解 kettle的API 以便更好的跟你的应用程序紧密结合,不过难度也比较大,可以很好的定制你的应用程序,代价自然是入门门槛比较高。
  本文主 的集 成方式,文中所列出的代码节选自 pentaho,不过应用程序本 没有什么关系。Pentaho 集成 的代码主要是两个类,KettleSystemListerner 和KettleComponent ;
看名字就猜出 KettleSystemListerner主要是起监听器的作用,它主要负责初始化 kettle的 一 些 环 境 变 量 , 这 个 类 主 要 包 含 四 个 方 法:startup(),readProperties(),enviromentInit(),shutdown(), 程序入口自然是startup() 方法,然后
它会调用 enviromentInit()方法,这个方法就调用readProperties() 方法读一个配置文件 kettle.properties,这个文件主要记录kettle 运行时可以调用的一些环境变量, readProperties()方法读完这个文件之后就把里面的键值对转换成变量传给 kettle运行环境 ,当kettle 运行完了之后就调用shutdown() 方法结束转换。
  介绍重点类:KettleComponet
  KettleComponet 的方法主要有三种类型,一类是用来初始化工作,做一些验证工作,第二类是执行转换的方法,也是主要需要讨论的方法,第三类 是取得数据结果的,有时候你需要得到转换的结果交给下一个步骤处理。
  当读完了这些配置文件并且验证了之后, KettleComponet  就开始把前面读到的转换文件或者资源库类型变成Kettle 的API 这主要是在 executeAction()方法里面进行,它当然根据连接方式也分两种执行类型: 文本执行方式和 资源库连接方式。
  文本执行方式需要接受一个你指定的运行转换的文件或者job 的文件 然后把这个 xml文件解析成kettle 能够执行的模式,
根据执行的类型又可以分成两种: trans任务和job 任务。
  两个执行的逻辑差不多,下面先介绍 trans的执行方式:
执行trans 任务
transMeta = new TransMeta(fileAddress,repository,true);
transMeta.setFilename(fileAddress);
    然后他会调用:
executeTransformation(TransMeta transMeta, LogWriter logWriter); 这个方法是真正的把前面的transMeta转换成trans对象。
  连接资源库使用的是connectToRepository() 方法 ,先取得RepositoriesMeta 对象,然后根据你在 setting.xml文件里面定义的respository 的名字来连接对应的repository。 理论上来说我们一般都只使用一个repository 但如果在产品中需要使用多个 repository的话,你需要自己配置多个repository 的名字和对应的用户名和密码。
  连接到资源库之后自然是想办法读取数据库的表,把里面的记录转换成为trans 对象,使用的是loadTransformFromRepository, 这个方法的函数原型需要解释一下:
TransMetaloadformFormRepository(String directoryName, String transformationName, Repository repository, LogWriter logWriter)  第一个参数String directoryName代表是你存储转换的目录,当你使用kettle图形界面的时候,点击repository菜单的explorer repository,你会发现你所有的东西都是存储在一个虚拟的类似与目录结构的地方,其中包括database connections,transformations,job,usres等,所以你需要的是指定你连接的目录位置,你也可以在目录里在创建目录;
String transformationName指的是转换的名字,Repository repository指的是连接的资源库,LogWriter logWriter 指定的是日志输出。
  从资源库读取Job跟Trans的步骤基本是一样的,同样需要指定你存储job的目录位置。
示例代码如下:
注:此简化代码为以文本文件连接方式时的转换数据方式:
Public static void runTransformation(String filename){
try{
StepLoader.init();
EnvUtil.environmentInit();
TransMeta transMeta = new TransMeta(filename);
Trans trans = new Trans(transMeta);
trans.execute(null);//you can pass arguments instead of null
trans.waitUntilFinished();
if(trans.getErrors()>0){
throw new RuntimeException("There were errors during transformation execution");
}
}catch(KettleException e){
e.printStack();
}
}


鲜花
2

握手

雷人

路过

鸡蛋

刚表态过的朋友 (2 人)

Pentaho 技术支持电话: 13716483677 (Jason)       Pentaho 技术支持QQ:2253715

联系邮箱|Archiver|Pentaho中国爱好者社区 ( 京ICP备12007697号-2 )

GMT+8, 2017-11-25 04:06 , Processed in 0.025565 second(s), 11 queries .

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部