Kettle実行ログ記録

4602 ワード

オリジナル文章、転載は出典を明記してください.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の下に変数を設定するステップがあります.
jobテストを書きました.
ETL運行ログテスト.zip
Transログは正常に記録できますが、jobログは記録できません.
Kettle运行日志记录_第1张图片
合点がいかない.納得がいかないです.バージョンの問題だと思って、最新バージョンのpdi-ce-5.2.0-209に更新しました.問題は相変わらずです.
まさか、Kettleの設計Set Varablesは変数を設定します.その変数は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.co pyVarables Fromを追加しました.前のステップを追加するSet Varablesの変数を設定します.
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の修正コードだけを貼りました.他のバージョンについては、学生たちが自分で着手できます.