我已成功编写了一个java程序,将ktr文件发送到远程Kettle平台执行。 java程序将在数据库中加载任务并将相关的ktr发送到Kettle来执行。我的问题是我不知道如何优雅地获得此任务的Kettle Trans执行结果,因为我不知道如何通过某个任务过滤掉trans日志。
我目前的解决方案是阅读Ketlle Trans Log,这是由Kettle自己生成的数据库日志表之一。
此解决方案中的问题是因为所有字段和相关数据都是由Kettle提供的,我无法分辨哪个日志与哪个任务相关。因此,我必须使用任务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时,获取结果的方式是相同的。
为了详细说明我的问题,我们以集群模式为例。我启动一个java任务#1001,它将以集群模式执行foo.ktr。在这种情况下我有1个主人和2个奴隶。执行后,将在trans日志表中生成3条记录。可悲的是,我不知道如何将3个trans日志链接到我的任务#1001。
现在我的解决方法是在将foo.ktr发送到集群之前,我将transmeta的transname更改为task#1001,并且在执行之后,trans日志表中3个trans记录的transname字段将看起来像1001 (my-cluster-sth); 1001(my-cluster:slave1); 1001(my-cluster:slave2)。因此,我必须使用“LIKE”关键字将这3条记录链接到我的任务。我不认为这是一个好方法。上面提到了两个问题。
答案 0 :(得分:0)
请upvote http://jira.pentaho.com/browse/PDI-16549和http://jira.pentaho.com/browse/PDI-10912。
如果我确实理解了您的目标,那么在可预见的将来,您需要知道运行转换的参数值。所以,upvote也http://jira.pentaho.com/browse/PDI-16550。