2017-12-07 2 views
1

실행할 ktr 파일을 kttle 파일로 보내는 Java 프로그램을 작성했습니다. java 프로그램은 데이터베이스에서 작업을로드하고 관련 ktr을 주전자로 전송하여 실행합니다. 내 문제는이 작업에 대한 주전자 전송 실행 결과를 정상적으로 가져 오는 방법을 알지 못하기 때문에 특정 작업으로 인해 전송 로그를 필터링하는 방법을 알지 못하기 때문입니다.java 응용 프로그램에 의해 실행되는 주전자 전송 실행 결과를 가져 오는 방법

현재 나의 해결책은 주전자 자체로 생성되는 데이터베이스 로그 테이블 중 하나 인 Ketlle Trans Log를 읽는 것입니다.

이 솔루션의 문제점은 모든 필드와 관련 데이터가 주전자에 의해 제공되므로 어떤 로그가 어떤 작업과 관련되어 있는지 알 수 없습니다. 그래서 나는 작업 ID로 transmeta에서 transname의 이름을 바꾸어야하고, 작업 id는 transname 필드의 Trans Log 테이블로 전달 될 것이다. 이 방법을 통해 작업 ID로 관련 로그 레코드를 얻을 수 있습니다.

private void startClusterTrans(String repoConnectStr, String transName, String taskId) throws PlatformException { 
    Repository repository = null; 
    TransMeta transMeta = null; 
    try { 
     repository = getKettleRepository(repoConnectStr); 

     // 1: find the trans to execute by transName 
     transMeta = findTransMeta(transName, repository); 

     // 2: set the trans name with task id 
     // later the taksId will be passed to transname field in the trans log table 
     transMeta.setName(taskId); 
     TransExecutionConfiguration transExecutionConfiguration = new TransExecutionConfiguration(); 
     transExecutionConfiguration.setLogLevel(LogLevel.BASIC); 
     transExecutionConfiguration.setExecutingClustered(true); 
     ... 
     transExecutionConfiguration.setVariables(transMeta); 

     Trans.executeClustered(transMeta, transExecutionConfiguration); 
    } catch (Throwable e) { 
     throw new PlatformException(e); 
    } 
} 

나는이 방법이 적절하지 않다고 생각합니다. 첫째, 나는 몇 초마다 데이터베이스를 스캔하고 데이터베이스 압력을 야기합니다. 둘째 trans가 클러스터 모드에서 실행되면 transname이 변경됩니다. 트랜스 실행 결과를 필터링하는 다른 일반적인 방법이 있는지

사람이 말해시겠습니까? trans가 로컬, 원격 및 클러스터 모드에서 실행될 때 결과를 가져 오는 방법이 동일하게되기를 바랍니다.

, 내 문제를 정교의 예를 들어 클러스터 모드를 취할 수 있도록합니다. 클러스터 모드에서 foo.ktr을 실행할 자바 작업 # 1001을 시작합니다. 이 상황에서는 1 명의 마스터와 2 명의 노예가 있습니다. 실행 후 트랜스 로그 테이블에 3 개의 레코드가 생성됩니다. 슬프게도 3 Trans 로그를 내 작업 # 1001에 연결하는 방법을 모르겠습니다.

이제는 클러스터에 foo.ktr을 보내기 전에 transmeta의 transname을 작업 # 1001로 변경하고 실행 후 trans 로그 테이블에있는 3 개의 trans 레코드에 대한 transname 필드가 다음과 같이 보입니다. 1001 (my-cluster-sth); 1001 (my-cluster : slave1); 1001 (my-cluster : slave2). 그래서 나는 "LIKE"키워드를 사용하여이 3 가지 레코드를 내 작업에 연결해야합니다. 나는 이것이 좋은 방법이라고 생각하지 않는다. 위에서 언급 한 두 가지 우려 사항이 있습니다.

+0

Trans 실행 결과는 무엇이라고합니까? 미리보기 열을 누를 때 나타나는 필드의 내용 일 수 있습니다. 그것은 또한 당신이 입출력 레코드의 수를 알려주는 스푼 바닥에 보이는 작은 테이블의 사본 일 수도 있습니다. – AlainD

+0

당신은 동적으로 (변환이 실행 중일 때) 또는 역사적으로 (야간 부하가 괜찮은지보기 위해 매일 아침) 필요합니까? – AlainD

+0

감사합니다. 실제로 실행중인 정보와 기록 된 정보가 모두 필요합니다. 숟가락 UI 하단의 로그는 데이터베이스에서도 찾을 수 있습니다. 하지만 내 문제는 내 자바 프로그램이 주전자에게 1 시간마다 동일한 전환을 실행하는 작업을 생성한다는 것입니다. Java 프로그램에 의해 생성 된 작업과 주전자에서 실행되는 작업간에 엄격한 매핑 관계가 없으므로 바쁜 밤과 다음날 아침에 작업이 성공적으로 실행되었다고 상상해보십시오. –

답변

0

http://jira.pentaho.com/browse/PDI-16549http://jira.pentaho.com/browse/PDI-10912을 부탁하십시오.

나는 당신이 목표로하는 것을 이해한다면, 가까운 미래에 당신은 변환이 수행 된 매개 변수의 값을 알아야 할 것입니다. 그래서, upvote도 http://jira.pentaho.com/browse/PDI-16550.

+0

감사합니다. AlainD, 나는 3 장의 티켓을주의 깊게 읽었으며 # PDI-16550이 해결책이 될 수는 있지만 여전히 내 문제에는 직선이 아님을 발견했습니다. 코멘트에 단어 길이 제한이 있다는 질문에 예제를 추가했습니다. –

관련 문제