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推荐