Kettle——表输出步骤异常处理方式探究

开源ETL工具Kettle transformation中的多数步骤都是支持定义错误处理的。为了保证transformation脚本的健壮性,我们会在关键的步骤上进行异常捕获处理。

本篇文章以TableOutput步骤来探究kettle异常处理的方式。

1 测试环境

Kettle 版本 5.0
数据库 Oracle 11g R2

2 普通方式处理步骤异常

TableOutput步骤输出数据到数据库时,因数据库约束检查等原因造成数据无法正常入库。这时TableOutput步骤若是没有定义错误处理的话,transformation转换报出异常并且停止进行运行。

为了保证程序的正常运行,我们在transformation转换中TableOutput步骤中定义错误处理。

2.1 简单处理

如下图2-1所示,是一个简单的异常处理方式,仅仅在TableOutput上启用异常处理。这种方式只是跳过的了异常数据,并没有捕获异常数据并持久化保存到硬盘或数据库。因而无法分析数据异常原因,只是保证了程序的正常运行。

2.2 改进方式

如下图2-2所示,是在简单处理方式基础上改进一种的异常处理方式,在TableOutput步骤上启用异常处理并在异常处理中添加异常描述列ERROR_INFO(自己定义的列名),在利用一个TableOutput步骤将业务数据和异常信息数据持久化到数据库表中。这种方式不仅有简单处理方式的异常处理功能,而且有捕获异常数据并持久化保存到硬盘或数据库。我们可以进行异常数据表信息分析数据入库失败原因,来提高数据质量。

3 封装异常信息方式处理异常

第2章节中叙述的步骤异常处理的方式不是一个很好的通用处理方式,在处理如下场景时,比较繁琐。

数据来源通过SQL多表关联计算得来的数据要使用tableOutput步骤保存到数据表时的异常处理:
1)如果只是通过统一异常表保存输出数据表名和异常信息,这种没有保存数据源数据,无法快速查看业务数据中不合法数据;

2)如果异常数据都保存到每个表相对应的异常信息表且异常信息表中保存数据源数据是可以的。但这种方式就涉及到每一个转变transformation中的TableOutput步骤的异常处理的表输出步骤都需要字段映射,数据源中字段变化,需要重新映射,处理起来比较繁琐。

针对上述情况,进行改进通过一个异常信息表保存所有transformation的tableOutput异常处理。这种处理方式是通过利用Java class步骤编写代码实现统一将异常数据流信息(保存数据源所有字段)封装成JSON格式的数据,保存到统一的异常信息表中。具体实现如下图3-1所示:

4 批量入库造成部分正常数据丢失的处理


作者 @zokaper
2016 年 01 月 17日

2017/11/19 13:04:56 - 输出.0 - ERROR (version 5.1.0.0, build 1 from 2014-06-19_19-02-57 by buildguy) : Unexpected batch update error committing the database connection. 2017/11/19 13:04:56 - 输出.0 - ERROR (version 5.1.0.0, build 1 from 2014-06-19_19-02-57 by buildguy) : org.pentaho.di.core.exception.KettleDatabaseBatchException: 2017/11/19 13:04:56 - 输出.0 - Error updating batch 2017/11/19 13:04:56 - 输出.0 - [jcc][t4][102][10040][4.19.66] 批处理出现故障。虽然已经提交了批处理,但是该批处理的某个成员至少发生了一个异常。 2017/11/19 13:04:56 - 输出.0 - 使用 getNextException() 来检索已经过批处理的特定元素的异常。 ERRORCODE=-4229, SQLSTATE=null 2017/11/19 13:04:56 - 输出.0 - 2017/11/19 13:04:56 - 输出.0 - at org.pentaho.di.core.database.Database.createKettleDatabaseBatchException(Database.java:1365) 2017/11/19 13:04:56 - 输出.0 - at org.pentaho.di.core.database.Database.emptyAndCommit(Database.java:1354) 2017/11/19 13:04:56 - 输出.0 - at org.pentaho.di.trans.steps.tableoutput.TableOutput.dispose(TableOutput.java:571) 2017/11/19 13:04:56 - 输出.0 - at org.pentaho.di.trans.step.RunThread.run(RunThread.java:96) 2017/11/19 13:04:56 - 输出.0 - at java.lang.Thread.run(Thread.java:745) 2017/11/19 13:04:56 - 输出.0 - Caused by: com.ibm.db2.jcc.am.BatchUpdateException: [jcc][t4][102][10040][4.19.66] 批处理出现故障。虽然已经提交了批处理,但是该批处理的某个成员至少发生了一个异常。 2017/11/19 13:04:56 - 输出.0 - 使用 getNextException() 来检索已经过批处理的特定元素的异常。 ERRORCODE=-4229, SQLSTATE=null 2017/11/19 13:04:56 - 输出.0 - at com.ibm.db2.jcc.am.kd.a(kd.java:475) 2017/11/19 13:04:56 - 输出.0 - at com.ibm.db2.jcc.am.Agent.endBatchedReadChain(Agent.java:414) 2017/11/19 13:04:56 - 输出.0 - at com.ibm.db2.jcc.am.gp.a(gp.java:5342) 2017/11/19 13:04:56 - 输出.0 - at com.ibm.db2.jcc.am.gp.c(gp.java:4929) 2017/11/19 13:04:56 - 输出.0 - at com.ibm.db2.jcc.am.gp.executeBatch(gp.java:3045) 2017/11/19 13:04:56 - 输出.0 - at org.pentaho.di.core.database.Database.emptyAndCommit(Database.java:1341) 2017/11/19 13:04:56 - 输出.0 - ... 3 more 2017/11/19 13:04:57 - 输出.0 - 完成处理 (I=0, O=0, R=153, W=0, U=0, E=1 2017/11/19 13:04:57 - mtrl_sum - ERROR (version 5.1.0.0, build 1 from 2014-06-19_19-02-57 by buildguy) : 错误被检测到! 2017/11/19 13:04:57 - Spoon - 转换完成!! 2017/11/19 13:04:57 - mtrl_sum - ERROR (version 5.1.0.0, build 1 from 2014-06-19_19-02-57 by buildguy) : 错误被检测到! 2017/11/19 13:04:57 - mtrl_sum - ERROR (version 5.1.0.0, build 1 from 2014-06-19_19-02-57 by buildguy) : 错误被检测到!
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页