开源ETL工具kettle系列之在应用程序中集成
副标题[/!--empirenews.page--]
摘要本文主要讨论如何在你自己的Java应用程序中集成Kettle 集成如果你需要在自己的Java应用程序中集成Kettle,一般来说有两种应用需求,一种是通过纯设计器来设计ETL转换任务,然后保存成某种格式,比如xml或者在数据库中都可以,然后自己调用程序解析这个格式,执行这种转换,是比较抽象的一种执行方式,ETL里面转换了什么东西我们并不关心,只关心它有没有正常执行。另一种是通过完全编程的方式来实现,详细的控制每一个步骤,需要知道转换执行的成功与否,这种方式可能需要更多的理解kettle的API 以便更好的跟你的应用程序紧密结合,不过难度也比较大,可以很好的定制你的应用程序,代价自然是入门门槛比较高。本文主要向你解释第一种Kettle的集成方式,文中所列出的代码节选自pentaho ,不过应用程序本身跟pentaho 没有什么关系。 KettleComponentKettleComponent的方法主要有三种类型,一类是用来初始化工作,做一些验证工作,第二类是执行转换的方法,也是主要需要讨论的方法,第三类是取得数据结果的,有时候你需要得到转换的结果交给下一个步骤处理.下面分别讨论这三类方法。 Boolean useRepository = PentahoSystem.getSystemSetting("kettle/settings.xml","repository.type","files").equals("rdbms"); PentahoSystem.getSystemSetting()方法只是返回一个字符串,使用的xpath读一个xml的对应字段,下面列出settings.xml文件: <kettle-repository> <!-- The values within <properties> are passed directly to the Kettle Pentaho components. --> <!-- This is the location of the Kettle repositories.xml file,leave empty if the default is used: $HOME/.kettle/repositories.xml --> <repositories.xml.file></repositories.xml.file> <repository.type>files</repository.type> <!-- The name of the repository to use --> <repository.name></repository.name> <repository.userid>admin</repository.userid> <repository.password>admin</repository.password> </kettle-repository> 可以看到其中的repositories.xml.file 上面的一段注释,如果这个值为空会默认使用 执行转换当读完了这些配置文件并且验证了之后,KettleComponent就开始把前面读到的转换文件或者资源库类型变成Kettle的API,这主要是在executeAction()方法里面进行,它当然根据连接方式也分两种执行类型: 文本执行方式需要接受一个你指定的运行转换的文件或者Job的文件,然后把这个xml文件解析成Kettle能够执行的模式, 执行Trans任务 transMeta = new TransMeta(fileAddress,repository,true); transMeta.setFilename(fileAddress); 然后它会调用: Trans trans = new Trans(logWriter,transMeta); List stepList = trans.getSteps(); for (int stepNo = 0; stepNo < stepList.size(); stepNo++) { StepMetaDataCombi step = (StepMetaDataCombi) stepList.get(stepNo); if (step.stepname.equals(stepName)) { Row row = transMeta.getStepFields(stepName); // create the metadata that the Pentaho result set needs String fieldNames[] = row.getFieldNames(); String columns[][] = new String[1][fieldNames.length]; for (int column = 0; column < fieldNames.length; column++) { columns[0][column] = fieldNames[column]; } MemoryMetaData metaData = new MemoryMetaData(columns,null); results = new MemoryResultSet(metaData); // add ourself as a row listener step.step.addRowListener(this); foundStep = true; break; } }
执行Job任务执行Job任务之前还是会读取Job任务的描述文件,然后把这个描述文件(kettle的 .ktr文件)变成一个xml文档的dom : org.w3c.dom.Document doc = XmlW3CHelper.getDomFromString(jobXmlStr); 之后也是初始化对应的元数据对象 job.start(); job.waitUntilFinished(5000000); 连接资源库连接资源库使用的是connectToRepository()方法,先取得RepositoriesMeta对象,然后根据你在setting.xml文件里面定义的repository的名字来连接对应的repository.理论上来说我们一般都只使用一个 repository,但如果在产品中需要使用多个repository的话,你需要自己配置多个repository的名字和对应的用户名和密码。只列出几行关键代码, repositoriesMeta = new RepositoriesMeta(logWriter); //从$HOME/.kettle/repositories.xml 读数据. repositoriesMeta.readData(); repositoryMeta = repositoriesMeta.findRepository(repositoryName); repository = new Repository(logWriter,repositoryMeta,userInfo); userInfo = new UserInfo(repository,username,password); 从资源库读取Trans TransMetaloadTransformFromRepository(String directoryName,String transformationName,Repository repository,LogWriter logWriter) (编辑:西安站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |