假设我有10条记录,其中一些是损坏的记录,那么spring将如何处理重启。
示例假设记录号。 3及7是腐败的,他们去不同的减速器然后弹簧将如何处理重启 1.它将保持队列以跟踪它上次失败的位置。 2.我们可以用不同的方式解决这个问题
答案 0 :(得分:0)
SpringBatch将完全按照你告诉SpringBatch做的。
重新启动SpringBatch意味着使用相同的输入参数集运行失败的相同作业。但是,将创建此作业的新实例(执行)。
作业将在相同数据集上运行,以便运行失败的作业实例。 通常,修改作业的输入数据集并不是一个好主意 - MapReduce作业的输入数据必须是不可变的(我假设您不会修改用作输入的相同数据集)。
在您的情况下,除非您在SpringBatch作业的最后一步中添加了一个非常具体的逻辑,否则作业可能会以BatchStatus.COMPLETED
完成。
最后一步将验证所有记录,如果人工检测到任何损坏的记录,则会将作业状态设置为BatchStatus.FAILED
,如下所示:
jobExecution.setStatus(BatchStatus.FAILED)
现在如何重新开始这项工作是一个很好的问题,我会在几分钟后回答。 但是,在重新提出问题之前,您需要问的是:如果您的MapReduce作业的输入数据集和MapReduce作业的代码没有改变,那么restrt将如何帮助您?
我认为您需要使用某种数据集来转储原始MapReduce作业无法处理的所有错误记录。比如何处理这些破碎的记录是由你来决定的。
无论如何,一旦你知道失败jobExecution
的ID是什么,重启SpringBatch作业很容易。以下是代码:
final Long restartId = jobOperator.restart(failedJobId);
final JobExecution restartExecution = jobExplorer.getJobExecution(restartId);
修改强>
阅读ItemReader, ItemWriter and ItemProcessor接口
我认为您可以使用CompositeItemProcessor来实现跟踪。
在Hadoop中,文件中的每个记录都必须具有唯一的ID。所以,我认为您可以在作业上下文中存储坏记录的ID列表。更新您在首次开始作业时创建的JobParameter
,将其称为badRecordsList
。现在,当您重新启动/恢复工作时,您将读取badRecordsList
的值并将有参考。