job kettle 执行多次_踩坑经历(十二)记一次kettle定时任务延迟执行的排错过程...

生产现场

场景

kettle的.sh批量执行文件内包含了a.job和b.job,a.job在b.job前面

问题

生产环境下设置的晚上4点执行kettle的b.job作业,4点没有执行白天12点多执行

排查过程

1.生产环境查看linux的定时命令

没有错误

2.从生产环境拿到kettle执行日志

1.查找b.job的kettle执行日志,发现每天中午执行,且没有报错

2.查找a.job的kettle执行日志,发现报错,且执行时间在中午

3.查看kettle日志执行时间,job是否是线性执行(按顺序执行)

通过查看日志确定job是线性执行

4.问题定位

a.job执行出错,导致长时间执行12点多结束,此时b.job开始执行

5.问题继续

查看a.job支持报错日志

Truncated incorrect DOUBLE value: '006a97d8d813420398b08fc890a78084'

6. 二次定位问题

存在两种情况发生这种问题:① 赋值的时候,类型无法匹配;②where条件比较的时候类型无法匹配

7.比对数据库赋值字段类型

没有问题

8.确定问题

where条件比较的时候有问题,对比发现id赋值的时候,将int值和varchar比较,导致无法匹配发生错乱

9.问题解决

以业务库为准,修改存储过程id值字段类型,修改存储过程id值字段类型

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过Java程序调用Kettle的API来向Job和Transformation传递参数。以下是一个示例代码: ```java import org.pentaho.di.core.KettleEnvironment; import org.pentaho.di.core.exception.KettleException; import org.pentaho.di.core.variables.Variables; import org.pentaho.di.repository.Repository; import org.pentaho.di.repository.RepositoryDirectoryInterface; import org.pentaho.di.repository.kdr.KettleDatabaseRepository; import org.pentaho.di.trans.Trans; import org.pentaho.di.trans.TransMeta; import org.pentaho.di.trans.TransParameterCodec; import java.util.HashMap; import java.util.Map; public class KettleJobCaller { public static void main(String[] args) throws KettleException { KettleEnvironment.init(); String repositoryName = "MyRepository"; String username = "admin"; String password = "password"; String jobName = "MyJob"; String transformationName = "MyTransformation"; String[] parameters = new String[]{"param1=value1", "param2=value2"}; Repository repository = new KettleDatabaseRepository(); repository.init(repositoryName, username, password); RepositoryDirectoryInterface directory = repository.loadRepositoryDirectoryTree().findDirectory("/my/directory"); Variables variables = new Variables(); variables.setParameters(parameters); TransMeta transMeta = repository.loadTransformation(transformationName, directory, variables, null); Trans trans = new Trans(transMeta); trans.execute(null); String[] encodedParameters = TransParameterCodec.encodeParams(parameters); Map<String, String> paramMap = new HashMap<>(); for (String encodedParameter : encodedParameters) { String[] split = encodedParameter.split("="); paramMap.put(split[0], split[1]); } JobMeta jobMeta = repository.loadJob(jobName, directory, variables, null); Job job = new Job(repository, jobMeta, variables); job.setVariables(variables); job.setParams(paramMap); job.start(); job.waitUntilFinished(); } } ``` 在上面的示例代码中,我们首先初始化Kettle的环境,然后指定仓库名称、用户名、密码、Job名称和Transformation名称。接下来,我们将要传递的参数存储在一个字符串数组中,并将它们传递给Transformation和Job。在传递参数时,我们需要使用变量来存储它们。 最后,我们使用Kettle的API来加载Transformation和Job,并将参数传递给它们。注意,我们需要使用TransParameterCodec来编码和解码参数。 这就是如何使用Java调用Kettle Job并传递参数的示例代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值