假设我有 10 条记录,其中一些是损坏的记录,那么 spring 将如何处理重启。
示例假设记录号。 3 和 7 已损坏,它们转到不同的 reducer ,然后 spring 将如何处理重启
1.它将如何维护队列以跟踪上次失败的位置。
2.我们可以解决这个问题的不同方法是什么
最佳答案
SpringBatch 将完全按照您告诉 SpringBatch 执行的操作。
重新启动 SpringBatch 意味着使用相同的输入参数集运行失败的相同作业。但是,将创建此作业的新实例(执行)。
该作业将在 上运行相同的数据集作业的失败实例继续运行。
一般来说,为您的作业修改输入数据集不是一个好主意 - MapReduce 作业的输入数据必须是不可变的(我假设您不会修改用作输入的相同数据集)。
在您的情况下,这项工作可能会通过 BatchStatus.COMPLETED
完成。除非你在 中加入了非常具体的逻辑。最后一步你的 SpringBatch 工作。
最后一步将验证所有记录,如果人为检测到任何损坏的记录,则将作业状态设置为 BatchStatus.FAILED
如下所示:
jobExecution.setStatus(BatchStatus.FAILED)
现在如何重新开始工作是一个很好的问题,我稍后会回答。
但是,在重新开始之前您需要问的问题是:如果您的 MapReduce 作业的输入数据集和您的 MapReduce 作业的代码没有改变,restrt 将如何帮助您?
我认为您需要有某种数据集来转储原始 MapReduce 作业未能处理的所有不良记录。而如何处理这些损坏的记录则由您决定。
无论如何,重启 SpringBatch 作业很容易,一旦你知道失败的 ID 是什么
jobExecution
.下面是代码:final Long restartId = jobOperator.restart(failedJobId);
final JobExecution restartExecution = jobExplorer.getJobExecution(restartId);
编辑
阅读 ItemReader, ItemWriter and ItemProcessor接口(interface)
我认为您可以使用 CompositeItemProcessor 实现跟踪.
在 Hadoop 中,文件中的每条记录都必须具有唯一的 ID。因此,我认为您可以将不良记录的 ID 列表存储在 Job 上下文中。更新
JobParameter
您将在第一次开始作业时创建,将其命名为 badRecordsList
.现在,当您重新启动/恢复您的工作时,您将读取 badRecordsList
的值并且会有引用。
关于java - Spring Batch Restart 逻辑如何在 hadoop 作业上工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40036360/