`

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测试,

ETL运行日志测试.zip

发现,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修改的代码,至于其它版本,同学们可以自己动手。

  • 大小: 6.9 KB
  • 大小: 78.3 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics