Kettle运行日志记录
原创文章,转载请注明出处:http://qq85609655.iteye.com/blog/2173882
在kettle.properties中,可以定义参数
KETTLE_JOB_LOG_DB=dw1 KETTLE_JOB_LOG_TABLE=bi_etl_job_log_table KETTLE_TRANS_LOG_DB=dw1 KETTLE_TRANS_LOG_TABLE=bi_etl_trans_log_table
来全局设置,记录kettle的job和trans日志,
记录日志,会进行锁表,在kettle作业非常多的情况下,容易造成表锁,以及队列等待job日志记录的情况严重影响效率。以及作业的调度。
在trans下有个步骤Set Variables,用于设定变量。
写了个job测试了下,发现,trans日志能够正常记录,但是job日志无法记录。
很纳闷,百思不得其解。想不通,以为是版本的问题,更新到最新版本pdi-ce-5.2.0.0-209,问题依旧。
难道,Kettle的设计Set Variables设置变量,其变量只能用于trans,无法用于job吗?
难道需要每个job都要如上的去进行手动设置嘛,太麻烦了,不想这么搞。
打开Eclipse,查看Kettle源码,跟踪了半天,发现了具体的原因,不知道是不是kettle的Bug,还是因为其使用的思想,修改下源代码,测试了下问题搞定。
我使用的kettle 4.4的版本,需要修改类JobEntryJob.java的方法
public JobMeta getJobMeta(Repository rep, VariableSpace space) throws KettleException { JobMeta jobMeta = null; try { switch(specificationMethod) { case FILENAME: jobMeta = new JobMeta((space != null ? space.environmentSubstitute(getFilename()) : getFilename()), rep, null); break; case REPOSITORY_BY_NAME: if (rep != null) { String realDirectory = environmentSubstitute(getDirectory()); RepositoryDirectoryInterface repositoryDirectory = rep.loadRepositoryDirectoryTree().findDirectory(realDirectory); if (repositoryDirectory==null) { throw new KettleException("Unable to find repository directory ["+Const.NVL(realDirectory, "")+"]"); } jobMeta = rep.loadJob((space != null ? space.environmentSubstitute(getJobName()) : getJobName()), repositoryDirectory, null, null); // reads } else { throw new KettleException("Could not execute job specified in a repository since we're not connected to one"); } break; case REPOSITORY_BY_REFERENCE: if (rep != null) { // Load the last version... // jobMeta = rep.loadJob(jobObjectId, null); } else { throw new KettleException("Could not execute job specified in a repository since we're not connected to one"); } break; default: throw new KettleException("The specified object location specification method '"+specificationMethod+"' is not yet supported in this job entry."); } if (jobMeta != null) { jobMeta.setRepository(rep); jobMeta.copyVariablesFrom(this); } return jobMeta; } catch (Exception e) { throw new KettleException("Unexpected error during job metadata load", e); } }
主要添加了代码jobMeta.copyVariablesFrom(this);用于设定添加上个步骤的Set Variables里的变量。
重新运行job,搞定
以后,就可以将每个大job,复杂的job运行日志记录到单独的表中。方面查看job运行情况。
将重新编译后的JobEntryJob.class重新打包到kettle-engine.jar中,Ok!
如果遇到同学刚好使用4.4版本的同学,可以直接将附件中的 JobEntryJob.class.zip解压后,替换kettle-engine.jar中相应的类。
特别提醒,Kettle 5.x版本和Kettle 4.x版本,变化较大,需要根据实际类的方法进行修改。这里,我只贴了Kettle 4.4修改的代码,至于其它版本,同学们可以自己动手。
-
本文附件下载:
- ETL运行日志测试.zip (13.2 KB)
- JobEntryJob.class.zip (15.6 KB)
已有 0 人发表留言,猛击->> 这里<<-参与讨论
ITeye推荐