在百万条数据转换中,如何确保每行数据都完整无误?
摘要:Kettle 的错误处理机制:百万条数据转换下的“一行都不能少” 在处理海量数据(例如从 SQL Server 到达梦数据库的迁移)任务中,我们面临一个经典而棘手的问题:如果过程中有一条数据失败,整个任务会怎样?是全部失败还是部分失败?本文
Kettle 的错误处理机制:百万条数据转换下的“一行都不能少”
在处理海量数据(例如从 SQL Server 到达梦数据库的迁移)任务中,我们面临一个经典而棘手的问题:如果过程中有一条数据失败,整个任务会怎样?是全部失败还是部分失败?本文将从理解Kettle的事务机制开始,一步步构建健壮的、能够自动捕获并处理错误的 ETL 流程,确保数据转换任务“不会失败”。
一、背景
在日常的数据工作中,有的时候会遇到大规模的数据同步或迁移需求。最近生态的项目在使用 ETL 的过程中,一位同事问了我一个具体的场景任务:将一张包含 50 万条记录的表从源数据库表完整地迁移到目标数据库,若中间数据传输过程中出现错误,数据是全失败还是部分失败?
这个问题确实很重要,关乎数据的完整性和一致性。如果在传输过程中,第 25 万条数据因为某种原因失败了,是已经成功传输的 249,999 条数据会回滚,还是整个转换中断,留下一部分已入库的数据?
带着这个疑问开启对 Kettle 错误处理机制的探索学习。
二、事务的“黑盒”,Kettle默认如何处理失败?
Kettle 中“表输出”(Table Output)步骤的事务处理逻辑的行为主要由提交记录数量配置决定。
1. 核心控制器:“提交记录数量”(Commit size)
这是“表输出”步骤中最核心的性能与事务控制选项。它定义了 Kettle 每处理多少条数据就向目标数据库执行一次COMMIT(提交)。
分批提交(默认行为)
如果将此值设为 5000,Kettle 会每处理 5000 行就提交一次。若在第7001行出错,那么前5000行数据已经安全入库,包含错误行的第 5001-10000 行这个批次将失败回滚,整个转换停止。最终,数据库中会多出5000行“不完整”的数据。
“All-or-Nothing”模式
如果将此值设为 0,Kettle 会将所有百万条记录视为一个巨大的事务,仅在全部成功后才执行唯一的一次 COMMIT。这种模式下,任何一行数据失败都会导致整个事务回滚,实现了“要么全部成功,要么全部失败”。
⚠注意: 对于海量数据,此设置会给数据库带来巨大的事务日志压力和长时间的表锁定,性能极差且风险高,生产环境强烈不推荐。
三、从被动接受到主动捕获:配置步骤级错误处理
无论是留下部分数据还是全部回滚,其实都不是理想的方案。我们更希望的是:让正确的数据继续传输,同时将出错的数据和错误原因精确地捕获下来,以供后续分析。
这时候就需要使用 Kettle 的错误处理机制了。
1. 如何配置?
在需要捕获错误的步骤上(如我们的“表输出”),右键点击并选择 “定义错误处理”。
在弹出的“步骤错误处理设置”窗口中,我们可以进行详细配置:
目标步骤 (Target step): 最核心的选项。指定错误数据流要发送到哪个目标步骤(如一个“文本文件输出”或另一个日志表)。
启用错误处理? (Enable error handling?): 必须勾选的总开关。
错误数列名 (Number of errors field name): 自动增加一个新字段,用来存放这条数据上发现的错误数量(通常是1)。您需要为这个新字段命名。
错误描述列名 (Error description field name): 自动增加一个新字段,用来存放具体的错误文字描述。这是最有用的字段之一。
错误列的列名 (Error fields field name): 自动增加一个新字段,用来存放导致错误的字段(列)的名称。
错误编码列名 (Error codes field name): 自动增加一个新字段,用来存放 Kettle 内部或数据库返回的错误代码。
阈值控制:
允许的最大错误数/百分比: 设置一个上限,当错误超过此限制时,停止整个转换,防止意外的大量数据问题。错误数是设置具体的字段,错误百分比设置的是百分比,即当错误行数占总处理行数的百分比超过这个值时,转换失败。可不填。
在计算百分比前最少要读入的行数:这个是配合“最大错误百分比”使用的,防止在处理初期因为基数太小而导致转换过早失败。假设设置了最大错误百分比为10%,如果不在乎这个值,处理头两行就错了一行,错误率50%,转换就停了。如果这里设置为 1000,那么Kettle会至少处理1000行之后,才开始计算错误率是否超过了10%。
四、实战疑难排解:当“目标步骤”下拉框为空时
实践中立刻遇到了第一个问题:根据步骤,在画布上放置了一个用于接收错误的“文本文件输出”节点后,再次打开“定义错误处理”对话框,“目标步骤”的下拉框依然是空的。
