Spring Batch Restart逻辑如何在hadoop作业上运行?

时间:2016-10-14 06:28:50

标签: java spring hadoop spring-boot spring-batch

假设我有10条记录,其中一些是损坏的记录,那么spring将如何处理重启。

示例假设记录号。 3及7是腐败的,他们去不同的减速器然后弹簧将如何处理重启 1.它将保持队列以跟踪它上次失败的位置。 2.我们可以用不同的方式解决这个问题

1 个答案:

答案 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的值并将有参考。